При разработке сложных интерфейсов на управляемых формах часто возникает потребность в создании динамических элементов управления. Одной из частых задач является программное добавление кнопок, которые должны вызывать логику, описанную в ОбщиеМодули. Рассмотрим, как это реализовать, учитывая архитектурные ограничения платформы 1С.
Архитектура управляемых форм 1С устроена так, что свойство Действие у Команда формы обязательно должно ссылаться на процедуру, расположенную внутри модуля самой формы. Метод ДобавитьОбработчик здесь не поможет, так как он предназначен для работы с событиями элементов формы (например, ПриНажатии или ПриИзменении), а команда — это самостоятельный объект метаданных формы. Поэтому прямое указание пути к экспортной функции общего модуля в свойстве кнопки невозможно.
Наиболее эффективный способ реализации — создание одной универсальной процедуры в модуле формы, которая будет выступать в роли «диспетчера» или «маршрутизатора». Разберем этот процесс по шагам:
Команда.Элементы.Добавить(...), мы привязываем эту общую процедуру к каждой динамически созданной команде.ОбщийМодуль, передавая имя команды для идентификации нужного действия.Посмотрим на пример кода для реализации такого подхода:
// В модуле формы создаем обработчик
&НаКлиенте
Процедура ОбработкаНажатияДинамическойКнопки(Команда)
// Вызываем функцию общего модуля, передавая имя нажатой команды
ОбщийМодульСервис.ВыполнитьДействие(Команда.Имя);
КонецПроцедуры
// При добавлении кнопок в коде:
Команда = ЭтаФорма.Команды.Добавить("МояДинамическаяКнопка1");
Команда.Действие = "ОбработкаНажатияДинамическойКнопки";
Кнопка = Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"), Элементы.ГруппаКнопок);
Кнопка.Команда = "МояДинамическаяКнопка1";
Если вы не хотите добавлять код непосредственно в модули форм, можно использовать механизм ОбщиеКоманды. Это решение позволяет вынести логику на уровень конфигурации.
Суть метода заключается в следующем:
ОбщаяКоманда, обработчик которой прописан в общем модуле.ИмяКоманды записывается строка вида "ОбщаяКоманда.ИмяВашейКоманды".ПараметрыВыполненияКоманды.Источник.Анализируя ТекущийЭлемент источника, вы можете определить, какая именно кнопка была нажата, и выполнить соответствующий алгоритм.
Если ваша задача — добавить функционал в типовую форму без изменения конфигурации, лучше всего использовать Расширения. В расширении вы можете:
ПриСозданииНаСервере) программно добавить нужные кнопки и команды.Этот метод является самым «чистым» с точки зрения поддержки обновлений. Вы не затрагиваете исходный код типовых модулей, а просто дополняете форму необходимыми элементами и логикой.
Для управления большим количеством динамических кнопок рекомендуем:
ПодключаемыеКомандыПереопределяемый. Там уже реализован механизм регистрации команд, который минимизирует ручное кодирование в модулях форм.ДинамКнопка_Название), чтобы в обработчике было проще парсить строку имени.Комбинируя эти подходы, вы сможете создать гибкий и масштабируемый интерфейс, который будет легко поддерживать и развивать в будущем.