Разработка и Конфигурация · 10 мин
Как заменить процедуру в расширении 1С
Как заменить процедуру типовой конфигурации в расширении 1С: аннотации ИзменениеИКонтроль, Вместо, Перед, После, примеры кода и типичные ошибки.
Расширение конфигурации — штатный механизм платформы 1С:Предприятие 8.3, который позволяет изменить поведение типовой конфигурации без снятия её с поддержки. Одна из самых частых задач — заменить или доработать процедуру из типового модуля: добавить свою проверку, изменить алгоритм расчёта или полностью переопределить логику. Для этого используются аннотации заимствования: &ИзменениеИКонтроль, &Вместо, &Перед и &После.
Выбор аннотации определяет, как именно ваш код будет работать относительно типового: дополнит его, обернёт с возможностью вызова оригинала или полностью подменит. Ошибка на этом этапе приводит либо к двойному выполнению логики, либо к потере типового поведения, либо к падению расширения после обновления конфигурации.
Ниже разобран полный цикл работы: от создания расширения и заимствования процедуры до проверки результата и подготовки к обновлению конфигурации поставщика.
Когда нужна замена процедуры и какой способ выбрать
Прежде чем заимствовать процедуру, определите характер доработки. Если нужно выполнить дополнительные действия до или после типового кода, не трогая его сам, достаточно аннотаций &Перед или &После — они не требуют копирования типового текста и почти не ломаются при обновлениях.
Если нужно изменить часть логики внутри процедуры, но сохранить остальное поведение, подходит &ИзменениеИКонтроль: вы копируете типовой текст и вызываете его из своей обёртки. Полная замена через &Вместо оправдана только когда типовой алгоритм принципиально не подходит и вы готовы сопровождать свой вариант при каждом обновлении.
Как выбрать аннотацию
Создание расширения и подключение к конфигурации
Откройте конфигуратор, перейдите в меню «Конфигурация → Расширения конфигурации» и создайте новое расширение. Задайте имя, префикс (он добавляется к именам заимствованных объектов) и назначение. Для клиент-серверных баз сохраните расширение в файл через кнопку «Сохранить в файл», чтобы иметь резервную копию до начала работ.
Затем найдите в дереве типовой конфигурации нужный модуль (общий модуль, модуль объекта, модуль формы), щёлкните по нему правой кнопкой и выберите «Добавить в расширение». После этого модуль появится в дереве расширения, и в нём можно заимствовать отдельные процедуры и функции.
Заимствование процедуры с аннотацией «ИзменениеИКонтроль»
В модуле расширения откройте список процедур заимствованного модуля, найдите нужную и в свойствах установите способ заимствования «ИзменениеИКонтроль». Платформа скопирует типовой текст процедуры в расширение и пометит его как контролируемый — при обновлении конфигурации вы увидите, изменился ли оригинал.
Скопированный код становится «типовой частью» вашей обёртки. Свою логику добавьте до, после или вокруг вызова этой части. Например, чтобы дополнить расчёт скидки своими условиями, структура будет такой:
&ИзменениеИКонтроль("РассчитатьСуммуСкидки")
Процедура Расш1_РассчитатьСуммуСкидки(ПараметрыРасчета, Результат)
// Вызов типовой реализации
РассчитатьСуммуСкидки(ПараметрыРасчета, Результат);
// Собственная доработка
Если ПараметрыРасчета.Свойство("ПостоянныйКлиент")
И ПараметрыРасчета.ПостоянныйКлиент Тогда
Результат = Результат * 1.05;
КонецЕсли;
КонецПроцедуры
Ключевой момент: вызов типовой процедуры внутри обёртки выполняется по исходному имени без префикса расширения. Если забудете этот вызов, типовая логика не выполнится вообще — это одна из самых распространённых ошибок.
Полная замена процедуры через аннотацию «Вместо»
Аннотация &Вместо полностью подменяет типовую процедуру: выполняется только ваш код. Сигнатура (имя, параметры, их порядок) должна точно совпадать с типовой, иначе вызовы из других модулей сломаются. Экспортные процедуры сохраняют директиву Экспорт.
&Вместо("СформироватьТекстПисьма")
Функция Расш1_СформироватьТекстПисьма(ЗаказКлиента) Экспорт
Текст = "Уважаемый клиент, ваш заказ №"
+ ЗаказКлиента.Номер + " принят в работу.";
Возврат Текст;
КонецФункции
Применяйте &Вместо осознанно: вы берёте на себя всю функциональность оригинала, включая обработку редких сценариев, о которых легко забыть. После каждого обновления типовой конфигурации сверяйте, не появились ли в оригинале новые ветки логики, которые нужно перенести в вашу реализацию.
Точечная доработка через «Перед» и «После»
Если типовой код менять не нужно, заимствуйте процедуру с аннотацией &Перед или &После. Ваша процедура получит те же параметры, что и типовая, и выполнится соответственно до или после неё. Менять параметры, переданные по значению, бессмысленно — типовая процедура этого не увидит.
&После("ПриЗаписи")
Процедура Расш1_ПриЗаписи(Отказ)
Если Не Отказ Тогда
// Отправка уведомления после успешной записи
КонецЕсли;
КонецПроцедуры
Ограничение: из обработчиков &Перед и &После нельзя вызвать типовую процедуру в нужный момент или пропустить её выполнение (кроме установки Отказ = Истина в обработчиках событий, где это предусмотрено). Если нужен контроль над самим вызовом — переходите на &ИзменениеИКонтроль.
Проверка результата и контрольные точки
После написания кода обновите конфигурацию базы данных (F7) и проверьте, что расширение применилось без ошибок. Откройте «Все функции → Стандартные → Управление расширениями конфигурации» в режиме предприятия и убедитесь, что расширение активно и не помечено как неприменимое.
Протестируйте изменённую процедуру на реальных сценариях: выполните типовую операцию (проведение документа, расчёт, формирование печатной формы) и убедитесь, что результат соответствует ожиданиям. Проверьте также смежные механизмы, которые вызывают ту же процедуру, — замена действует глобально, во всех точках вызова.
Как проверить результат
Расширение активно, ошибок применения нет
Пометка о несовместимости или отключении
Операция завершается, результат учитывает доработку
Ошибка выполнения или старый результат
Другие вызовы процедуры работают корректно
Падение в неожиданных местах из-за полной замены
Нет новых ошибок от расширения
Ошибки компиляции модуля или вызова процедуры
Типичные ошибки и подготовка к обновлению
Перед обновлением типовой конфигурации выгрузите расширение в файл. После обновления откройте расширение в конфигураторе: платформа покажет заимствованные методы, у которых изменился контролируемый типовой текст. Для каждого такого метода сравните новую версию с той, что была при разработке, и при необходимости скорректируйте свою обёртку.
Полезная практика — минимизировать количество заимствований &Вместо и &ИзменениеИКонтроль. Чем меньше скопированного типового кода в расширении, тем дешевле его сопровождение. Часто доработку можно вынести в собственный общий модуль расширения и вызывать из короткой обёртки.
Что важно запомнить
Для замены процедуры добавьте модуль в расширение и заимствуйте метод с подходящей аннотацией: &Перед/&После для дополнения, &ИзменениеИКонтроль для изменения с сохранением типового вызова, &Вместо для полной подмены. Тестируйте на копии базы и после каждого обновления типовой конфигурации проверяйте контролируемые методы.
Частые вопросы
Можно ли заменить процедуру, если конфигурация полностью на поддержке?
Да, именно для этого и предназначены расширения. Конфигурация остаётся на полной поддержке поставщика, все доработки хранятся отдельно в расширении и не мешают штатному обновлению.
Что произойдёт с расширением при обновлении типовой конфигурации?
Расширение продолжит работать, если сигнатуры заимствованных методов не изменились. Если типовая процедура была переименована, удалена или изменила параметры, расширение будет помечено как неприменимое и потребует доработки. Методы с контролем изменений нужно сверить вручную даже при отсутствии ошибок.
Можно ли в одном расширении заимствовать одну и ту же процедуру дважды?
Нет, в рамках одного расширения метод заимствуется один раз с одной аннотацией. Если нужно несколько разных доработок одной процедуры, объедините их внутри единственной обёртки.
Чем расширение лучше прямого изменения конфигурации?
При прямом изменении конфигурация частично или полностью снимается с поддержки, и каждое обновление превращается в ручное объединение изменений. Расширение хранит доработки отдельно, обновление остаётся штатным, а контроль изменений подсвечивает только реально затронутые методы.
Работает ли замена процедур в модулях форм?
Да, формы и их модули тоже заимствуются в расширение. Для обработчиков событий формы доступны те же аннотации. Учитывайте, что заимствованная форма подвержена изменениям при обновлении сильнее, чем программные модули, поэтому её нужно проверять особенно тщательно.
Как отладить процедуру в расширении?
Так же, как обычный код: установите точку останова в модуле расширения и запустите отладку из конфигуратора. Убедитесь, что в свойствах расширения разрешено использование в отладке и что сеанс запущен под нужным пользователем с активным расширением.