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