Как программно создать кнопку в управляемой форме и привязать к ней общий модуль?

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

При разработке сложных интерфейсов на управляемых формах часто возникает потребность в создании динамических элементов управления. Одной из частых задач является программное добавление кнопок, которые должны вызывать логику, описанную в ОбщиеМодули. Рассмотрим, как это реализовать, учитывая архитектурные ограничения платформы 1С.

Почему нельзя просто назначить обработчик из общего модуля?

Архитектура управляемых форм 1С устроена так, что свойство Действие у Команда формы обязательно должно ссылаться на процедуру, расположенную внутри модуля самой формы. Метод ДобавитьОбработчик здесь не поможет, так как он предназначен для работы с событиями элементов формы (например, ПриНажатии или ПриИзменении), а команда — это самостоятельный объект метаданных формы. Поэтому прямое указание пути к экспортной функции общего модуля в свойстве кнопки невозможно.

Решение 1: Использование паттерна «Маршрутизатор»

Наиболее эффективный способ реализации — создание одной универсальной процедуры в модуле формы, которая будет выступать в роли «диспетчера» или «маршрутизатора». Разберем этот процесс по шагам:

  1. В модуле формы создаем единственную процедуру-обработчик, которая будет принимать объект Команда.
  2. При программном добавлении кнопок через Элементы.Добавить(...), мы привязываем эту общую процедуру к каждой динамически созданной команде.
  3. Внутри обработчика вызываем нужный нам ОбщийМодуль, передавая имя команды для идентификации нужного действия.

Посмотрим на пример кода для реализации такого подхода:


// В модуле формы создаем обработчик
&НаКлиенте
Процедура ОбработкаНажатияДинамическойКнопки(Команда)
    // Вызываем функцию общего модуля, передавая имя нажатой команды
    ОбщийМодульСервис.ВыполнитьДействие(Команда.Имя);
КонецПроцедуры

// При добавлении кнопок в коде:
Команда = ЭтаФорма.Команды.Добавить("МояДинамическаяКнопка1");
Команда.Действие = "ОбработкаНажатияДинамическойКнопки";

Кнопка = Элементы.Добавить("Кнопка1", Тип("КнопкаФормы"), Элементы.ГруппаКнопок);
Кнопка.Команда = "МояДинамическаяКнопка1";

Решение 2: Использование глобальных команд

Если вы не хотите добавлять код непосредственно в модули форм, можно использовать механизм ОбщиеКоманды. Это решение позволяет вынести логику на уровень конфигурации.

Суть метода заключается в следующем:

  1. Создается ОбщаяКоманда, обработчик которой прописан в общем модуле.
  2. При создании кнопки на форме программно, в свойство ИмяКоманды записывается строка вида "ОбщаяКоманда.ИмяВашейКоманды".
  3. Внутри общего модуля, к которому привязана команда, вы можете получить доступ к форме-источнику через параметр ПараметрыВыполненияКоманды.Источник.

Анализируя ТекущийЭлемент источника, вы можете определить, какая именно кнопка была нажата, и выполнить соответствующий алгоритм.

Современный подход: Расширения конфигурации

Если ваша задача — добавить функционал в типовую форму без изменения конфигурации, лучше всего использовать Расширения. В расширении вы можете:

Этот метод является самым «чистым» с точки зрения поддержки обновлений. Вы не затрагиваете исходный код типовых модулей, а просто дополняете форму необходимыми элементами и логикой.

Рекомендации по реализации

Для управления большим количеством динамических кнопок рекомендуем:

Комбинируя эти подходы, вы сможете создать гибкий и масштабируемый интерфейс, который будет легко поддерживать и развивать в будущем.

← На главную