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