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