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