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

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

Как программно добавить колонку в табличную часть формы 1С

Пошаговая инструкция: программное добавление колонки в табличную часть формы 1С. Работа с ИзменитьРеквизиты, примеры кода, ошибки и проверка результата.

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

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

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

Как устроен механизм: реквизит, элемент и связь между ними

Любая видимая колонка табличной части на управляемой форме состоит из двух сущностей. Первая — реквизит формы, который хранит данные. Вторая — элемент формы (поле), который отображает эти данные пользователю. Если добавить только реквизит, колонка в интерфейсе не появится. Если создать только элемент без реквизита, форма не сможет отобразить данные и выдаст ошибку при открытии.

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

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

Шаг 1. Добавляем реквизит в табличную часть через ИзменитьРеквизиты

Новый реквизит описывается объектом ОписаниеРеквизитаФормы (в современных версиях платформы) или Новый РеквизитФормы (в более старых). В конструктор передаются имя реквизита, его тип и путь к владельцу — для колонки табличной части это имя реквизита-таблицы.

&НаСервере

Процедура ДобавитьКолонкуНаСервере()

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

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

НовыйРеквизит = Новый РеквизитФормы("Комментарий", ОписаниеТипа, "Объект.Товары", "Комментарий");

ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

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

КонецПроцедуры

Обратите внимание на третий параметр конструктора — путь. Значение Объект.Товары означает, что реквизит добавляется в табличную часть «Товары» основного реквизита формы «Объект». Если таблица является самостоятельным реквизитом формы (например, таблица значений «Результат»), путь будет просто Результат.

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

Метод ИзменитьРеквизиты принимает два параметра: массив добавляемых и массив удаляемых реквизитов. Если удалять ничего не нужно, второй параметр можно опустить. Вызов метода пересоздаёт данные формы, поэтому выполнять его нужно до заполнения таблицы данными либо учитывать, что значения в изменяемой таблице могут быть сброшены.

Шаг 2. Создаём элемент формы и привязываем к реквизиту

После изменения состава реквизитов создаётся визуальный элемент — поле формы типа ПолеВвода. Элемент добавляется методом Элементы.Добавить, где указывается имя элемента, его вид и родитель — таблица формы, в которую добавляется колонка.

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

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

НовыйЭлемент.ПутьКДанным = "Объект.Товары.Комментарий";

НовыйЭлемент.Заголовок = "Комментарий к строке";

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

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

Порядок действий
  1. 1
    Откройте модуль формы и создайте серверную процедуру или используйте ПриСозданииНаСервере
  2. 2
    Сформируйте массив с объектом РеквизитФормы: имя, тип, путь к таблице
  3. 3
    Вызовите ИзменитьРеквизиты с этим массивом
  4. 4
    Создайте элемент через Элементы.Добавить с родителем — таблицей формы
  5. 5
    Установите Вид, ПутьКДанным и Заголовок элемента
  6. 6
    Откройте форму в режиме 1С:Предприятие и проверьте отображение колонки

Шаг 3. Добавление колонки в динамическую таблицу значений

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

ТЗ = РеквизитФормыВЗначение("Результат");

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

ЗначениеВРеквизитФормы(ТЗ, "Результат");

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

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

Новый ОписаниеТипов("Число"), "Результат", "Сумма"));

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

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

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

Элемент.ПутьКДанным = "Результат.Сумма";

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

При динамическом построении таблицы по произвольному запросу сначала удалите старые программно добавленные колонки (через ИзменитьРеквизиты с массивом удаляемых и Элементы.Удалить), иначе при повторном формировании получите ошибку о дублировании имён. Храните список созданных имён в реквизите формы, чтобы знать, что удалять.
ПЗ
Практическое замечание

Особые случаи и ограничения механизма

Колонка в динамическом списке

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

Повторное открытие формы

Программно добавленные реквизиты и элементы существуют только в текущем экземпляре формы. При закрытии и повторном открытии формы код добавления выполнится заново — это нормально. Но внутри одного сеанса работы формы повторный вызов кода добавления без проверки приведёт к ошибке дублирования. Перед добавлением проверяйте существование элемента: Если Элементы.Найти("ТоварыКомментарий") = Неопределено Тогда ....

Обычные формы и внешние обработки

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

Сравнение вариантов

Программное добавление на форме

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

Добавление реквизита в конфигураторе

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

Расширение конфигурации

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

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

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

Это критическое ограничение: программное добавление колонки меняет только форму, а не структуру данных. Значения в такой колонке живут, пока открыта форма. Если данные должны храниться в базе, реквизит нужно добавить в метаданные табличной части через конфигуратор или расширение, а на форме лишь отобразить его.

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

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

Отображение колонки
Норма

Колонка видна в таблице с заданным заголовком

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

Колонки нет или форма не открывается с ошибкой о пути к данным

Ввод данных
Норма

Значение вводится и сохраняется при переходе между строками

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

Значение стирается или ввод недоступен

Повторное открытие формы
Норма

Форма открывается без ошибок, колонка создаётся заново

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

Ошибка дублирования имени реквизита или элемента

FAQ

Можно ли добавить колонку в табличную часть на клиенте?

Нет. Изменение состава реквизитов формы возможно только на сервере. Клиентская процедура может лишь вызвать серверную, которая выполнит ИзменитьРеквизиты и создание элементов.

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

Программно добавленный реквизит существует только в данных формы. Чтобы значения хранились в базе, колонку нужно добавить в метаданные табличной части объекта через конфигуратор или расширение конфигурации.

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

Вызовите ИзменитьРеквизиты, передав имя реквизита во втором параметре (массив удаляемых), и удалите элемент методом Элементы.Удалить(Элементы.ИмяЭлемента). Порядок не критичен, но обычно сначала удаляют элемент, затем реквизит.

Как добавить колонку в определённое место таблицы, а не в конец?

После создания элемента используйте Элементы.Переместить(НовыйЭлемент, Элементы.Товары, Элементы.НужнаяКолонка) — третий параметр задаёт элемент, перед которым будет размещена новая колонка.

Работает ли этот способ с динамическим списком?

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

Что делать, если набор колонок строится по результату запроса и заранее неизвестен?

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

Итог

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

Программное добавление колонки — это три связанных действия на сервере: ИзменитьРеквизиты, создание элемента формы и установка ПутьКДанным. Такая колонка живёт только в форме и не сохраняется в базу; для хранения данных нужен реквизит в метаданных или расширение конфигурации. Всегда проверяйте существование элемента перед повторным добавлением.