К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как создать колонку в таблице значений 1С

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

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

Колонка в таблице значений создаётся программно через коллекцию Колонки и метод Добавить(). При этом важно сразу правильно указать тип данных колонки: от этого зависят корректность сортировки, итогов, поиска и выгрузки данных. Ошибки на этапе описания структуры — самая частая причина «странного» поведения таблиц в дальнейшем коде.

Ниже разобраны синтаксис метода, варианты задания типов, типовые сценарии (создание таблицы «с нуля», добавление колонки в существующую таблицу, работа с составными типами), а также ошибки, которые допускают даже опытные разработчики.

Базовый синтаксис метода Колонки.Добавить

У объекта ТаблицаЗначений есть свойство Колонки — коллекция объектов КолонкаТаблицыЗначений. Новая колонка добавляется методом Добавить(), который принимает три параметра: имя колонки, описание типов и заголовок (представление).

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "Товар");

ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)), "Кол-во");

ТЗ.Колонки.Добавить("Комментарий"); // тип не задан — произвольный

Первый параметр — имя колонки — обязателен и должен быть корректным идентификатором: начинаться с буквы, не содержать пробелов и спецсимволов. Именно по имени выполняется обращение к данным: СтрокаТЗ.Количество или СтрокаТЗ["Количество"]. Третий параметр (заголовок) используется при отображении таблицы пользователю и в некоторых механизмах выгрузки; его можно опустить.

Метод возвращает ссылку на созданный объект колонки, что позволяет донастроить её свойства (например, ширину) сразу после добавления:

НоваяКолонка = ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

НоваяКолонка.Заголовок = "Сумма документа";

НоваяКолонка.Ширина = 15;

Как правильно задать тип колонки через ОписаниеТипов

Тип колонки определяется объектом ОписаниеТипов. В простейшем случае конструктору передаётся строка с именем типа: Новый ОписаниеТипов("Строка"), Новый ОписаниеТипов("Дата"), Новый ОписаниеТипов("Булево"). Для ссылочных типов указывается полное имя объекта метаданных: СправочникСсылка.Контрагенты, ДокументСсылка.РеализацияТоваровУслуг.

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

Тип колонкиКонструктор описания типовКогда использовать
Строка фиксированной длиныНовый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100))Коды, наименования, артикулы
Число с дробной частьюНовый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2))Суммы, цены, количество
Дата без времениНовый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата))Периоды, даты документов для группировки
Ссылка на справочникНовый ОписаниеТипов("СправочникСсылка.Номенклатура")Аналитика, связи с объектами базы
БулевоНовый ОписаниеТипов("Булево")Флаги, пометки выбора

Составные типы и колонки с несколькими типами данных

Иногда колонка должна хранить значения разных типов — например, аналитику, где может быть и контрагент, и склад. Для этого в конструктор ОписаниеТипов передаётся массив имён типов или строка с перечислением через запятую.

МассивТипов = Новый Массив;

МассивТипов.Добавить("СправочникСсылка.Контрагенты");

МассивТипов.Добавить("СправочникСсылка.Склады");

ТЗ.Колонки.Добавить("Аналитика", Новый ОписаниеТипов(МассивТипов), "Аналитика");

// Альтернатива одной строкой:

ТЗ.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка,Число,Дата"));

Составной тип следует применять осознанно: сортировка по такой колонке упорядочивает значения сначала по типу, затем по значению, а сравнение в запросах и при свёртке может давать неочевидные результаты. Если логика обработки позволяет, лучше разделить данные на две однотипные колонки.

Добавление колонки в уже заполненную таблицу

Метод Колонки.Добавить() работает и для таблицы, в которой уже есть строки: новая колонка появится у всех существующих строк со значением Неопределено. Это удобно при постобработке данных — например, когда после загрузки из запроса нужно добавить вычисляемое поле.

ТЗ = Запрос.Выполнить().Выгрузить(); // таблица из запроса

