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