К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как заменить процедуру в расширении 1С

Как заменить процедуру типовой конфигурации в расширении 1С: аннотации ИзменениеИКонтроль, Вместо, Перед, После, примеры кода и типичные ошибки.

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

Выбор аннотации определяет, как именно ваш код будет работать относительно типового: дополнит его, обернёт с возможностью вызова оригинала или полностью подменит. Ошибка на этом этапе приводит либо к двойному выполнению логики, либо к потере типового поведения, либо к падению расширения после обновления конфигурации.

Ниже разобран полный цикл работы: от создания расширения и заимствования процедуры до проверки результата и подготовки к обновлению конфигурации поставщика.

Когда нужна замена процедуры и какой способ выбрать

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

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

Маршрут решения

Как выбрать аннотацию

Нужно добавить действия до или после типового кодаИспользуйте &Перед или &После — типовой текст не копируется
Нужно изменить часть логики, сохранив вызов типового кодаИспользуйте &ИзменениеИКонтроль и вызывайте типовую процедуру из своей обёртки
Типовой алгоритм не подходит полностьюИспользуйте &Вместо и напишите собственную реализацию с нуля
Процедура вызывается из многих мест и критична для учётаИзбегайте &Вместо, ищите точку расширения через &Перед/&После или переопределяемые модули

Создание расширения и подключение к конфигурации

Откройте конфигуратор, перейдите в меню «Конфигурация → Расширения конфигурации» и создайте новое расширение. Задайте имя, префикс (он добавляется к именам заимствованных объектов) и назначение. Для клиент-серверных баз сохраните расширение в файл через кнопку «Сохранить в файл», чтобы иметь резервную копию до начала работ.

Затем найдите в дереве типовой конфигурации нужный модуль (общий модуль, модуль объекта, модуль формы), щёлкните по нему правой кнопкой и выберите «Добавить в расширение». После этого модуль появится в дереве расширения, и в нём можно заимствовать отдельные процедуры и функции.

Заимствование процедуры с аннотацией «ИзменениеИКонтроль»

В модуле расширения откройте список процедур заимствованного модуля, найдите нужную и в свойствах установите способ заимствования «ИзменениеИКонтроль». Платформа скопирует типовой текст процедуры в расширение и пометит его как контролируемый — при обновлении конфигурации вы увидите, изменился ли оригинал.

Скопированный код становится «типовой частью» вашей обёртки. Свою логику добавьте до, после или вокруг вызова этой части. Например, чтобы дополнить расчёт скидки своими условиями, структура будет такой:

&ИзменениеИКонтроль("РассчитатьСуммуСкидки")

Процедура Расш1_РассчитатьСуммуСкидки(ПараметрыРасчета, Результат)

// Вызов типовой реализации

РассчитатьСуммуСкидки(ПараметрыРасчета, Результат);

// Собственная доработка

Если ПараметрыРасчета.Свойство("ПостоянныйКлиент")

И ПараметрыРасчета.ПостоянныйКлиент Тогда

Результат = Результат * 1.05;

КонецЕсли;

КонецПроцедуры

Ключевой момент: вызов типовой процедуры внутри обёртки выполняется по исходному имени без префикса расширения. Если забудете этот вызов, типовая логика не выполнится вообще — это одна из самых распространённых ошибок.

Полная замена процедуры через аннотацию «Вместо»

Аннотация &Вместо полностью подменяет типовую процедуру: выполняется только ваш код. Сигнатура (имя, параметры, их порядок) должна точно совпадать с типовой, иначе вызовы из других модулей сломаются. Экспортные процедуры сохраняют директиву Экспорт.

&Вместо("СформироватьТекстПисьма")

Функция Расш1_СформироватьТекстПисьма(ЗаказКлиента) Экспорт

Текст = "Уважаемый клиент, ваш заказ №"

+ ЗаказКлиента.Номер + " принят в работу.";

Возврат Текст;

КонецФункции

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

Точечная доработка через «Перед» и «После»

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

&После("ПриЗаписи")

Процедура Расш1_ПриЗаписи(Отказ)

Если Не Отказ Тогда

// Отправка уведомления после успешной записи

КонецЕсли;

КонецПроцедуры

Ограничение: из обработчиков &Перед и &После нельзя вызвать типовую процедуру в нужный момент или пропустить её выполнение (кроме установки Отказ = Истина в обработчиках событий, где это предусмотрено). Если нужен контроль над самим вызовом — переходите на &ИзменениеИКонтроль.

Проверка результата и контрольные точки

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

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

Контрольные точки

Как проверить результат

Статус расширения в режиме предприятия
Норма

Расширение активно, ошибок применения нет

Тревожный признак

Пометка о несовместимости или отключении

Выполнение типовой операции
Норма

Операция завершается, результат учитывает доработку

Тревожный признак

Ошибка выполнения или старый результат

Работа смежных сценариев
Норма

Другие вызовы процедуры работают корректно

Тревожный признак

Падение в неожиданных местах из-за полной замены

Журнал регистрации
Норма

Нет новых ошибок от расширения

Тревожный признак

Ошибки компиляции модуля или вызова процедуры

Типичные ошибки и подготовка к обновлению

Типичные ошибки
01
Забыт вызов типовой процедуры внутри обёртки &ИзменениеИКонтроль — типовая логика теряется полностью
02
Несовпадение сигнатуры при &Вместо — ошибки в местах вызова после обновления типовой конфигурации
03
Попытка изменить параметр, переданный по значению, в обработчике &Перед — изменение не доходит до типового кода
04
Игнорирование предупреждения о контроле после обновления — расширение работает со старой версией алгоритма
05
Замена критичной процедуры через &Вместо без анализа всех точек вызова — скрытые сбои в редких сценариях

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

Полезная практика — минимизировать количество заимствований &Вместо и &ИзменениеИКонтроль. Чем меньше скопированного типового кода в расширении, тем дешевле его сопровождение. Часто доработку можно вынести в собственный общий модуль расширения и вызывать из короткой обёртки.

Итог

Что важно запомнить

Для замены процедуры добавьте модуль в расширение и заимствуйте метод с подходящей аннотацией: &Перед/&После для дополнения, &ИзменениеИКонтроль для изменения с сохранением типового вызова, &Вместо для полной подмены. Тестируйте на копии базы и после каждого обновления типовой конфигурации проверяйте контролируемые методы.

Частые вопросы

Можно ли заменить процедуру, если конфигурация полностью на поддержке?

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

Что произойдёт с расширением при обновлении типовой конфигурации?

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

Можно ли в одном расширении заимствовать одну и ту же процедуру дважды?

Нет, в рамках одного расширения метод заимствуется один раз с одной аннотацией. Если нужно несколько разных доработок одной процедуры, объедините их внутри единственной обёртки.

Чем расширение лучше прямого изменения конфигурации?

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

Работает ли замена процедур в модулях форм?

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

Как отладить процедуру в расширении?

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