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