Как правильно обходить многомерные массивы в 1С и в чем разница между циклом по индексу и циклом Для каждого

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с коллекциями и матрицами во встроенном языке 1С часто возникает вопрос: какой синтаксический способ обхода элементов предпочесть — классический цикл по числовым индексам или конструкцию Для каждого? Рассмотрим подробнее особенности создания многомерных массивов, сравним оба подхода, проанализируем нюансы модификации данных и правила именования переменных-итераторов.

Создание и структура многомерного массива в 1С

В платформе 1С многомерный массив создается вызовом конструктора Новый Массив с передачей размеров измерений через запятую. Фактически платформа формирует массив массивов (ступенчатый массив). Разберем пример инициализации таблицы 3х2:


Матрица = Новый Массив(3, 2);
Матрица[0][0] = 1;
Матрица[0][1] = "Пн";
Матрица[1][0] = 2;
Матрица[1][1] = "Вт";
Матрица[2][0] = 3;
Матрица[2][1] = "Ср";

Для чтения и обработки значений в такой структуре применяются два основных подхода к организации циклов.

Способ 1. Обход массива по числовым индексам

Посмотрим на пример с использованием циклов со счетчиком. В этом случае мы обращаемся к элементам коллекции по их порядковому номеру:


Для НомерСтроки = 0 По Матрица.Количество() - 1 Цикл
    Для НомерКолонки = 0 По Матрица[НомерСтроки].Количество() - 1 Цикл
        Сообщить(Матрица[НомерСтроки][НомерКолонки]);
    КонецЦикла;
КонецЦикла;

Разберем важные нюансы этого подхода:

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

Способ 2. Обход массива через конструкцию Для каждого

Теперь рассмотрим итерационный обход, когда платформа последовательно извлекает каждый вложенный элемент коллекции:


Для Каждого ТекущаяСтрока Из Матрица Цикл
    Для Каждого ЭлементСтроки Из ТекущаяСтрока Цикл
        Сообщить(ЭлементСтроки);
    КонецЦикла;
КонецЦикла;

Проанализируем особенности и ограничения данного метода:

  1. Читаемость и лаконичность: Код получается более компактным и понятным, так как нет необходимости управлять числовыми счетчиками и вычислять границы коллекций.
  2. Ограничение на изменение примитивов: В цикле Для каждого переменная-итератор получает копию значения примитивного типа. Присвоение нового значения этой переменной внутри цикла никак не повлияет на сам массив.
  3. Модификация объектов: Если элементами коллекции являются объекты или ссылочные типы (например, структуры или вложенные массивы), через переменную-итератор можно менять их внутренние свойства, но заменить сам объект в исходной коллекции нельзя.
  4. Запрет изменения структуры: Во время выполнения цикла Для каждого запрещено добавлять или удалять элементы из обходимой коллекции, так как это нарушает работу внутреннего итератора платформы.

Правила именования переменных-итераторов

При написании циклов критически важно соблюдать стандарты разработки 1С и избегать совпадения имен локальных переменных с ключевыми словами и системными функциями платформы:

  1. Перекрытие системных функций: Если назвать переменную именем Строка, Число, Дата или Массив, внутри области видимости этой процедуры будет заблокирован вызов одноименной глобальной функции преобразования типов (например, функции Строка(Значение)). Платформа отдаст приоритет локальной переменной.
  2. Подсветка синтаксиса и автодополнение: Использование системных имен приводит к некорректной работе механизма автодополнения и подсветки синтаксиса в среде разработки.
  3. Рекомендуемые имена: Для переменных-итераторов следует использовать понятные составные названия, отражающие суть данных: ТекСтрока, ТекущийЭлемент, ЭлементМассива, ИндексСтроки.

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

← На главную