Разработка на управляемых формах 1С:Предприятие 8.3 часто ставит перед программистом задачу автоматизации. Представим ситуацию: у вас есть 15, 20 или даже 100 форм, в которые нужно добавить однотипный функционал — например, проверку заполнения поля или специфическую логику при нажатии кнопки. Первое естественное желание любого разработчика — вынести логику в общий модуль и программно назначить его процедуру в качестве обработчика события. Однако здесь мы сталкиваемся с жестким ограничением платформы.
В этой статье мы подробно разберем, почему стандартный метод УстановитьДействие не позволяет напрямую обращаться к общим модулям, и рассмотрим проверенные способы решения этой задачи, включая архитектурные паттерны и возможности современных версий платформы.
Рассмотрим стандартную попытку назначить обработчик программно. Для этого в платформе существует метод УстановитьДействие. Синтаксис метода предполагает два параметра: имя события (например, "ПриИзменении") и имя процедуры.
Главная сложность заключается в том, что вторым параметром платформа принимает только строку, содержащую имя экспортной процедуры, которая обязана располагаться строго в модуле самой формы. Попытка передать конструкцию вида "ОбщийМодульКлиент.ИмяПроцедуры" приведет к ошибке выполнения, так как платформа не сможет найти этот обработчик в контексте формы.
Проанализируем ситуацию: это ограничение продиктовано архитектурой управляемого приложения. Платформе необходимо четко контролировать контекст выполнения и клиент-серверное взаимодействие. Обработчик в модуле формы гарантирует наличие доступа к реквизитам формы и её элементам напрямую через ЭтотОбъект или ЭтаФорма.
Если нам необходимо массово внедрить обработчик во множество форм, мы можем использовать механизм «универсального посредника». Разберем этот подход по шагам:
Посмотрим на пример кода, который мы можем разместить в общем модуле для программного создания кнопки и назначения ей действия:
// Процедура в общем модуле (Сервер)
Процедура ДобавитьКомандуНаФорму(Форма) Экспорт
// Создаем команду формы
НоваяКоманда = Форма.Команды.Добавить("УниверсальнаяКоманда");
НоваяКоманда.Действие = "Подключаемый_ВыполнитьДействие"; // Имя процедуры в модуле формы
// Создаем кнопку и привязываем к команде
НовыйЭлемент = Форма.Элементы.Добавить("КнопкаДействия", Тип("КнопкаФормы"), Форма.Элементы.ГруппаКоманднаяПанель);
НовыйЭлемент.ИмяКоманды = "УниверсальнаяКоманда";
КонецПроцедуры
Теперь в модуле каждой из 15 форм нам достаточно разместить один и тот же шаблонный код:
&НаКлиенте
Процедура Подключаемый_ВыполнитьДействие(Команда)
// Вызываем логику из общего модуля, передавая форму
ОбщийМодульКлиент.ОсновнаяЛогика(ЭтаФорма, Команда);
КонецПроцедуры
Хотя нам все еще нужно добавить код в модуль формы, этот метод позволяет централизовать всю бизнес-логику в одном месте — в общем модуле ОбщийМодульКлиент.
Выясним, как автоматизировать процесс, если мы не хотим вручную менять каждую форму. Начиная с версии платформы 8.3.9, расширения позволяют внедряться в модули форм массово. Мы можем использовать аннотацию &После для события ПриСозданииНаСервере.
Рассмотрим алгоритм действий:
Преимущество этого метода в том, что основная конфигурация остается на поддержке, а логика внедрения элементов становится прозрачной. Однако ограничение на нахождение процедуры-обработчика в модуле формы (даже если это модуль формы в расширении) сохраняется.
Проанализируем наиболее продвинутый способ, который используется в Библиотеке стандартных подсистем (БСП). Если ваша конфигурация построена на базе БСП, вам не нужно изобретать велосипед. В библиотеке уже реализован механизм подключаемых команд.
Как это работает в БСП:
Подключаемый_ВыполнитьКоманду.Это и есть тот самый «автоматизированный способ», который ищет автор вопроса. Если вы работаете в типовой конфигурации (УТ 11, ERP, БП 3.0), рекомендуется использовать именно этот путь, изучив документацию к подсистеме «Подключаемые команды».
Если форм действительно много (десятки или сотни), а механизмы БСП или расширений по каким-то причинам не подходят, опытные разработчики прибегают к массовой модификации файлов конфигурации. Разберем этот сценарий по шагам:
Module.bsl выбранных форм.Этот метод требует осторожности, но он позволяет за несколько секунд «пройтись» по сотням форм, добавляя в них необходимый код для вызова общего модуля.
Мы выяснили, что прямого способа сделать Элемент.УстановитьДействие("ПриИзменении", "ОбщийМодуль.Процедура") в текущей реализации платформы 1С не существует. Однако, используя паттерн «Мост», расширения или инструментарий БСП, мы можем добиться требуемого результата с минимальными трудозатратами. Выбор конкретного метода зависит от того, используете ли вы типовое решение и насколько критична чистота кода в модулях форм.