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