Как добавить обработчик события в расширении 1С

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

Работа с расширениями в системе 1С:Предприятие 8.3 — это стандарт современной разработки, позволяющий модифицировать типовые конфигурации без снятия их с поддержки — для ускорения этих процессов есть инструмент быстрой разработки и оптимизации решений в 1С. Однако начинающие разработчики часто сталкиваются с проблемой: кнопка создания события (так называемая «лупа») неактивна или изменения не сохраняются. Разберем по шагам, как правильно добавить обработчик события в расширении, и проанализируем технические нюансы этого процесса.

Главная причина проблем: неверный контекст открытия формы

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

Рассмотрим правильный алгоритм действий:

  1. Найдем нужный объект в основной конфигурации и добавим его в расширение (команда «Добавить в расширение»).
  2. Перейдем в дерево объектов расширения (оно обычно выделено цветом в окне конфигурации).
  3. Развернем ветку нужного объекта и найдем заимствованную форму.
  4. Откроем форму именно из этого списка. В заголовке окна конструктора формы обязательно должно быть указано имя вашего расширения.

Только в этом случае палитра свойств станет активной, и вы сможете полноценно работать с событиями. Если форма заимствована, но «лупа» все равно не активна, проверим, добавлен ли в расширение сам элемент формы (кнопка, поле ввода или список), для которого мы хотим создать событие.

Способы создания обработчика в расширении

Проанализируем три основных сценария добавления кода, в зависимости от типа элемента:

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

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

3. Программное назначение обработчика. Иногда визуального способа недостаточно, или обработчик нужно назначить динамически. В этом случае в процедуре ПриСозданииНаСервере (или в другом месте) мы используем метод УстановитьДействие.

Посмотрим на пример программного назначения:


&НаКлиенте
Процедура Расш1_ПриОткрытии(Отказ)
    // Назначаем обработчик для команды
    ЭтаФорма.Команды.ЗаписатьИЗакрыть.Действие = "Расш1_МояКомандаЗаписать";
    
    // Назначаем обработчик для элемента формы
    НовыйДействие = Новый Действие("Расш1_ПолеВводаПриИзменении");
    ЭтаФорма.Элементы.ИмяПоляВвода.УстановитьДействие("ПриИзменении", НовыйДействие);
КонецПроцедуры

Типы аннотаций и методы перехвата

Выясним, какую аннотацию выбрать при создании обработчика для заимствованного элемента. От этого зависит, когда выполнится ваш код относительно типового решения.

Если при использовании &Вместо вам все же нужно вызвать типовой код, обязательно используем команду ПродолжитьВызов(). Рассмотрим этот пример подробнее:


&Вместо("ПриЗаписи")
Процедура Расш1_ПриЗаписи(Отказ)
    // Код до выполнения типовой логики
    Сообщить("Начинаем запись объекта...");
    
    // Вызов оригинального обработчика из основной конфигурации
    ПродолжитьВызов(Отказ);
    
    // Код после выполнения типовой логики
    Если Не Отказ Тогда
        Сообщить("Объект успешно записан!");
    КонецЕсли;
КонецПроцедуры

Важные правила именования и контекста

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

Соответствие параметров. Сигнатура вашей процедуры (количество и порядок входящих параметров) должна строго совпадать с оригиналом. Если в основной конфигурации процедура ПриИзменении не имеет параметров, то и в расширении их быть не должно. Если после обновления конфигурации поставщик добавит новый параметр в процедуру, расширение перестанет работать («отвалится») до тех пор, пока вы не приведете сигнатуру в соответствие.

Префиксы расширений. Система автоматически добавляет префикс (например, Расш1_) к именам процедур. Не удаляйте его. Это гарантирует отсутствие конфликтов имен, если в конфигурацию будут добавлены другие расширения или новые процедуры в основную базу.

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

Режим совместимости и тип расширения

Если вы все делаете правильно, но возможность добавления обработчика заблокирована, проанализируем настройки самого расширения:

  1. Режим совместимости. Он не должен быть ниже, чем у основной конфигурации. В идеале установите значение «Не использовать» или приравняйте его к версии основной базы.
  2. Назначение расширения. В свойствах расширения можно выбрать: Исправление, Дополнение или Адаптация. Для полноценной работы с формами и перехвата событий лучше всего использовать вариант «Адаптация».

Соблюдение этих правил позволит вам избежать большинства типовых ошибок и корректно встроить свою бизнес-логику в любую конфигурацию 1С.

← На главную