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

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

Как создать колонку программно в 1С

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

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

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

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

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

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

Пример создания таблицы с типизированными колонками:

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

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

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

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

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

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

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

Несколько полезных вариантов:

// Строка фиксированной длины

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

// Составной тип: строка или число

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

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

МассивТипов.Добавить(Тип("Число"));

СоставнойТип = Новый ОписаниеТипов(МассивТипов);

// Дата без времени

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

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

Как создать колонку в табличном документе

Табличный документ не имеет коллекции колонок в привычном смысле — это сетка ячеек, как в электронной таблице. «Колонка» здесь формируется либо через именованные области, либо через параметр макета, либо программной установкой ширины колонки по её номеру.

Чтобы задать ширину колонки программно, используют область, охватывающую колонку целиком:

ТабДок = Новый ТабличныйДокумент;

ОбластьКолонки = ТабДок.Область("C3"); // третья колонка

ОбластьКолонки.ШиринаКолонки = 25;

// Заполнение заголовка

ТабДок.Область("R1C3").Текст = "Количество";

На практике чаще применяют макет: в конфигураторе создают табличный макет с областями «Шапка» и «Строка», а в коде выводят их методами Вывести() и Присоединить(). Метод Присоединить() как раз добавляет область справа, формируя новую колонку результата — это удобно для перекрёстных отчётов, где число колонок заранее неизвестно.

Порядок формирования колонок через Присоединить()
  1. 1
    Подготовьте макет с областью-заголовком и областью-данными
  2. 2
    Выведите первую (фиксированную) часть методом Вывести()
  3. 3
    В цикле по колонкам заполните параметры области и вызовите Присоединить()
  4. 4
    Проверьте результат через ТабДок.Показать() или вывод в отчёт

Как добавить колонку в таблицу на управляемой форме

Когда таблица значений размещена на управляемой форме как реквизит, недостаточно добавить колонку в данные — нужно ещё создать элемент формы, который её отобразит. Это типичная задача для отчётов и обработок с динамической структурой.

Последовательность действий: сначала программно изменяются реквизиты формы через метод ИзменитьРеквизиты(), затем добавляется колонка в таблицу значений, затем создаётся элемент формы с привязкой к пути данных:

// 1. Добавляем реквизит формы (колонку таблицы)

Добавляемые = Новый Массив;

Добавляемые.Добавить(Новый РеквизитФормы("Сумма",

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

ИзменитьРеквизиты(Добавляемые);

// 2. Создаём элемент формы

НовыйЭлемент = Элементы.Добавить("ТаблицаДанныхСумма", Тип("ПолеФормы"), Элементы.ТаблицаДанных);

НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

НовыйЭлемент.ПутьКДанным = "ТаблицаДанных.Сумма";

НовыйЭлемент.Заголовок = "Сумма";

Вызов ИзменитьРеквизиты() возможен только на сервере, поэтому вся логика размещается в серверной процедуре с директивой &НаСервере. После изменения реквизитов данные, уже находившиеся в таблице, сохраняются только для колонок, которые не были удалены.

Как добавить колонку в динамический список и дерево значений

Динамический список не позволяет добавлять колонки напрямую — его структура определяется запросом. Чтобы получить дополнительную колонку, нужно изменить текст запроса списка (добавить поле в секцию ВЫБРАТЬ) или установить произвольный запрос через свойство ПроизвольныйЗапрос. После изменения запроса на форме добавляется элемент с привязкой к новому полю, как описано выше.

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

Сравнение подходов

Таблица значений

Колонки.Добавить() — просто и быстро; подходит для промежуточных расчётов и отчётов без формы

Табличный документ

Области и Присоединить() — для печатных форм и перекрёстных отчётов; нет типизации данных

Реквизит формы

ИзменитьРеквизиты() + элемент формы — единственный способ для интерактивной таблицы; требует серверного вызова

Динамический список

Изменение текста запроса — колонка появляется из данных СУБД; нельзя добавить вычисляемую в коде колонку

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

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

Для Каждого Колонка Из Таблица.Колонки Цикл

Сообщить(Колонка.Имя + " | " + Колонка.ТипЗначения + " | " + Колонка.Заголовок);

КонецЦикла;

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

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

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

Колонка в таблице значений
Норма

Колонки.Найти(Имя) возвращает колонку, значения записываются без ошибок

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

Метод возвращает Неопределено или при записи возникает исключение

Колонка на форме
Норма

Элемент виден в таблице, данные отображаются

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

Элемент есть, но пустой — неверный ПутьКДанным

Тип колонки
Норма

ТипЗначения соответствует ожидаемому описанию

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

Составной тип там, где нужен один тип — ломает сортировку и итоги

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

Частые вопросы

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

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

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

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

Как удалить программно созданную колонку?

Для таблицы значений — Таблица.Колонки.Удалить(Колонка) или по индексу. Для формы — сначала удалить элемент через Элементы.Удалить(), затем убрать реквизит через ИзменитьРеквизиты() с массивом удаляемых реквизитов. Данные удалённой колонки теряются.

Почему колонка отображается на форме без данных?

Чаще всего неверно указан ПутьКДанным у элемента формы: он должен иметь вид «ИмяТаблицы.ИмяКолонки». Также проверьте, что данные в таблицу значений реально загружены после изменения реквизитов — пересоздание реквизитов может обнулить содержимое.

Как создать колонку с флажком на форме?

Добавьте реквизит с типом Булево, затем при создании элемента установите Вид = ВидПоляФормы.ПолеФлажка. Платформа отобразит колонку в виде флажков, доступных для интерактивной отметки пользователем.

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

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

Итог

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

Колонка создаётся по-разному в зависимости от объекта: Колонки.Добавить() для таблицы значений, области и Присоединить() для табличного документа, ИзменитьРеквизиты() плюс элемент формы для интерактивной таблицы. Всегда задавайте тип колонки, проверяйте имя на корректность и помните, что пересоздание реквизитов формы может удалить данные.