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

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

Переопределяемые модули в 1С: назначение, создание и практика использования

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

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

Механизм получил массовое распространение вместе с Библиотекой стандартных подсистем (БСП) и конфигурациями, построенными на её основе: «Управление торговлей», «ERP», «Зарплата и управление персоналом» и других. В этих решениях переопределяемые модули — штатный способ встраивания прикладной логики в стандартные механизмы: обмен данными, печать, заполнение документов, обновление версий.

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

Что такое переопределяемый модуль и как он устроен

Технически переопределяемый модуль — это обычный общий модуль, который отличается от остальных только соглашением об именовании и роли в архитектуре. В конфигурациях на базе БСП такие модули обычно имеют суффикс «Переопределяемый», например: ОбменДаннымиПереопределяемый, УправлениеПечатьюПереопределяемый, ОбновлениеИнформационнойБазыПереопределяемый.

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

Сигнатуру процедуры менять нельзя: если добавить или удалить параметр, типовой вызов завершится ошибкой «Процедура или функция с указанным именем не определена» либо ошибкой несоответствия параметров. Можно менять только тело процедуры и добавлять собственные вспомогательные процедуры и функции, которые типовой код не вызывает.

Зачем нужны переопределяемые модули

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

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

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

Где применяются переопределяемые модули в типовых решениях

В конфигурациях на базе БСП переопределяемые модули сопровождают практически каждую подсистему. Знание основных из них заметно ускоряет разработку и доработку.

  • ОбновлениеИнформационнойБазыПереопределяемый — регистрация обработчиков обновления, действия при первом запуске, переходе на новую версию.
  • ОбменДаннымиПереопределяемый — настройка состава узлов планов обмена, регистрация объектов к выгрузке, обработчики конвертации.
  • УправлениеПечатьюПереопределяемый — подключение внешних печатных форм и определение команд печати для прикладных объектов.
  • ЗаполнениеОбъектовПереопределяемый — правила заполнения документов при вводе на основании.
  • РаботаВМоделиСервисаПереопределяемый и аналогичные — поведение конфигурации в сервисе.
  • ПодключаемыеКомандыПереопределяемый — расширение списков подключаемых команд в формах.

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

Как создать и использовать переопределяемый модуль

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

Порядок действий
  1. 1
    Создайте общий модуль с именем по шаблону: ИмяПодсистемы + «Переопределяемый»
  2. 2
    Установите свойства модуля: Сервер — Да, Вызов сервера — Да (если процедуры вызываются с клиента), Клиентские флаги — по необходимости
  3. 3
    Опишите процедуры и функции с фиксированными сигнатурами и подробными комментариями для тех, кто будет их заполнять
  4. 4
    В типовом коде подсистемы добавьте вызовы этих процедур в нужных точках алгоритмов
  5. 5
    Задокументируйте для разработчиков, какие процедуры и когда вызываются

Пример простого вызова из типового кода:

// Типовой модуль подсистемы

Процедура ПриЗаполненииДокумента(ДокументОбъект, ДанныеЗаполнения) Экспорт

// Стандартное заполнение

ЗаполнитьШапкуДокумента(ДокументОбъект);

// Точка расширения для прикладного кода

МояПодсистемаПереопределяемый.ПриЗаполненииДокумента(ДокументОбъект, ДанныеЗаполнения);

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

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

bsl
// Пример процедуры в переопределяемом модуле
Процедура ПриЗаполненииДокумента(ДокументОбъект, ДанныеЗаполнения) Экспорт
	Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗаказПокупателя") Тогда
		ДокументОбъект.Комментарий = "Создан автоматически";
	КонецЕсли;
КонецПроцедуры

Чем переопределяемый модуль отличается от других механизмов

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

Сравнение вариантов

Переопределяемый модуль

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

Расширение конфигурации

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

Подписка на событие

Подходит для реакции на запись, проведение, удаление объектов. Ограничение: не заменяет встраивание в середину алгоритма, срабатывает на стандартных событиях.

Прямая правка типового модуля

Даёт полную свободу, но усложняет обновление: каждое изменение придётся сравнивать и переносить вручную.

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

Типичные ошибки и риски при работе с переопределяемыми модулями

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

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

Как проверить корректность доработки

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

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

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

Вызов процедуры
Норма

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

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

Процедура не вызывается: возможно, изменено имя или модуль недоступен в нужном контексте

Поведение типовых сценариев
Норма

Стандартные операции завершаются без ошибок и дают ожидаемый результат с учётом доработки

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

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

Поведение при пустых данных
Норма

Процедура корректно отрабатывает при незаполненных параметрах и отсутствии данных

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

Ошибки обращения к пустым ссылкам и неинициализированным значениям

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

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

Частые вопросы о переопределяемых модулях

Чем переопределяемый модуль отличается от обычного общего модуля?

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

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

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

Что будет, если удалить процедуру из переопределяемого модуля?

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

Меняются ли переопределяемые модули при обновлении конфигурации?

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

Как понять, какие процедуры переопределяемого модуля нужно заполнить?

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

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

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

Итог

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

Переопределяемый модуль — это общий модуль с зафиксированными сигнатурами процедур, которые вызывает типовой код и которые разработчик заполняет своей логикой. Меняйте только тела процедур, не трогайте сигнатуры и не удаляйте процедуры, а перед обновлением конфигурации сравнивайте модуль с новой поставкой.