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

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

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

Разбор проблемы: почему код автора не работает?

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


Процедура КнопкаВыполнитьНажатие(Кнопка)
    тз = новый ТаблицаЗначений;
    Для счётчик = 1 по 10 цикл
        имя = Строка(счётчик);
        тз.Колонки.Добавить(имя);
    КонецЦикла
КонецПроцедуры

На первый взгляд кажется, что всё верно: метод Добавить() принимает строку в качестве первого параметра. Функция Строка(счётчик) возвращает строковое представление числа. Однако платформа 1С накладывает на техническое Имя колонки те же ограничения, что и на имена переменных (идентификаторов). Имя «1», «2» и так далее является недопустимым идентификатором, так как оно начинается с цифры.

Правила именования идентификаторов в 1С

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

  1. Первый символ: Имя должно начинаться с буквы или символа подчеркивания («_»). Цифра в начале имени запрещена.
  2. Состав имени: После первого символа в имени могут использоваться буквы, цифры и символы подчеркивания. Пробелы, точки, запятые и другие специальные символы (тире, знаки процента и т.д.) не допускаются.
  3. Уникальность: В рамках одной ТаблицыЗначений имена колонок не могут повторяться.
  4. Регистронезависимость: Платформа не различает «ИмяКолонки» и «имяколонки». Попытка добавить колонку с тем же именем, но в другом регистре, вызовет ошибку.
  5. Длина имени: Хотя платформа позволяет создавать довольно длинные имена, рекомендуется придерживаться разумных пределов для удобства чтения кода.

Как правильно генерировать имена в цикле

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


Процедура КнопкаВыполнитьНажатие(Кнопка)
    тз = новый ТаблицаЗначений;
    Для счётчик = 1 по 10 цикл
        // Добавляем префикс "Колонка", чтобы имя начиналось с буквы
        ИмяКолонки = "Колонка" + Формат(счётчик, "ЧГ=0"); 
        тз.Колонки.Добавить(ИмяКолонки);
    КонецЦикла
КонецПроцедуры

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

Различие между Именем и Заголовком колонки

Часто путаница возникает из-за того, что разработчик хочет видеть в шапке таблицы именно цифру. Здесь важно разделять два понятия: техническое Имя и визуальный Заголовок.

Метод Добавить() имеет следующую структуру:

Добавить(Имя, Тип, Заголовок, Ширина)

Рассмотрим пример, где мы задаем понятное имя для кода и числовой заголовок для пользователя:


ИмяДляКода = "Месяц_" + СтрокаМесяца; // Например, "Месяц_1"
ЗаголовокДляЭкрана = СтрокаМесяца;    // Например, "1"
тз.Колонки.Добавить(ИмяДляКода, , ЗаголовокДляЭкрана);

Зарезервированные имена и типичные ошибки

Выясним еще одну причину возникновения ошибки «Неверное имя колонки» — использование зарезервированных имен. Даже если имя начинается с буквы, оно может быть запрещено, если совпадает со служебными свойствами объектов 1С.

Список имен, которые нельзя использовать:

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

Альтернатива: работа без имен колонок

Если специфика вашей задачи (например, математические вычисления или транспонирование матриц) требует обращения к колонкам только по порядковому номеру, вы можете вообще не задавать имена. В методе Добавить() первый параметр является необязательным.


// Добавляем 5 анонимных колонок
Для Инд = 1 По 5 Цикл
    тз.Колонки.Добавить(); 
КонецЦикла;

// Обращение к данным будет происходить по индексу
НоваяСтрока = тз.Добавить();
НоваяСтрока[0] = "Данные в первой колонке";
НоваяСтрока[1] = "Данные во второй колонке";

Важное ограничение: Если у колонки нет имени, вы не сможете использовать методы Найти() или НайтиСтроки() с указанием конкретной колонки поиска, так как эти методы принимают имя колонки строкой.

Производительность при большом количестве колонок

В обсуждении на форуме был затронут вопрос о создании таблиц с количеством колонок более 1000. Рассмотрим, почему это считается плохой практикой:

  1. Потребление памяти: ТаблицаЗначений хранит данные в оперативной памяти. Сверхширокие таблицы сильно увеличивают расход ресурсов.
  2. Сериализация: При передаче таблицы с сервера на клиент (или наоборот) платформа выполняет сериализацию данных. Чем больше колонок, тем медленнее работает этот процесс, что может привести к «зависанию» интерфейса.
  3. Поиск: Поиск по имени колонки в коллекции Колонки работает медленнее, когда коллекция раздута.

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

Итоги и рекомендации

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

← На главную