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