Как получить индекс элемента массива 1с
Перейти к содержимому

Как получить индекс элемента массива 1с

  • автор:

Как получить индекс элемента массива 1с

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Индекс находится за границами массива 1С 8.3

Анна Викулина

Протестируйте качество нашей работы — получите первую консультацию в подарок.

от 800 руб.

Подобные ошибки можно увидеть при отладке программ практически на любом языке программирования или на СУБД, где фигурируют коллекции значений. В данном случае речь идет об индексе как о счетчике элементов, например, массива. Если в вашем коде используются подобные типы данных, то есть вероятность встретить ошибку и нужно уметь ее решить.

Индекс находится за пределами массива 1С 8.3. Системное сообщение.

Суть и решение проблемы

Чаще всего можно увидеть такое сообщение об ошибке, когда в коде идет обращение к элементу массива по индексу. И в том случае, если программист не предусмотрел проверку на количество элементов в коллекции, 1С будет получать значения. И рано или поздно наступит момент, когда в массиве элементы кончатся, а 1С продолжит пытаться получить значение. В этом случае и вылетит сообщение о том, что индекс элемента массива 1С находится за пределами.

Для разработчиков хорошо, что 1С при сообщении об ошибке позволяет просмотреть, на какой строке кода совершилось недопустимое действие. По кнопке «Подробно» вы получите информацию о том, какая команда отработала с ошибкой, где и на какой строке. Посмотрим на пример кода, который точно приведет к подобной ошибке:

 МассивЗначений = Новый Массив; МассивЗначений.Добавить("1"); МассивЗначений.Добавить("2"); МассивЗначений.Добавить("3"); Индекс = 0; Пока Индекс  3 цикл Сообщить(МассивЗначений[Индекс]); Индекс = Индекс + 1; КонецЦикла; 

Здесь проблема заключается в том, что создается массив с тремя значениями. В цикле же перебираются 11 значений из массива, так как нумерация индексов элементов в коллекции начинается с 0. И данный код выведет пользователю только 3 значения, а на 4 – вызовет ошибку «Индекс за пределами массива 1С». Чтобы исправить это недоразумение, необходимо либо изменить цикл, либо добавить условие с проверкой количества элементов в массиве.

Следует отметить, что в массивах индексы играют важную роль. Помните, чтобы получить индекс массива 1С, достаточно узнать количество элементов специальным методом «Количество()» и вычесть 1. Используя их, можно добавлять значения в коллекцию, изменять их, получать значение конкретного элемента массива и удалять их.

Зная природу этой ошибки, можно сделать вывод о том, что необходимо быть очень осторожными при работе с коллекциями значений, особенно, если речь идет о типовых конфигурациях, где после небольшой правки неквалифицированным разработчиком может перестать работать абсолютно все.

  • Пользуйтесь услугами профессионалов;
  • Обязательно делайте резервные копии перед любым изменением;
  • Сделайте тестовую базу данных и тщательно проверяйте на ней все изменения.

Это три золотых правила, которые резко снизят количество подобных ошибок в конфигурации.

Как получить индекс элемента массива 1с

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Полный синтаксис (нажмите, чтобы раскрыть)

Массив

Описание:

Предназначен для доступа к элементам массива, его методам и конструктору.

Элементы коллекции: Произвольный

Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются значения элементов массива.

Возможно обращение к значению элемента посредством оператора [. ]. В качестве аргумента передается индекс значения (нумерация с 0).

Методы:

ВГраница () Получает наибольший индекс элемента массива.
Вставить ( Индекс , Значение ) Вставляет значение в массив по указанному индексу.
Добавить ( Значение ) Добавляет элемент в конец массива.
Количество () Получает количество элементов в массиве.
Найти ( Значение ) Выполняет поиск элемента в массиве. Если элемент найден, возвращается его индекс. Если элемент не найден, возвращается Неопределено.
Очистить () Удаляет все значения из массива.
Получить ( Индекс ) Получает значение по индексу. Работает аналогично оператору [].
Удалить ( Индекс ) Удаляет значение из массива по указанному индексу.
Установить ( Индекс , Значение ) Устанавливает значение по индексу. Работает аналогично оператору [].

Конструкторы:

