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