При работе с коллекциями и матрицами во встроенном языке 1С часто возникает вопрос: какой синтаксический способ обхода элементов предпочесть — классический цикл по числовым индексам или конструкцию Для каждого? Рассмотрим подробнее особенности создания многомерных массивов, сравним оба подхода, проанализируем нюансы модификации данных и правила именования переменных-итераторов.
В платформе 1С многомерный массив создается вызовом конструктора Новый Массив с передачей размеров измерений через запятую. Фактически платформа формирует массив массивов (ступенчатый массив). Разберем пример инициализации таблицы 3х2:
Матрица = Новый Массив(3, 2);
Матрица[0][0] = 1;
Матрица[0][1] = "Пн";
Матрица[1][0] = 2;
Матрица[1][1] = "Вт";
Матрица[2][0] = 3;
Матрица[2][1] = "Ср";
Для чтения и обработки значений в такой структуре применяются два основных подхода к организации циклов.
Посмотрим на пример с использованием циклов со счетчиком. В этом случае мы обращаемся к элементам коллекции по их порядковому номеру:
Для НомерСтроки = 0 По Матрица.Количество() - 1 Цикл
Для НомерКолонки = 0 По Матрица[НомерСтроки].Количество() - 1 Цикл
Сообщить(Матрица[НомерСтроки][НомерКолонки]);
КонецЦикла;
КонецЦикла;
Разберем важные нюансы этого подхода:
Массив.Количество() - 1 рекомендуется использовать встроенный метод ВГраница(). Метод возвращает индекс последнего элемента. Если массив пуст, ВГраница() вернет -1, и цикл Для Индекс = 0 По Массив.ВГраница() Цикл не выполнится ни разу, что защищает от ошибок без дополнительных проверок.Матрица[НомерСтроки][НомерКолонки] = НовоеЗначение.Теперь рассмотрим итерационный обход, когда платформа последовательно извлекает каждый вложенный элемент коллекции:
Для Каждого ТекущаяСтрока Из Матрица Цикл
Для Каждого ЭлементСтроки Из ТекущаяСтрока Цикл
Сообщить(ЭлементСтроки);
КонецЦикла;
КонецЦикла;
Проанализируем особенности и ограничения данного метода:
Для каждого переменная-итератор получает копию значения примитивного типа. Присвоение нового значения этой переменной внутри цикла никак не повлияет на сам массив.Для каждого запрещено добавлять или удалять элементы из обходимой коллекции, так как это нарушает работу внутреннего итератора платформы.При написании циклов критически важно соблюдать стандарты разработки 1С и избегать совпадения имен локальных переменных с ключевыми словами и системными функциями платформы:
Строка, Число, Дата или Массив, внутри области видимости этой процедуры будет заблокирован вызов одноименной глобальной функции преобразования типов (например, функции Строка(Значение)). Платформа отдаст приоритет локальной переменной.ТекСтрока, ТекущийЭлемент, ЭлементМассива, ИндексСтроки.Таким образом, для простого чтения данных оптимально использовать конструкцию Для каждого с корректными именами итераторов, а при необходимости изменять примитивные элементы или динамически удалять строки массива следует применять цикл по индексам с методом ВГраница().