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