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