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