Как программно проверить и назначить обработчик события элементу управления в обычных формах 1С?

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

При доработке типовых конфигураций на обычных формах разработчики часто сталкиваются с задачей динамического назначения обработчиков событий для элементов управления (табличных полей, полей ввода, кнопок). Главная сложность заключается в том, что метод УстановитьДействие полностью заменяет текущий обработчик. Если в типовой конфигурации разработчик назначит стандартный обработчик через палитру свойств, динамическое переопределение перетрет его, что приведет к нарушению логики работы формы.

Разберем, как проверить наличие уже назначенного обработчика, проанализировать его и при необходимости сохранить вызов исходного кода.

Проверка наличия назначенного обработчика через метод ПолучитьДействие

Платформа 1С:Предприятие предоставляет встроенный метод расширения элементов управления ПолучитьДействие. С его помощью мы можем узнать, назначена ли уже процедура-обработчик для конкретного события.

Синтаксис метода:

ЭлементУправления.ПолучитьДействие(ИмяСобытия)

Параметры и возвращаемое значение:

  1. ИмяСобытия (тип Строка) — обязательный параметр, имя проверяемого события (например, "ПриИзменении", "Выбор", "Нажатие").
  2. Возвращаемое значение — объект типа Действие, если обработчик задан (в свойствах элемента или ранее программно), либо Неопределено, если событие не обрабатывается.

Рассмотрим, как проверить заполненность обработчика перед назначением своего алгоритма:


ТекущееДействие = ЭлементыФормы.ТабличноеПоле.ПолучитьДействие("Выбор");

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

Обратите внимание на свойство ИмяМетода объекта Действие. Оно возвращает строковое имя процедуры модуля формы, которая назначена в качестве обработчика.

Организация цепочки вызовов: как не потерять типовой обработчик

Поскольку платформа 1С в обычных формах не поддерживает множественные обработчики на одно событие, повторный вызов УстановитьДействие полностью заменяет привязку. Если нам необходимо выполнить свой код, но при этом сохранить вызов типовой процедуры, разберем по шагам создание цепочки вызовов.

  1. При инициализации формы получаем текущее действие и сохраняем имя метода (например, в реквизит формы или переменную модуля).
  2. Назначаем собственный метод-обработчик.
  3. Внутри нашего обработчика выполняем свою логику, после чего вызываем сохраненную процедуру.

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


// В модуле формы объявляем переменную для хранения имени исходного метода
Перем ИмяТиповогоОбработчикаВыбора;

Процедура ПриОткрытии()
    
    // Получаем текущее действие элемента
    ДействиеВыбор = ЭлементыФормы.ТабличноеПоле.ПолучитьДействие("Выбор");
    
    Если ДействиеВыбор <> Неопределено Тогда
        ИмяТиповогоОбработчикаВыбора = ДействиеВыбор.ИмяМетода;
    КонецЕсли;
    
    // Назначаем собственный обработчик
    ЭлементыФормы.ТабличноеПоле.УстановитьДействие("Выбор", Новый Действие("Подключаемый_ТабличноеПолеВыбор"));
    
КонецПроцедуры

Процедура Подключаемый_ТабличноеПолеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // 1. Выполняем наш собственный алгоритм доработки
    // ...
    
    // 2. Вызываем исходный типовой обработчик, если он был назначен
    Если ЗначениеЗаполнено(ИмяТиповогоОбработчикаВыбора) Тогда
        Выполнить(ИмяТиповогоОбработчикаВыбора + "(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)");
    КонецЕсли;
    
КонецПроцедуры

Важные правила и ограничения при работе с объектом Действие

Проанализируем ключевые нюансы, которые необходимо учитывать при программном переопределении событий:

  1. Расположение процедуры: процедура, передаваемая в конструктор Новый Действие("ИмяПроцедуры"), обязательно должна находиться в модуле текущей формы. Платформа не позволяет указывать процедуры общих модулей напрямую.
  2. Сигнатура параметров: при динамическом вызове через Выполнить строго соблюдайте параметры события. Если передать неверное количество аргументов или нарушить их типы, возникнет исключение времени выполнения.
  3. Стандарты именования: согласно стандартам разработки 1С, процедурам формы, назначаемым программно через действия, рекомендуется давать префикс Подключаемый_.
← На главную