Как программно создать страницы панели и табличные поля на обычной форме в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в обычных (не управляемых) формах 1С 8.3 иногда возникает необходимость динамически формировать элементы управления. В частности, часто требуется программно добавлять новые страницы на панель, размещать на них табличные поля и заполнять их произвольными данными.

Рассмотрим по шагам, с какими сложностями можно столкнуться при реализации этой задачи и как их правильно решить.

1. Размещение элемента управления на конкретной странице панели

Разберем первую проблему: метод ЭлементыФормы.Добавить() принимает параметр ПоместитьНа. Если передать туда объект панели, элемент по умолчанию помещается на первую страницу. Чтобы расположить новое табличное поле на конкретной только что созданной странице, необходимо предварительно активировать эту страницу с помощью свойства ТекущаяСтраница панели.

Посмотрим на алгоритм действий:

  1. Добавляем новую страницу в коллекцию страниц панели через метод Панель.Страницы.Добавить().
  2. Назначаем созданную страницу текущей у панели через свойство ТекущаяСтраница.
  3. Вызываем метод ЭлементыФормы.Добавить(), указав панель в качестве родительского контейнера. Элемент добавится именно на активную страницу.

2. Хранение данных динамических таблиц в обычной форме

В управляемых формах для создания произвольных структур данных используется объект РеквизитФормы. Однако в обычных формах механизм динамических реквизитов формы отсутствует. Разработчики часто задаются вопросом: где хранить данные, если число таблиц на форме заранее неизвестно?

В обычном приложении данные созданной таблицы или дерева значений хранятся непосредственно в свойстве Значение самого элемента управления ТабличноеПоле. Нам не требуется создавать отдельный реквизит формы — достаточно инициализировать объект (ТаблицаЗначений или ДеревоЗначений) и присвоить его в ПолеТаблицы.Значение.

3. Настройка колонок и связывание данных

Выясним, как правильно создать колонки и связать их с источником данных:

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

Пример программного создания динамической панели с табличным полем

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


// 1. Создаем и активируем новую страницу на панели
НоваяСтраница = ЭлементыФормы.Панель1.Страницы.Добавить("СтраницаОрганизации", "Организация 1");
ЭлементыФормы.Панель1.ТекущаяСтраница = НоваяСтраница;

// 2. Создаем табличное поле на текущей странице панели
ПолеТаблицы = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "ТаблицаОрганизации", Истина, ЭлементыФормы.Панель1);

// 3. Указываем тип значения для табличного поля
ОписаниеДерева = Новый ОписаниеТипов("ДеревоЗначений");
ПолеТаблицы.ТипЗначения = ОписаниеДерева;

// 4. Добавляем колонку в источник данных (ДеревоЗначений)
ОписаниеТипаНоменклатура = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
ПолеТаблицы.Значение.Колонки.Добавить("Номенклатура", ОписаниеТипаНоменклатура, "Номенклатура");

// 5. Добавляем колонку в визуальный элемент "ТабличноеПоле" на форме
КолонкаФормы = ПолеТаблицы.Колонки.Добавить("Номенклатура");
КолонкаФормы.ТекстШапки = "Номенклатура";

// 6. Связываем визуальную колонку с колонкой источника данных
КолонкаФормы.Данные = "Номенклатура";

// 7. Добавляем новую строку в данные и заполняем значение
НоваяСтрока = ПолеТаблицы.Значение.Строки.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар 1");

Таким образом, комбинируя установку свойства ТекущаяСтраница у панели и связывание свойства Данные колонок табличного поля с колонками источника в свойстве Значение, вы можете легко программно генерировать сложные интерфейсы любой вложенности в обычных формах 1С.

← На главную