Почему возникает ошибка «Неверное имя колонки» при создании колонок таблицы значений в цикле и как её исправить?

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

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

Выясним причину возникновения ошибки

Проанализируем фрагмент кода, вызывающий исключение:


Для Счетчик = 1000 По 1001 Цикл
    ТЗ.Колонки.Добавить("Колонка" + Счетчик, Новый ОписаниеТипов("Число"), "Колонка" + Счетчик);
КонецЦикла;

В выражении "Колонка" + Счетчик происходит неявное преобразование типа: числовое значение переменной Счетчик автоматически приводится к строковому типу. По умолчанию платформа 1С при строковом представлении чисел, превышающих 999, выполняет группировку разрядов и вставляет между ними специальный символ — неразрывный пробел (Символы.НПП, код 160).

В результате конкатенации формируется строка вида "Колонка1 000" (с неразрывным пробелом внутри).

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

  1. Имя может содержать только буквы, цифры и символ подчеркивания _.
  2. Имя не может начинаться с цифры.
  3. Имя не должно содержать пробелов, неразрывных пробелов, знаков препинания и спецсимволов.

Так как неразрывный пробел является недопустимым символом для идентификатора, платформа вызывает исключение.

Способ 1. Использование функции Формат() с параметром «ЧГ=»

Наиболее распространенное и гибкое решение — явное форматирование числового значения с отключением группировки разрядов. Для этого используется параметр "ЧГ=" (числовая группировка отключена).

Посмотрим на пример правильного формирования колонок:


Для Счетчик = 1000 По 1001 Цикл
    ИмяКолонки = "Колонка" + Формат(Счетчик, "ЧГ=");
    ЗаголовокКолонки = "Колонка № " + Формат(Счетчик, "ЧГ=");
    ТЗ.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов("Число"), ЗаголовокКолонки);
КонецЦикла;

Способ 2. Использование функции XMLСтрока()

Функция XMLСтрока() выполняет преобразование значения в каноническое строковое XML-представление. Для чисел такое представление всегда формируется без разделителей групп разрядов и с точкой в качестве десятичного разделителя.

Разберем реализацию с XMLСтрока():


Для Счетчик = 1000 По 1001 Цикл
    ИмяКолонки = "Колонка" + XMLСтрока(Счетчик);
    ТЗ.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов("Число"), "Колонка " + XMLСтрока(Счетчик));
КонецЦикла;

Способ 3. Очистка строки от неразрывных пробелов

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


Для Счетчик = 1000 По 1001 Цикл
    СтрокаЧисла = СтрЗаменить(Строка(Счетчик), Символы.НПП, "");
    ТЗ.Колонки.Добавить("Колонка" + СтрокаЧисла, Новый ОписаниеТипов("Число"));
КонецЦикла;

Способ 4. Создание колонок без явного указания имени

Параметр Имя метода Колонки.Добавить() является необязательным. Если вам не требуется обращаться к колонкам по их строковым идентификаторам, колонки можно создавать пустыми, а доступ к значениям получать по числовому индексу:


Для Счетчик = 0 По 1000 Цикл
    // Первый параметр опущен или передан как пустая строка ""
    ТЗ.Колонки.Добавить(, Новый ОписаниеТипов("Число"), "Колонка " + Формат(Счетчик, "ЧГ="));
КонецЦикла;

// Доступ к ячейке по индексу колонки:
Значение = ТЗ[ИндексСтроки][ИндексКолонки];

Важные рекомендации по производительности интерфейса

Рассмотрим важный архитектурный нюанс: создание сотен или тысяч колонок в памяти (в объекте ТаблицаЗначений) не вызывает проблем с быстродействием, однако их отрисовка на форме через метод СоздатьКолонки() или программное добавление элементов формы (в управляемом интерфейсе) приводит к сильной деградации производительности и зависанию клиентского приложения.

Если вам требуется отобразить в интерфейсе большую матрицу данных, сетку или игровое поле (например, клеточный автомат «Жизнь»):

  1. Используйте объект ТабличныйДокумент: поле табличного документа аппаратно оптимизировано для работы с тысячами ячеек, строк и колонок, поддерживает прямую адресацию по координатам и не перегружает DOM/интерфейсную подсистему платформы.
  2. Транспонируйте структуру: если число параметров велико, разверните структуру вертикально (хранение в виде строк «Параметр — Значение»), чтобы избежать разрастания таблицы по горизонтали.
← На главную