Почему не срабатывает процедура в расширении 1С и как правильно перехватывать методы через &Вместо

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

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

Правильное заимствование общего модуля

Прежде чем приступать к изменению конкретной процедуры, необходимо правильно добавить сам ОбщийМодуль в расширение. Важно понимать различие между созданием нового модуля и заимствованием существующего. Если вы просто создадите в расширении модуль с таким же именем, система может воспринимать их как разные объекты, и механизмы перехвата (аннотации) работать не будут.

Для корректного заимствования выполним следующие действия:

  1. Откроем дерево конфигурации и дерево расширения.
  2. Найдем нужный ОбщийМодуль в основной конфигурации.
  3. Нажмем на нем правой кнопкой мыши и выберем пункт Добавить в расширение.

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

Как добавить метод (процедуру или функцию) в расширение

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

Разберем алгоритм добавления метода:

  1. Зайдем в текст типового общего модуля (в основной конфигурации).
  2. Найдем нужную процедуру, например, УстановитьЦены.
  3. Нажмем правой кнопкой мыши на заголовке процедуры (на слове Процедура или на имени).
  4. Выберем пункт Добавить в расширение.
  5. В появившемся окне платформа предложит выбрать тип перехвата: Перед, После или Вместо.

Если мы выбираем &Вместо, платформа автоматически создаст в модуле расширения заготовку метода. Проанализируем пример созданного кода:


&Вместо("УстановитьЦены")
Процедура идУстановитьЦены(Знач МассивВидовЦен, Знач СтруктураФормы, Знач ВидОбновленияЦен)
    // Вставить содержимое метода.
    ПродолжитьВызов(МассивВидовЦен, СтруктураФормы, ВидОбновленияЦен);
КонецПроцедуры

Обратите внимание, что имя процедуры в расширении обычно получает префикс (например, ид). Это необходимо для предотвращения конфликтов имен, при этом аннотация &Вместо четко указывает платформе, какой именно оригинальный метод мы замещаем.

Разбор работы функции ПродолжитьВызов()

При использовании аннотации &Вместо ключевым элементом является команда ПродолжитьВызов(). Рассмотрим подробнее, зачем она нужна:

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

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

Почему расширение не работает: основные причины

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

  1. Ошибки компиляции в расширении. Если в расширении есть хотя бы одна критическая ошибка (например, обращение к несуществующему реквизиту или дублирование имен объектов, как в случае с регистром из сообщения 13), расширение просто не подключится при запуске сеанса. При этом конфигуратор может позволить обновить базу, но в режиме «1С:Предприятие» расширение будет иметь статус «Не активно».
  2. Безопасный режим. По умолчанию для новых расширений включен Безопасный режим. В этом режиме накладываются серьезные ограничения на работу с файловой системой, COM-объектами и некоторыми серверными вызовами. Проанализируйте ситуацию: если ваш код требует повышенных привилегий, снимите галочку Безопасный режим в свойствах расширения.
  3. Активность расширения. Убедитесь, что в списке расширений (в конфигураторе или в режиме предприятия) установлена галочка Активно.
  4. Несовпадение параметров (сигнатуры). Если в типовой конфигурации процедура имеет вид Процедура Имя(П1, П2), а в расширении вы написали Процедура Имя(П1), аннотация &Вместо не сработает. Платформа ищет точное совпадение количества и свойств параметров (включая Знач).

Настройка отладки расширений

Часто проблема заключается не в том, что код не работает, а в том, что разработчик не может его отладить. Рассмотрим, как правильно настроить отладку для модулей расширения:

Во-первых, в параметрах конфигуратора (меню Сервис — Параметры — Запуск 1С:Предприятия — Отладка) проверьте наличие флага Использовать отладку расширений конфигурации. Без этой настройки точки останова в расширениях могут игнорироваться.

Во-вторых, если разработка ведется в клиент-серверном варианте, сервер 1С должен быть запущен с параметром -debug. В противном случае отладка на сервере (где обычно и исполняются общие модули) будет недоступна.

Рекомендации по организации кода

Когда мы добавляем процедуру через «Добавить в расширение», платформа создает пустую оболочку. Рассмотрим, как лучше переносить код:

Если ваша задача — лишь слегка изменить алгоритм, рекомендуется скопировать тело типовой функции в процедуру расширения, удалить ПродолжитьВызов() и внести свои правки. Это гарантирует, что типовой код не выполнится дважды (один раз ваш, другой раз — оригинал).

Пример полной замены логики:


&Вместо("ПостроитьДеревоЦен")
Процедура идПостроитьДеревоЦен(Форма)
    // Копируем сюда оригинальный код из типовой конфигурации
    // И вносим свои изменения в алгоритм
    // ПродолжитьВызов(Форма); // Эту строку удаляем, чтобы типовой код не запускался
КонецПроцедуры

Таким образом, для успешной работы с расширением необходимо соблюдать три условия: корректное заимствование объекта, точное соответствие сигнатуры метода и отсутствие ошибок в составе самого расширения, которые могут блокировать его запуск.

← На главную