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