Новый Массив ( ФиксированныйМассив ) На основании фиксированного массива.
Новый Массив ( КоличествоЭлементов1 , . , КоличествоЭлементовN ) По количеству элементов. Создает массив из указанного количества элементов. Если задано несколько параметров, то будет создан массив, элементами которого являются массивы (и так далее в зависимости от количества параметров). Фактически конструктор позволяет создать массивы массивов, которые могут являться аналогом многомерного массива.

Оглавление (нажмите, чтобы раскрыть)

  • Как создать массив (сразу нужного размера)
  • Как создать пустой массив (с последующим добавлением элементов)
  • Как обойти все элементы массива по индексу
  • Массив может содержать элементы различных типов: числа, строки и т.д.
  • Как передать массив в качестве параметра функции
  • Как вернуть массив в качестве результата работы функции
  • Ещё пример на передачу массива в качестве параметра процедуры
  • Как получить последний элемент массива
  • Использование многомерных массивов
  • Вставка, удаление и очистка массива
  • Как из обычного получить фиксированный (неизменяемый) массив
  • Скачать и выполнить эти примеры на компьютере
/// Как создать массив (сразу нужного размера) в 1с 8.3, 8.2 &НаКлиенте Процедура Пример1(Команда) // в массиве сразу 3 элемента Числа = Новый Массив(3); // инициализируем их значениями Числа[0] = 5; Числа[1] = Числа[0] * 2; // 10 Числа[2] = Числа[1] * 2; // 20 // выводим на печать Для Каждого ЭлементМассива из Числа Цикл Сообщить(ЭлементМассива); // 5 10 20 КонецЦикла; КонецПроцедуры /// Как создать пустой массив (с последующим добавлением /// элементов) в 1с 8.3, 8.2 &НаКлиенте Процедура Пример2(Команда) // в массиве 0 элементов Числа = Новый Массив; // добавляем последовательно три элемента Числа.Добавить(100); // (100) Числа.Добавить(300); // (100, 300) Числа.Добавить(500); // (100, 300, 500) // выводим на печать Для Каждого ЭлементМассива из Числа Цикл Сообщить(ЭлементМассива); // 100 300 500 КонецЦикла; КонецПроцедуры /// Как обойти все элементы массива по индексу в 1с 8.3, 8.2 &НаКлиенте Процедура Пример3(Команда) // инициализируем массив: (100, 300, 500) Числа = Новый Массив; Числа.Добавить(100); Числа.Добавить(300); Числа.Добавить(500); // пробегаемся от первого (с индексом 0) до последнего // элемента (с индексом Количество - 1). Для Индекс = 0 По Числа.Количество() - 1 Цикл Сообщить(Числа[Индекс]); КонецЦикла; КонецПроцедуры /// Массив может содержать элементы различных типов: числа, /// строки и т.д. &НаКлиенте Процедура Пример4(Команда) Значения = Новый Массив(4); Значения[0] = "HELP"; // ("HELP") Значения[1] = "ME"; // ("HELP", "ME") Значения[2] = "1C"; // ("HELP", "ME", "1C") Значения[3] = Формат(2013, "ЧГ=0"); // ("HELP", "ME", "1C", 2013) Для Каждого ЭлементМассива из Значения Цикл Сообщить(ЭлементМассива); // HELP ME 1C 2013 КонецЦикла; КонецПроцедуры /// Как передать массив в качестве параметра функции в 1с 8.3, 8.2 &НаКлиенте Функция Метод5(МассивПереданныйПоСсылке) МассивПереданныйПоСсылке[0] = 10; Возврат МассивПереданныйПоСсылке[0] * 2; КонецФункции &НаКлиенте Процедура Пример5(Команда) // инициализация массива из одного элемента: (13) Числа = Новый Массив(1); Числа[0] = 13; // значение первого элемента до вызова функции Сообщить(Числа[0]); // 13 // массив ВСЕГДА передается в функцию ПО ССЫЛКЕ, значит, // изменяя массив внутри функции, мы меняем его снаружи Сообщить(Метод5(Числа)); // 20 // значение первого элемента после вызова функции изменилось Сообщить(Числа[0]); // 10 КонецПроцедуры /// Как вернуть массив в качестве результата работы функции /// в 1с 8.3, 8.2 &НаКлиенте Функция Метод6() // инициализация массива (СПАСИБО, ВАМ) Слова = Новый Массив(2); Слова[0] = "СПАСИБО"; Слова[1] = "ВАМ"; Возврат Слова; КонецФункции &НаКлиенте Процедура Пример6(Команда) // инициализация переменной массивом, который возвращает и формирует // функция Метод6 Слова = Метод6(); // вывод на печать Для Каждого ЭлементМассива из Слова Цикл Сообщить(ЭлементМассива); // СПАСИБО ВАМ КонецЦикла; КонецПроцедуры /// Ещё пример на передачу массива в качестве параметра процедуры /// в 1с 8.3, 8.2 &НаКлиенте Процедура Метод7(МойМассив) Если МойМассив <> Неопределено И МойМассив.Количество() > 0 Тогда Сообщить(МойМассив[0]); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Пример7(Команда) // инициализация массива: (10, 20) Числа = Новый Массив(2); Числа[0] = 10; Числа[1] = 20; // печать первого элемента, переданного массива Метод7(Числа); // 10 Метод7(Неопределено); // ничего Метод7(Новый Массив); // ничего КонецПроцедуры /// Как получить последний элемент массива в 1с 8.3, 8.2 &НаКлиенте Процедура Пример8(Команда) // инициализация массива: ("Кошка", "Собака", "Пантера", "Тигр") Слова = Новый Массив; Слова.Добавить("Кошка"); Слова.Добавить("Собака"); Слова.Добавить("Пантера"); Слова.Добавить("Тигр"); Сообщить(Слова[Слова.Количество() - 1]); // Тигр КонецПроцедуры /// Использование многомерных массивов в 1с 8.3, 8.2 &НаКлиенте Процедура Пример9(Команда) // ( ( (), () ), ( (), () ), ( (), () ) ) Слова = Новый Массив(3, 2); // ( ( "Юрий", "Гагарин" ), ( (), () ), ( (), () ) ) Слова[0][0] = "Юрий"; Слова[0][1] = "Гагарин"; // ( ( "Юрий", "Гагарин" ), ( "Герман", "Титов" ), ( (), () ) ) Слова[1][0] = "Герман"; Слова[1][1] = "Титов"; // ( ( "Юрий", "Гагарин" ), ( "Герман", "Титов" ), // ( "Валентина", "Терешкова" ) ) Слова[2][0] = "Валентина"; Слова[2][1] = "Терешкова"; // обход всех элементов через конструкцию Для Каждого Для Каждого Строка Из Слова Цикл Для Каждого Элемент Из Строка Цикл Сообщить(Элемент); КонецЦикла; Сообщить(" "); КонецЦикла; Сообщить(" "); // обход всех элементов через индекс Для ИндексСтрока = 0 По Слова.Количество() - 1 Цикл Для ИндексСтолбец = 0 По Слова[ИндексСтрока].Количество() - 1 Цикл Сообщить(Слова[ИндексСтрока][ИндексСтолбец]); КонецЦикла; Сообщить(" "); КонецЦикла; КонецПроцедуры /// Вставка, удаление и очистка массива в 1с 8.3, 8.2 &НаКлиенте Процедура Пример10(Команда) // инициализация пустого массива Числа = Новый Массив; // вставка трёх элементов; каждый элемент вставляется в начало Числа.Вставить(0, 10); // (10) Числа.Вставить(0, 100); // (100, 10) Числа.Вставить(0, 1000); // (1000, 100, 10) // определение последнего индекса Сообщить(Числа.ВГраница()); // 2 // вывод на печать Для Индекс = 0 по Числа.ВГраница() Цикл Сообщить(Числа[Индекс]); // 1000 100 10 КонецЦикла; // удаление элемента со значением 100 // для этого сначала находим индекс элемента // если не находим возвращаем Неопределено Индекс = Числа.Найти(100); // 1 // и удаляем элемент по найденному индексу Числа.Удалить(Индекс); // (1000, 10) Сообщить(Числа.ВГраница()); // 1 // удаление всех элементов из массива Числа.Очистить(); КонецПроцедуры /// Как из обычного получить фиксированный (неизменяемый) /// массив в 1с 8.3, 8.2 &НаКлиенте Процедура Пример11(Команда) Числа = Новый Массив; Числа.Добавить(1); Числа.Добавить(2); Числа.Добавить(3); ФиксированныеЧисла = Новый ФиксированныйМассив(Числа); // Получился константный массив на основе обычного: // нельзя менять значения имеющихся элементов // нельзя добавлять новые элементы // нельзя удалять имеющиеся элементы КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере

