Как динамически обратиться к колонке ТаблицыЗначений в цикле 1С?

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

При работе с объектом ТаблицаЗначений в платформе 1С часто возникает необходимость обращаться к колонкам, имена которых формируются динамически прямо во время выполнения программы — например, при обработке дней месяца или составных наименований. Рассмотрим подробнее, с какой ошибкой можно столкнуться при обращении через точку и как правильно записать синтаксис обращения к динамическим свойствам.

Причина возникновения синтаксической ошибки

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


// Попытка обратиться к колонке через точку приведет к ошибке компиляции
Стр.День + "" + Строка(НомерДня) = ВыборкаПоДням.ИндексДняГода;

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

Корректный синтаксис обращения через квадратные скобки

Разберем по шагам, как обратиться к колонке динамически. Для доступа к свойствам и колонкам объектов по их строковому имени в 1С применяется исключительно квадратный скобочный синтаксис Стр[ИмяКолонки].

Посмотрим на пример правильного заполнения значения в строке таблицы:


ИмяКолонки = "День" + Формат(НомерДня, "ЧГ=0");
Стр[ИмяКолонки] = ВыборкаПоДням.ИндексДняГода;

Или в виде более краткой записи:

Стр["День" + Формат(НомерДня, "ЧГ=0")] = ВыборкаПоДням.ИндексДняГода;

Особенности преобразования чисел в строки

Обратите особое внимание на явное форматирование числа с помощью функции Формат() с параметром "ЧГ=0". Если использовать стандартную функцию Строка(НомерДня), платформа 1С при значении числа 1000 и более добавит неразрывный пробел для разделения триад (например, выйдет строка "1 000"). В итоге сформированное имя колонки "День1 000" будет содержать пробел, что вызовет ошибку обращения или создаст некорректный идентификатор.

Для гарантированного отключения группировки триад используйте следующий подход:


// Правильное формирование имени без разделителей тысяч
ИмяКолонки = СтрШаблон("День%1", Формат(НомерДня, "ЧГ=0"));

Автоматическое создание колонок и проверка их наличия

Посмотрим, как оптимизировать процесс создания колонок и застройки структуры таблицы значений. Создание самих колонок также удобнее производить в цикле:


Для НомерДня = 1 По 7 Цикл
    ИмяКолонки = "День" + Формат(НомерДня, "ЧГ=0");
    Таб.Колонки.Добавить(ИмяКолонки);
КонецЦикла;

При динамическом доступе по имени важно защитить код от аварийного завершения в случаях, когда колонка может отсутствовать в таблице. Попытка обратиться к несуществующему полю через Стр[ИмяКолонки] приведет к ошибке «Поле объекта не обнаружено». Для безопасной работы следует выполнять предварительную проверку через метод Найти():


ИмяКолонки = "День" + Формат(НомерДня, "ЧГ=0");
Если Таб.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
    Стр[ИмяКолонки] = Значение;
КонецЕсли;

Рекомендации по правилам именования и производительности

При работе с динамическими именами колонок ТаблицыЗначений помните о нескольких важных правилах платформы 1С:

  1. Имя колонки должно удовлетворять требованиям к идентификаторам 1С: оно не может начинаться с цифры, не должно содержать пробелов, дефисов или специальных символов.
  2. Имена колонок должны быть уникальными внутри одной таблицы значений без учета регистра символов.
  3. Для повышения скорости работы в больших циклах обращение по строковому имени Стр[ИмяКолонки] задействует внутренний поиск платформы. Если цикл выполняет большое количество итераций, эффективнее обращаться по числовому индексу колонки Стр[ИндексКолонки].
← На главную