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