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