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

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

Как дополнить процедуру в 1С, не меняя типовую конфигурацию

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

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

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

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

Что такое расширение конфигурации и почему именно оно

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

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

Подготовка: создание расширения и заимствование процедуры

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

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

Порядок действий
  1. 1
    Создайте расширение: Конфигурация → Расширения конфигурации → Создать
  2. 2
    Укажите имя, синоним и префикс расширения
  3. 3
    Добавьте в расширение объект с нужным модулем
  4. 4
    Заимствуйте конкретную процедуру из модуля
  5. 5
    Добавьте аннотацию и свой код
  6. 6
    Обновите конфигурацию базы данных и проверьте работу в режиме предприятия

Аннотации &Перед, &После и &Вместо

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

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

&После("ОбработкаПроведения")

Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)

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

Возврат;

КонецЕсли;

ЗаписьЖурналаРегистрации("Проведение", , , Ссылка, "Документ проведён расширением");

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

Аннотация &ИзменениеИКонтроль для аккуратного перехвата

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

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

&ИзменениеИКонтроль("ПередЗаписью")

Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

#Вставка

Если Не ЗначениеЗаполнено(Комментарий) Тогда

Комментарий = "Заполнено расширением";

КонецЕсли;

#КонецВставки

// далее заимствованный типовой код

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

Ограничения и частые ошибки

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

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

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

Как проверить, что процедура дополнила типовую

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

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

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

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

Точка останова в процедуре расширения
Норма

Отладчик останавливается при выполнении действия

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

Точка не срабатывает — расширение не подключено или имя в аннотации не совпадает

Поведение типовой логики
Норма

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

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

Типовое поведение пропало — вероятно, использована &Вместо без вызова исходного кода

Обновление конфигурации
Норма

Расширение применяется без предупреждений

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

Конфликт заимствованных объектов — нужна актуализация после изменений вендора

Когда расширение не подходит

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

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

Как выбрать действие

Нужно добавить код до или после типовой процедурыИспользуйте &Перед или &После в расширении
Нужно вставить строки в середину типового кодаИспользуйте &ИзменениеИКонтроль с директивами #Вставка
Типовая процедура должна быть полностью замененаИспользуйте &Вместо, но зафиксируйте необходимость контроля при обновлениях
Метод недоступен для заимствованияРассмотрите изменение конфигурации или вынос логики во внешнюю обработку
Итог

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

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

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

Можно ли дополнить процедуру без расширения?

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

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

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

Может ли одна процедура дополняться несколькими расширениями?

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

Почему моя процедура в расширении не вызывается?

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

Чем &ИзменениеИКонтроль лучше &Вместо?

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