Как в цикле 1С обращаться к колонкам таблицы по динамическому имени?

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

При разработке алгоритмов в 1С часто возникает задача обойти набор однотипных колонок в строке таблицы значений или табличной части документа. Например, когда в таблице создана серия полей с одинаковым префиксом и порядковым номером: К1, К2, ..., К30. Обращаться к каждому полю вручную через точку (ТекСтрока.К1, ТекСтрока.К2) неэффективно, поэтому рассмотрим, как организовать динамический доступ к колонкам в цикле.

Способ 1. Динамическое обращение по вычисляемому строковому имени

В платформе 1С:Предприятие строка таблицы (СтрокаТаблицыЗначений, СтрокаТабличнойЧасти или ДанныеФормыЭлементКоллекции) поддерживает обращение к своим свойствам через оператор квадратных скобок []. Внутрь скобок можно передать строковую переменную, содержащую имя колонки.

Разберем базовый пример реализации цикла:


Для ТТ = 1 По 30 Цикл
    // Формируем имя колонки с отключением группировки разрядов
    ИмяКолонки = "К" + Формат(ТТ, "ЧГ=0");
    
    // Получаем текущее значение или перезаписываем его
    ЗначениеПоля = ТекСтрока[ИмяКолонки];
    
    // Запись нового значения выполняется аналогично:
    ТекСтрока[ИмяКолонки] = ЗначениеПоля * 2;
КонецЦикла;

Важная деталь: обратите внимание на использование функции Формат(ТТ, "ЧГ=0") (или функции XMLСтрока(ТТ)). При простом неявном сложении "К" + ТТ или вызове Строка(ТТ) для чисел 1000 и более платформа 1С автоматически подставляет неразрывный пробел в качестве разделителя групп разрядов (получится "К 1 000" вместо "К1000"). Это приведет к ошибке выполнения «Поле объекта не обнаружено». Параметр формата ЧГ=0 полностью отключает группировку разрядов и гарантирует правильное имя колонки.

Способ 2. Обращение к колонкам по числовому индексу

Если целевые колонки расположены в таблице строго друг за другом, можно обращаться к ячейкам строки не по строковому имени, а по порядковому номеру (индексу). Нумерация колонок в платформе начинается с 0.

Посмотрим на пример обхода по индексам:


// Пусть колонки с К1 по К30 занимают индексы с 0 по 29
Для ИндексКолонки = 0 По 29 Цикл
    ТекущееЗначение = ТекСтрока[ИндексКолонки];
    
    // Выполняем требуемые расчеты
    ТекСтрока[ИндексКолонки] = ТекущееЗначение + 10;
КонецЦикла;

Обращение по индексу работает быстрее строковой конкатенации, так как платформе не требуется выполнять поиск колонки по имени в хеш-таблице метаданных.

Способ 3. Универсальный перебор коллекции колонок таблицы

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

Разберем по шагам, как реализовать универсальный обход:

  1. Обходим коллекцию ТаблицаЗначений.Колонки в цикле Для Каждого.
  2. Проверяем, начинается ли имя текущей колонки с нужного префикса (например, с буквы «К»).
  3. Получаем значение ячейки в текущей строке по имени найденной колонки.

Для Каждого ТекКолонка Из ТаблицаЗначений.Колонки Цикл
    // Проверяем соответствие имени колонки заданному префиксу
    Если СтрНачинаетсяС(ТекКолонка.Имя, "К") Тогда
        ЗначениеЯчейки = ТекСтрока[ТекКолонка.Имя];
        
        // Обработка данных ячейки
    КонецЕсли;
КонецЦикла;

Безопасность выполнения: проверка наличия колонки

Если имя колонки формируется динамически и есть вероятность, что поле в таблице отсутствует, перед обращением следует проверить его существование с помощью метода Найти() коллекции колонок:


ИмяКолонки = "К" + Формат(ТТ, "ЧГ=0");

Если ТаблицаЗначений.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
    ТекСтрока[ИмяКолонки] = 100;
Иначе
    // Колонка отсутствует в структуре таблицы
КонецЕсли;

Особенности работы в тонком клиенте и на сервере

Проанализируем контекст выполнения кода:

  1. На сервере: Объект ТаблицаЗначений доступен в полном объеме. Все методы работы с коллекцией Колонки работают без ограничений.
  2. На тонком клиенте: Таблицы форм представлены объектом ДанныеФормыКоллекция, а их строки — типом ДанныеФормыЭлементКоллекции. Обращение через квадратные скобки по имени вида ЭлементКоллекции[ИмяСвойства] на клиенте полностью поддерживается. Однако для получения полной коллекции колонок таблицы формы при необходимости следует передавать данные на сервер или анализировать элементы формы.
← На главную