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