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

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

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

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

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

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

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

Метод Колонки.Добавить(): синтаксис и параметры

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

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

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

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

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

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

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

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

Как правильно задать тип колонки

Тип колонки определяет, какие значения можно хранить и как платформа будет выполнять сортировку, сравнение и вычисление итогов. Тип задаётся объектом ОписаниеТипов, который создаётся конструктором с именами типов и квалификаторами.

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

ОписаниеСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));

ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

ОписаниеДаты = Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата));

ОписаниеБулево = Новый ОписаниеТипов("Булево");

Составные типы и ограничение по длине

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

ОписаниеСоставное = Новый ОписаниеТипов("СправочникСсылка.Номенклатура, Строка",

, Новый КвалификаторыСтроки(200));

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

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

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

ТипКолонки = Метаданные.Справочники.Номенклатура.Реквизиты.Артикул.Тип;

ТЗ.Колонки.Добавить("Артикул", ТипКолонки);

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

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

// ТЗ — результат запроса с колонками Номенклатура, Количество, Цена

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

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

Строка.Сумма = Строка.Количество * Строка.Цена;

КонецЦикла;

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

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

Удаление, вставка и переименование колонок

Кроме добавления, коллекция колонок поддерживает полный набор операций. Метод Вставить(Индекс, ...) добавляет колонку в конкретную позицию — это влияет на порядок отображения при выводе таблицы в табличное поле или табличный документ. Метод Удалить() принимает колонку или её индекс; при этом данные в этой колонке теряются без возможности восстановления.

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

Типичные ошибки при добавлении колонок

Самая частая ошибка — попытка обратиться к колонке, которой нет: опечатка в имени приводит к исключению «Поле объекта не обнаружено». Имена колонок чувствительны к написанию, поэтому для повторно используемых имён разумно заводить переменные или константы в начале модуля.

Вторая группа ошибок связана с типами. Если колонка объявлена как Число, а в неё пытаются записать строку, платформа выполнит приведение: нечисловая строка превратится в 0 без предупреждения. Такие тихие подмены данных опаснее явных ошибок — они обнаруживаются уже в отчётах. Поэтому перед записью сомнительных значений используйте проверку ТипЗнч(Значение).

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

Типичные ошибки
01
Добавление колонки с именем, которое уже есть — исключение; проверяйте через Колонки.Найти()
02
Колонка без типа и последующий вызов Итог() — ошибка или неверный результат при смешанных значениях
03
Запись строки в числовую колонку — тихое преобразование в 0 вместо ошибки
04
Добавление колонки в табличную часть документа напрямую — нужно сначала Выгрузить() в таблицу значений
05
Строка неограниченной длины в таблице, передаваемой в запрос — невозможность группировки и соединений

Проверка результата и передача таблицы дальше

После добавления колонки и заполнения данных полезно выполнить несколько контрольных проверок. Убедитесь, что колонка существует: ТЗ.Колонки.Найти("Сумма") <> Неопределено. Проверьте тип значений в первых строках и корректность итогов: ТЗ.Итог("Сумма") должен вернуть число, а не ошибку. Для быстрой визуальной проверки в отладке удобно вывести таблицу через ТЗ.ВыбратьСтроку() или передать её в табличный документ построителем отчёта.

Если таблица дальше передаётся в запрос как источник (через временную таблицу), помните про ограничения: строковые колонки должны иметь конечную длину, а составные типы могут потребовать явного приведения через ВЫРАЗИТЬ в тексте запроса.

Контрольные точки

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

Наличие колонки
Норма

ТЗ.Колонки.Найти(Имя) возвращает объект колонки

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

Возвращается Неопределено — имя задано с ошибкой

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

ТипЗнч() каждого значения соответствует описанию типа колонки

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

В числовой колонке строки или Неопределено

Итог по числовой колонке
Норма

ТЗ.Итог() возвращает корректное число

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

Ошибка выполнения или ноль при заполненных строках

Передача в запрос
Норма

Запрос с параметром-таблицей выполняется

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

Ошибка о неограниченной длине строки или несовместимых типах

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

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

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

Как добавить колонку с типом «Булево» и признаком по умолчанию?

Добавьте колонку: ТЗ.Колонки.Добавить("Выбран", Новый ОписаниеТипов("Булево")). Новые строки получат значение Ложь автоматически при создании через ТЗ.Добавить(). Если нужно Истина по умолчанию — вызовите ТЗ.ЗаполнитьЗначения(Истина, "Выбран") после добавления.

Почему возникает ошибка «Колонка с таким именем уже существует»?

Имена колонок в таблице уникальны. Такая ошибка появляется при повторном вызове Добавить() с тем же именем — например, если процедура заполняет таблицу несколько раз. Перед добавлением проверяйте: Если ТЗ.Колонки.Найти(Имя) = Неопределено Тогда ... КонецЕсли.

Как добавить колонку в таблицу, полученную из запроса?

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

В чём разница между именем и заголовком колонки?

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

Можно ли скопировать колонки из одной таблицы в другую?

Да: пройдите циклом по ТЗ1.Колонки и для каждой колонки вызовите ТЗ2.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок, Колонка.Ширина). Для копирования структуры вместе с данными проще использовать ТЗ2 = ТЗ1.Скопировать() — метод создаёт полную копию таблицы.

Итог

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

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