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