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