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