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