Массивы в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Массив 1с. Описание и примеры использования

Массив — это программная коллекция (объект встроенного языка), содержащая пронумерованную последовательность значений произвольного типа. Каждому элементу присваивается последовательный целочисленный номер — индекс, начинающийся с нуля. По индексу можно получить или установить значение элемента массива.

В 1С:Предприятие 8 существует два типа массивов:

  • фиксированный массив — такой массив имеет фиксированный размер, заданный при его создании. Для фиксированного массива недоступно программное изменение размера, количества и последовательности элементов;
  • обычный массив — такой массив имеет динамический размер и его верхний предел практически неограничен. Таким массивом можно произвольно оперировать из встроенного языка;

Сейчас мы рассмотрим обычные массивы.

Создание и инициализация элементов массива

Создание пустого массива выполняется с помощью оператора Новый :

Массив = Новый Массив; 

Чтобы создать массив с заданным размером, можно воспользоваться конструктором массива. Например, так:

Массив = Новый Массив(3); 

Для добавления элементов в массив используется одноименный метод Массив.Добавить():

Массив.Добавить(10); Массив.Добавить(Дата(2018, 1, 1)); Массив.Добавить("Просто строка"); 

Каждый новый элемент помещается в конец массива.

Для доступа к отдельным элементам массива применяется операция разыменования: указывается имя переменной, объявленной как массив, а затем, в квадратных скобках, указывается индекс элемента: ИмяМассива[Индекс] . Такие конструкции можно указывать как слева от оператора присваивания:

