Как изменить код процедуры в общем модуле 1С через расширение?

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

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

Проблема 1: Ошибка «Процедура с таким именем уже определена»

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

Для решения этой задачи в платформе предусмотрены специальные аннотации. Вместо того чтобы просто объявлять процедуру, мы должны указать системе, как именно наше расширение должно взаимодействовать с типовым кодом. Рассмотрим наиболее популярный метод — использование аннотации &Вместо.

Пример правильного оформления перехвата:


&Вместо("ИмяТиповойПроцедуры")
Процедура префикс_ИмяТиповойПроцедуры()
    // Ваш измененный код
    // ...
КонецПроцедуры

Обратим внимание на важные детали:

  1. Аннотация: &Вместо("ИмяТиповойПроцедуры") сообщает платформе, что данная процедура расширения полностью заменяет собой оригинальную процедуру в основной конфигурации.
  2. Имя процедуры: В самом расширении имя процедуры должно отличаться от оригинала (например, добавлением префикса). Это позволяет избежать конфликта имен при компиляции модуля.
  3. Параметры: Состав и количество параметров в процедуре расширения должны в точности совпадать с параметрами оригинальной процедуры, иначе возникнет ошибка времени выполнения.

Проблема 2: Код в расширении не срабатывает (Безопасный режим)

Вы правильно прописали аннотацию, добавили префикс, конфигурация сохранилась без ошибок, но при работе программы выполнение не заходит в вашу процедуру. Проанализируем причину. Чаще всего это связано с тем, что расширение подключено в Безопасном режиме.

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

Как отключить безопасный режим:

  1. Запустите информационную базу в режиме «1С:Предприятие».
  2. Перейдите в меню «Функции для технического специалиста» (в старых версиях — «Все функции»).
  3. Найдите стандартную обработку «Управление расширениями».
  4. В списке установленных расширений найдите свое и снимите флажок «Безопасный режим».
  5. Перезапустите сеанс (в некоторых случаях изменения вступают в силу немедленно, но перезапуск гарантирует применение настроек).

Методы перехвата: выбираем оптимальный вариант

Рассмотрим подробнее, какие еще способы модификации кода существуют, помимо &Вместо. Использование правильной аннотации — залог того, что ваше расширение будет легче обновлять при выходе новых версий типовой конфигурации.

  1. &Перед (&Before): Позволяет выполнить ваш код до начала работы основной процедуры. Выясним ситуацию: если вам нужно просто проверить какие-то данные или заполнить реквизиты перед выполнением типовой логики, выбирайте этот метод.
  2. &После (&After): Код расширения выполнится сразу после завершения типовой процедуры. Это удобно для вывода дополнительных сообщений пользователю или записи логов.
  3. &ИзменениеИКонтроль (&ChangeAndControl): Это самый современный и рекомендуемый метод для внесения изменений «внутрь» больших процедур. Он позволяет не переписывать всю процедуру целиком, а только заменять или вставлять конкретные фрагменты кода. При этом платформа контролирует, не изменился ли типовой код в оригинале, что защищает от ошибок при обновлении.

Использование функции ПродолжитьВызов()

Посмотрим на пример использования аннотации &Вместо, когда нам все же нужно выполнить оригинальный код, но дополнить его своей логикой. Для этого внутри процедуры расширения мы можем использовать метод ПродолжитьВызов().


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

Этот подход часто бывает лучше, чем &Перед и &После, так как позволяет управлять логикой в одном месте и иметь доступ к локальным переменным расширения на протяжении всего процесса.

Важные требования к расширениям

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

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

← На главную