Разработка и Конфигурация · 11 мин
Как вставить колонку в таблицу значений 1С
Как добавить и вставить колонку в таблицу значений 1С: метод Колонки.Добавить, типы значений, вставка в нужную позицию, типичные ошибки и примеры кода.
Таблица значений в 1С — это универсальная структура данных, которую разработчик часто формирует программно: загружает результаты запросов, собирает показатели для отчётов, передаёт данные между процедурами. Чтобы таблица хранила нужную информацию, в неё необходимо добавить колонки — и сделать это правильно, с указанием типа, длины и позиции.
За добавление колонок отвечает коллекция Колонки таблицы значений. Основной инструмент — метод Добавить(), который позволяет задать имя колонки, описание типов данных, заголовок и ширину. Отдельный сценарий — вставка колонки не в конец, а в конкретную позицию: для этого используется метод Вставить().
Материал ниже разбирает синтаксис обоих методов, типичные сценарии (типизированные и не типизированные колонки, составные типы), ограничения платформы и ошибки, из-за которых код падает или ведёт себя неожиданно.
Метод Колонки.Добавить: базовый синтаксис
Простейший вариант — добавить колонку без указания типа. Такая колонка сможет хранить значения любого типа, что удобно на этапе черновой разработки, но рискованно в рабочем коде.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
Полный синтаксис метода:
Колонки.Добавить(<Имя>, <Тип>, <Заголовок>, <Ширина>)
Где параметры означают следующее:
- Имя — строка, идентификатор колонки. Должно быть уникальным в пределах таблицы и соответствовать правилам именования переменных (без пробелов, не начинаться с цифры).
- Тип — объект
ОписаниеТипов. Необязательный параметр; если не указан, колонка принимает значения произвольного типа. - Заголовок — строка, отображаемая пользователю при выводе таблицы в форму или табличный документ.
- Ширина — число, ширина колонки при визуальном отображении. На хранение данных не влияет.
Метод возвращает объект КолонкаТаблицыЗначений — созданную колонку. Это удобно, если нужно сразу донастроить её свойства.
Типизация колонки через ОписаниеТипов
Явное указание типа — признак аккуратного кода. Типизированная колонка защищает от случайной записи «не тех» данных: при попытке присвоить значение другого типа платформа приведёт его к допустимому виду или запишет значение по умолчанию (пустую строку, ноль, пустую дату).
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
ОписаниеСтрока = Новый ОписаниеТипов(МассивТипов, , Новый КвалификаторыСтроки(150));
ТЗ.Колонки.Добавить("Наименование", ОписаниеСтрока, "Наименование товара", 30);
Для чисел с фиксированной точностью используются квалификаторы числа: общая длина и число знаков после запятой. Например, для сумм типичен вариант 15 разрядов и 2 знака дробной части:
ОписаниеСумма = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
ТЗ.Колонки.Добавить("Сумма", ОписаниеСумма);
Для ссылочных типов указывается конкретный тип объекта метаданных:
ОписаниеСсылка = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
ТЗ.Колонки.Добавить("Товар", ОписаниеСсылка);
Короткая форма конструктора Новый ОписаниеТипов("Строка") принимает строку с перечислением типов через запятую — так создают составной тип, например "СправочникСсылка.Контрагенты,СправочникСсылка.Организации".
Как вставить колонку в нужную позицию
Метод Добавить всегда помещает колонку в конец. Если колонка должна стоять, например, второй по счёту, используется метод Вставить:
// Вставить колонку "Цена" на позицию с индексом 1 (вторую по счёту)
ТЗ.Колонки.Вставить(1, "Цена", ОписаниеСумма, "Цена за единицу", 12);
Первый параметр — индекс позиции, начиная с нуля. Индекс 0 вставит колонку первой, индекс, равный текущему количеству колонок, эквивалентен обычному добавлению в конец.
Остальные параметры (Имя, Тип, Заголовок, Ширина) работают так же, как у метода Добавить. Если указать индекс больше допустимого, платформа вызовет исключение, поэтому перед вставкой имеет смысл проверять ТЗ.Колонки.Количество().
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
ТЗ.Колонки.Вставить(1, "Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
// Порядок колонок: Номенклатура, Цена, КоличествоДобавление колонки в уже заполненную таблицу
Частая задача: таблица уже содержит строки (например, получена выгрузкой запроса), и в неё нужно добавить вычисляемую колонку. Колонка добавляется тем же методом — существующие строки при этом не удаляются, а в новой колонке появляются пустые значения.
ТЗ = Запрос.Выполнить().Выгрузить();
ТЗ.Колонки.Добавить("СуммаСНДС", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Для Каждого СтрокаТЗ Из ТЗ Цикл
СтрокаТЗ.СуммаСНДС = СтрокаТЗ.Сумма * 1.2;
КонецЦикла;
Порядок важен: сначала колонка создаётся, потом заполняется. Обращение к несуществующей колонке через точку (СтрокаТЗ.СуммаСНДС до добавления) приведёт к ошибке «Поле объекта не обнаружено».
Если таблица пришла извне и заранее неизвестно, есть ли в ней нужная колонка, проверку делают через Найти:
Если ТЗ.Колонки.Найти("СуммаСНДС") = Неопределено Тогда
ТЗ.Колонки.Добавить("СуммаСНДС", ОписаниеСумма);
КонецЕсли;
- 1Создайте таблицу: ТЗ = Новый ТаблицаЗначений или получите её выгрузкой запроса
- 2Проверьте, нет ли уже колонки с таким именем: ТЗ.Колонки.Найти(Имя)
- 3Подготовьте ОписаниеТипов с нужными квалификаторами
- 4Добавьте колонку: ТЗ.Колонки.Добавить(Имя, Тип, Заголовок) или Вставить(Индекс, ...) для конкретной позиции
- 5Заполните значения в цикле по строкам таблицы
- 6Проверьте результат: ТЗ.Колонки.Количество() и тип данных в первой строке
Ограничения и типичные ошибки
Дублирование имён и недопустимые символы
Имя колонки должно быть уникальным: попытка добавить вторую колонку с тем же именем вызовет исключение. Имена с пробелами, дефисами и начинающиеся с цифры также недопустимы — платформа потребует корректный идентификатор.
Работа с таблицей на форме
Если таблица значений является реквизитом управляемой формы, программное добавление колонки в данные не создаст автоматически видимую колонку в элементе формы. Нужно дополнительно программно создать элемент формы и связать его с путём к данным, либо заранее описать колонки в конфигураторе.
Неявное приведение типов
При записи в типизированную колонку значения несовместимого типа ошибки может не быть — платформа молча запишет значение по умолчанию. Например, строка, которую не удалось преобразовать в число, превратится в 0. Это источник трудноуловимых ошибок в расчётах.
Проверка результата и полезные приёмы
После добавления колонки результат проверяется простыми средствами. Количество колонок: ТЗ.Колонки.Количество(). Позиция конкретной колонки: ТЗ.Колонки.Индекс(ТЗ.Колонки.Найти("Цена")). Тип значения в строке: ТипЗнч(ТЗ[0].Цена).
Для быстрой отладки удобно вывести таблицу в табличный документ методом ВывестиТаблицуЗначений недоступен напрямую, но можно использовать построитель отчёта или просто обойти строки с выводом в сообщения. В толстом клиенте доступен визуальный просмотр таблицы через отладчик.
Если колонку нужно не только добавить, но и переименовать или удалить, используются свойство Имя объекта колонки и метод Колонки.Удалить(). Комбинация этих операций позволяет полностью перестроить структуру таблицы в рантайме.
Как проверить результат
Колонки.Найти(Имя) возвращает объект колонки
Найти() возвращает Неопределено
ТипЗнч(Строка[Имя]) соответствует заданному ОписаниеТипов
Значения имеют произвольный тип или Неопределено
Колонки.Индекс() возвращает ожидаемый номер
Колонка оказалась в конце — использован Добавить вместо Вставить
Все строки содержат рассчитанные значения
В колонке нули или пустые строки — цикл заполнения не отработал
Сравнение подходов: Добавить, Вставить и загрузка структуры
Выбор метода зависит от задачи. Для формирования таблицы «с нуля» достаточно последовательных вызовов Добавить. Для встройки колонки в существующую структуру — Вставить. Если таблица строится по образцу другой таблицы, иногда проще скопировать структуру целиком через ТЗ.СкопироватьКолонки() и затем дополнить её.
Сравнение вариантов
Стандартный способ, колонка встаёт в конец. Подходит для формирования новой таблицы
Колонка встаёт на заданный индекс. Нужен контроль границ, иначе исключение
Быстрое воспроизведение чужой структуры; новые колонки добавляются после копирования
Во всех случаях типизация остаётся обязательной частью надёжного решения: неявные колонки «любого типа» допустимы только в отладочном коде, который не попадёт в рабочую базу.
Что важно запомнить
Колонка добавляется методом Колонки.Добавить с указанием имени и ОписаниеТипов; позицию задаёт Колонки.Вставить. Перед добавлением проверяйте уникальность имени через Найти, после — заполнение данных в строках. Типизируйте колонки всегда, особенно если таблица пойдёт в запрос.
Частые вопросы
Можно ли добавить колонку без указания типа?
Да, второй параметр метода Добавить необязателен. Колонка без типа примет значение любого вида, но это снижает надёжность кода: при выгрузке в запрос или сравнении значений возможны ошибки и неочевидное поведение.
Как добавить колонку типа «Дата» без времени?
Создайте описание типов с квалификатором даты: Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата)). Тогда время в значениях будет отсекаться.
Почему возникает ошибка «Колонка с таким именем уже существует»?
Метод Добавить вызван повторно для того же имени — например, процедура выполняется несколько раз для одной таблицы. Перед добавлением проверяйте наличие: Если ТЗ.Колонки.Найти("Имя") = Неопределено Тогда ... КонецЕсли.
Как вставить колонку первой в таблице?
Используйте ТЗ.Колонки.Вставить(0, "Имя", ОписаниеТипов). Индекс 0 соответствует первой позиции; остальные колонки сдвинутся вправо.
Что происходит со строками при добавлении новой колонки?
Данные не теряются: во всех существующих строках новая колонка получает пустое значение соответствующего типа (ноль, пустая строка, пустая дата или Неопределено). Заполнение выполняется отдельным циклом.
Почему добавленная колонка не видна на управляемой форме?
Реквизит формы и элемент формы — разные сущности. После программного изменения состава реквизита нужно создать элемент формы через Элементы.Добавить и привязать его к пути данных, либо заранее описать колонки в конфигураторе.