Массив[0] = 10; Массив[1] = Дата(2018, 1, 1); Массив[2] = "Просто строка"; 

Так и справа: в выражениях и в качестве параметров процедур и функций:

Сообщить("Массив[0] color: red;">+ Массив[0]); 

Границы массивов

Как было сказано выше, левая граница массива постоянна и всегда равно нулю (0). Верхняя граница напрямую связана с количеством элементов в массиве. Получить ее можно двумя способами:

  • С использованием метода Массив.Количество() с последующим вычитанием 1;
  • С использованием одноименного метода Массив.ВГраница();

Давайте рассмотрим распространенные операции с массивами

Перебор элементов массива

Для перебора (обхода) всех элементов массива обычно используется оператор цикла Для :

Для Инд = 0 По Массив.ВГраница() Цикл Сообщить("Массив[" + Инд + "] color: red;">+ Массив[Инд]); КонецЦикла; 

Либо оператор цикла Для Каждого :

Для Каждого Элт Из Массив Цикл Сообщить("Массив[" + Массив.Найти(Элт) + "] color: red;">+ Элт); КонецЦикла; 

Первый способ лучше использовать, если Вам необходимо получить одновременно и индекс, и значение массива. Второй способ больше подходит для ситуации, когда нужно только последовательно перебрать все значения массива. Использование второго способа повышает «читабельность кода».

Поиск в массиве

Для поиска значений в массиве можно воспользоваться одноименным методом Массив.Найти(). Он возвращает индекс найденного элемента или Неопределено , если таковой не был найден:

НайдЭлт = Массив.Найти(10); Если НЕ НайдЭлт = Неопределено Тогда Сообщить("Массив[" + НайдЭлт + "] color: red;">+ Массив[НайдЭлт]) КонецЕсли; 

Методы объекта Массив

ВГраница() Возвращает старший индекс массива
Вставить() Добавляет значение в произвольное место массива
Добавить() Добавляет значение в конец массива
Количество() Возвращает количество элементов в массиве
Найти() Возвращает индекс значения в массиве
Очистить() Удаляет все элементы массива
Получить() Возвращает значение элемента массива по его индексу
Удалить() Удаляет значение из массива по его индексу
Установить() Устанавливает значение элемента массива

Читайте также:

  1. Как создавать двумерные и многомерные массивы?
  2. Как скопировать массив?
  3. Как отсортировать элементы массива?
  4. Как свернуть массив в строку?
  5. Как создать массив структур?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *