При разработке алгоритмов в 1С часто возникает задача обойти набор однотипных колонок в строке таблицы значений или табличной части документа. Например, когда в таблице создана серия полей с одинаковым префиксом и порядковым номером: К1, К2, ..., К30. Обращаться к каждому полю вручную через точку (ТекСтрока.К1, ТекСтрока.К2) неэффективно, поэтому рассмотрим, как организовать динамический доступ к колонкам в цикле.
В платформе 1С:Предприятие строка таблицы (СтрокаТаблицыЗначений, СтрокаТабличнойЧасти или ДанныеФормыЭлементКоллекции) поддерживает обращение к своим свойствам через оператор квадратных скобок []. Внутрь скобок можно передать строковую переменную, содержащую имя колонки.
Разберем базовый пример реализации цикла:
Для ТТ = 1 По 30 Цикл
// Формируем имя колонки с отключением группировки разрядов
ИмяКолонки = "К" + Формат(ТТ, "ЧГ=0");
// Получаем текущее значение или перезаписываем его
ЗначениеПоля = ТекСтрока[ИмяКолонки];
// Запись нового значения выполняется аналогично:
ТекСтрока[ИмяКолонки] = ЗначениеПоля * 2;
КонецЦикла;
Важная деталь: обратите внимание на использование функции Формат(ТТ, "ЧГ=0") (или функции XMLСтрока(ТТ)). При простом неявном сложении "К" + ТТ или вызове Строка(ТТ) для чисел 1000 и более платформа 1С автоматически подставляет неразрывный пробел в качестве разделителя групп разрядов (получится "К 1 000" вместо "К1000"). Это приведет к ошибке выполнения «Поле объекта не обнаружено». Параметр формата ЧГ=0 полностью отключает группировку разрядов и гарантирует правильное имя колонки.
Если целевые колонки расположены в таблице строго друг за другом, можно обращаться к ячейкам строки не по строковому имени, а по порядковому номеру (индексу). Нумерация колонок в платформе начинается с 0.
Посмотрим на пример обхода по индексам:
// Пусть колонки с К1 по К30 занимают индексы с 0 по 29
Для ИндексКолонки = 0 По 29 Цикл
ТекущееЗначение = ТекСтрока[ИндексКолонки];
// Выполняем требуемые расчеты
ТекСтрока[ИндексКолонки] = ТекущееЗначение + 10;
КонецЦикла;
Обращение по индексу работает быстрее строковой конкатенации, так как платформе не требуется выполнять поиск колонки по имени в хеш-таблице метаданных.
Бывают ситуации, когда точное количество колонок заранее неизвестно либо их номера идут не строго по порядку. В этом случае надежнее выполнить перебор метаданных колонок самой таблицы.
Разберем по шагам, как реализовать универсальный обход:
ТаблицаЗначений.Колонки в цикле Для Каждого.
Для Каждого ТекКолонка Из ТаблицаЗначений.Колонки Цикл
// Проверяем соответствие имени колонки заданному префиксу
Если СтрНачинаетсяС(ТекКолонка.Имя, "К") Тогда
ЗначениеЯчейки = ТекСтрока[ТекКолонка.Имя];
// Обработка данных ячейки
КонецЕсли;
КонецЦикла;
Если имя колонки формируется динамически и есть вероятность, что поле в таблице отсутствует, перед обращением следует проверить его существование с помощью метода Найти() коллекции колонок:
ИмяКолонки = "К" + Формат(ТТ, "ЧГ=0");
Если ТаблицаЗначений.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
ТекСтрока[ИмяКолонки] = 100;
Иначе
// Колонка отсутствует в структуре таблицы
КонецЕсли;
Проанализируем контекст выполнения кода:
ТаблицаЗначений доступен в полном объеме. Все методы работы с коллекцией Колонки работают без ограничений.ДанныеФормыКоллекция, а их строки — типом ДанныеФормыЭлементКоллекции. Обращение через квадратные скобки по имени вида ЭлементКоллекции[ИмяСвойства] на клиенте полностью поддерживается. Однако для получения полной коллекции колонок таблицы формы при необходимости следует передавать данные на сервер или анализировать элементы формы.