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

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

Как добавить модуль объекта в расширение 1С

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

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

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

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

Что такое модуль объекта и где он живёт в расширении

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

В расширении конфигурации собственные объекты (добавленные через «Добавить → Справочник/Документ») получают полный набор модулей: модуль объекта, модуль менеджера, модули форм. Код в них компилируется и выполняется вместе с основной конфигурацией, при этом контекст объекта полностью доступен — реквизиты, табличные части, движения.

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

Как добавить модуль объекта для собственного объекта расширения

Если задача — добавить в расширение новый объект с собственной логикой, последовательность стандартная и не отличается от работы в основной конфигурации. Сначала откройте расширение в конфигураторе: «Конфигурация → Расширения конфигурации», затем откройте нужное расширение двойным щелчком.

Создайте объект: в дереве расширения нажмите правой кнопкой на ветке «Справочники» или «Документы» и выберите «Добавить». Задайте имя, представление, при необходимости добавьте реквизиты и табличные части. После этого выделите объект, нажмите правую кнопку и выберите «Открыть модуль объекта» — откроется пустой модуль с доступными обработчиками событий.

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

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

Ответственный = Пользователи.ТекущийПользователь();

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

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

Порядок действий для собственного объекта
  1. 1
    Откройте расширение в конфигураторе
  2. 2
    Добавьте новый справочник или документ в дереве расширения
  3. 3
    Настройте реквизиты и табличные части объекта
  4. 4
    Правой кнопкой по объекту → «Открыть модуль объекта»
  5. 5
    Добавьте обработчики событий и процедуры
  6. 6
    Выполните проверку расширения и обновите конфигурацию БД
  7. 7
    Протестируйте запись и проведение объекта в режиме Предприятия

Почему у заимствованного объекта нет модуля объекта

Главный вопрос, с которым сталкиваются при этой задаче: «Я добавил типовой документ в расширение, где его модуль объекта?» Ответ — его там нет и не будет. Платформа сознательно не позволяет расширять модули объектов и менеджеров заимствованных метаданных.

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

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

Как заменить логику модуля объекта обработчиками событий

Основной рабочий приём — подключение обработчиков событий заимствованного объекта прямо в расширении. Выделите заимствованный объект в дереве расширения, откройте палитру свойств и найдите раздел «События». Для событий «ОбработкаЗаполнения», «ПередЗаписью», «ПриЗаписи», «ОбработкаПроведения» и других доступно назначение собственной процедуры-обработчика.

Нажмите кнопку выбора у нужного события, и платформа создаст процедуру-обработчик в общем модуле расширения (или предложит создать модуль). Сигнатура обработчика получает источник события первым параметром, что позволяет работать с объектом почти так же, как в его собственном модуле:

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

Если Источник.Товары.Количество() = 0 Тогда

Отказ = Истина;

Сообщить("Документ не может быть записан без товаров.");

КонецЕсли;

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

Обратите внимание на несколько правил. Общий модуль с обработчиками должен иметь флаги «Сервер» и, как правило, «Вызов сервера» — если событие инициируется из клиентского контекста. Имя процедуры должно быть уникальным в пределах расширения, стандартный префикс вида «Расш1_» добавляется автоматически и помогает отличать код расширения от типового.

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

bsl
Процедура Расш1_ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
	Для Каждого Строка Из Источник.Товары Цикл
		Если Строка.Количество < 0 Тогда
			Отказ = Истина;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Общие модули и подписки на события как альтернатива

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

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

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

Способы добавить логику к объекту

Собственный объект с модулем

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

Обработчики событий заимствованного объекта

Точечная доработка конкретного типового объекта. Не заменяет типовую логику, а дополняет её.

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

Одна логика для группы объектов. Удобны для сквозных проверок и заполнения, но требуют аккуратности с производительностью.

Доработка основной конфигурации

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

Проверка результата и отладка

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

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

Отдельно проверьте, что расширение активно: «Все функции → Стандартные → Управление расширениями конфигурации» — расширение должно быть подключено, без признака несовместимости. Если расширение отключилось из-за изменения структуры данных, обработчики молча перестанут работать, и это выглядит как «код не выполняется».

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

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

Расширение в списке подключённых
Норма

Стоит флажок «Используется», нет предупреждений о несовместимости

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

Расширение отключено или помечено как несовместимое с текущей версией

Срабатывание обработчика
Норма

При записи/проведении объекта выполняется код расширения, виден результат или сообщение

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

Объект ведёт себя как типовой, код не вызывается

Проверка конфигурации
Норма

Проверка расширения завершается без ошибок компиляции модулей

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

Ошибки вида «Процедура или функция не обнаружена»

Поведение после обновления типовой
Норма

Обработчики продолжают работать после обновления конфигурации

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

После обновления события не назначены, свойства сброшены

Типичные ошибки и ограничения

Самая частая ошибка — попытка найти модуль объекта у заимствованного объекта и вывод, что «расширение сломалось». Это ограничение платформы, и обходится оно только обработчиками событий. Вторая типичная проблема — обработчик назначен на событие, но общий модуль не имеет флага «Сервер»: при записи объекта на сервере процедура просто не будет найдена.

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

Из ограничений стоит помнить: в расширениях с назначением «Исправление» или «Адаптация» набор возможностей может отличаться; расширения в безопасном режиме ограничены в доступе к файловой системе и внешним ресурсам; при обновлении типовой конфигурации заимствованные объекты с изменённой структурой могут потребовать повторной адаптации расширения.

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

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

Можно ли открыть модуль объекта типового документа в расширении?

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

В каком порядке выполняются обработчики: типовой или из расширения?

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

Почему процедура-обработчик не вызывается, хотя событие назначено?

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

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

Да, но только по регистрам, созданным в самом расширении. В обработчике «ОбработкаПроведения» вы формируете движения по собственным регистрам накопления или сведений. Добавить движения в типовые регистры документа через расширение нельзя.

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

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

Когда вместо расширения лучше доработать основную конфигурацию?

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

Итог

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

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