ТЗ.Колонки.Добавить("СуммаСНДС", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

Для Каждого СтрокаТЗ Из ТЗ Цикл

СтрокаТЗ.СуммаСНДС = СтрокаТЗ.Сумма * 1.2;

КонецЦикла;

Порядок добавления вычисляемой колонки
  1. 1
    Получите или создайте таблицу значений с исходными данными
  2. 2
    Вызовите ТЗ.Колонки.Добавить() с именем и типом новой колонки
  3. 3
    Пройдите циклом по строкам и заполните значения новой колонки
  4. 4
    Проверьте результат: выведите несколько строк или используйте ТЗ.ВыбратьСтроку() в толстом клиенте / отладчик
  5. 5
    При необходимости выполните Сортировать() или Свернуть() с учётом новой колонки

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

Копирование колонок из другой таблицы и альтернативные способы

Когда структура новой таблицы должна повторять существующую, не нужно перечислять колонки вручную — используйте метод СкопироватьКолонки(). Он создаёт новую таблицу с идентичным набором колонок, включая типы и заголовки, но без строк.

ТЗИсточник = Запрос.Выполнить().Выгрузить();

ТЗПриемник = ТЗИсточник.СкопироватьКолонки();

// При необходимости добавьте собственные колонки поверх скопированных:

ТЗПриемник.Колонки.Добавить("ПризнакОбработки", Новый ОписаниеТипов("Булево"));

Ещё один способ получить таблицу с готовыми колонками — выгрузить результат запроса (Выгрузить()) или построить таблицу через построитель отчёта. Колонки при этом создаются автоматически по полям запроса, а типы наследуются из метаданных. Это предпочтительный путь, когда данные изначально берутся из базы: ручное описание структуры просто не требуется.

Способы получить колонки в таблице

Колонки.Добавить() вручную

Полный контроль над типами и порядком колонок; подходит для таблиц, создаваемых «с нуля». Требует аккуратного описания типов.

СкопироватьКолонки()

Быстрое копирование структуры готовой таблицы без строк. Не подходит, если исходной таблицы ещё нет.

Выгрузка результата запроса

Колонки и типы формируются автоматически из полей запроса. Ограничение: структура жёстко следует за текстом запроса.

Типичные ошибки и их последствия

Первая распространённая ошибка — попытка добавить колонку с именем, которое уже существует в таблице. Платформа выдаст ошибку выполнения, поэтому при динамическом построении структуры проверяйте наличие колонки: Если ТЗ.Колонки.Найти("Сумма") = Неопределено Тогда ....

Вторая ошибка — неоднозначные имена и обращение к несуществующей колонке. Обращение СтрокаТЗ.Количество при отсутствии такой колонки вызывает исключение «Поле объекта не обнаружено». После переименования или удаления колонок всегда перепроверяйте все места обращения к ним.

Третья группа ошибок связана с типами: числовая колонка без квалификаторов может негативно влиять на точность итогов, строка неограниченной длины мешает использованию колонки в индексах (ТЗ.Индексы.Добавить()), а смешение типов в одной колонке ломает сортировку. Также помните, что метод Свернуть() суммирует только числовые колонки — остальные либо указываются как колонки группировки, либо теряются.

Типичные ошибки
01
Добавление колонки без проверки дубликата имени — ошибка выполнения при повторном вызове процедуры
02
Отсутствие квалификаторов у строки — колонку нельзя использовать в индексах, сравнение работает медленнее
03
Составной тип там, где достаточно одного — непредсказуемая сортировка и проблемы со свёрткой
04
Заполнение колонки в цикле с запросами к базе внутри итерации — резкое падение производительности на больших таблицах
Контрольные точки

Как проверить результат

Структура таблицы
Норма

ТЗ.Колонки.Найти("Имя") возвращает колонку с нужным типом

Тревожный признак

Колонка не найдена или тип отличается от ожидаемого

Значения в строках
Норма

Все строки содержат значения ожидаемого типа, Неопределено только где допустимо

Тревожный признак

Смешение типов в одной колонке, пустые значения там, где они недопустимы

Сортировка и итоги
Норма

Сортировать() и Итог() отрабатывают без ошибок и дают верный результат

Тревожный признак

Ошибка сравнения типов или неверная сумма по числовой колонке

FAQ: частые вопросы о колонках таблицы значений

Можно ли вставить колонку в середину таблицы, а не в конец?

Метод Добавить() всегда помещает колонку в конец коллекции. Чтобы изменить порядок, используйте метод ТЗ.Колонки.Сдвинуть(Колонка, Смещение) — он перемещает колонку на указанное число позиций. Порядок колонок влияет только на отображение и выгрузку, но не на логику обращения по имени.

Как переименовать существующую колонку?

У объекта колонки свойство Имя доступно для записи: ТЗ.Колонки.СтароеИмя.Имя = "НовоеИмя". После переименования все обращения к колонке по старому имени станут ошибочными, поэтому выполняйте замену по всему коду обработки.

Как удалить колонку из таблицы значений?

Используйте ТЗ.Колонки.Удалить(ТЗ.Колонки.ИмяКолонки) или передайте в метод Удалить() индекс колонки. Данные колонки будут потеряны без возможности восстановления, поэтому при необходимости сохраните их заранее в другую таблицу или структуру.

Чем таблица значений отличается от дерева значений при добавлении колонок?

Синтаксис добавления колонок идентичен — и там, и там используется Колонки.Добавить() с теми же параметрами. Разница в структуре строк: у дерева значений строки образуют иерархию (свойства Строки и Родитель), а у таблицы значений строки линейны.

Можно ли задать значение по умолчанию для новой колонки?

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

Почему метод Свернуть() не суммирует мою колонку?

Наиболее вероятная причина — колонка не является числовой (тип задан как строка или не задан вовсе) либо её имя не включено в параметр колонок суммирования. Проверьте тип через ТЗ.Колонки.ИмяКолонки.ТипЗначения и убедитесь, что в нём присутствует тип Число.

Итог

Что важно запомнить

Колонка создаётся методом ТЗ.Колонки.Добавить(Имя, ОписаниеТипов, Заголовок). Всегда явно задавайте тип с квалификаторами, проверяйте дубликаты имён и не смешивайте типы без необходимости — это гарантирует корректную работу сортировки, итогов и свёртки.