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

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

Модуль объекта в 1С: что это и для чего нужен

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

Модуль объекта в 1С — это контейнер программного кода, привязанный к конкретному объекту конфигурации: справочнику, документу, плану счетов, регистру и так далее. Код в нём выполняется тогда, когда система или пользователь работает с самим объектом: создаёт его, записывает, проводит, удаляет. Именно здесь разработчик описывает бизнес-логику, которая должна срабатывать независимо от того, как именно изменяется объект — через форму, программно, при обмене данными или загрузке из файла.

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

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

Где находится модуль объекта и как его открыть

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

Чтобы открыть модуль, в конфигураторе разверните ветку нужного типа объектов, кликните правой кнопкой по конкретному объекту и выберите пункт «Открыть модуль объекта». Альтернатива — вкладка «Дополнительно» в палитре свойств объекта, где доступны переходы ко всем его модулям. Если пункт неактивен, проверьте, что конфигурация открыта на изменение и объект не находится на поддержке с запретом редактирования.

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

Какие события обрабатываются в модуле объекта

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

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

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

Чем модуль объекта отличается от модуля формы и модуля менеджера

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

МодульКогда выполняетсяЧто размещать
Модуль объектаПри любых операциях с объектом — интерактивных и программныхПроверки данных, проведение, контроль целостности
Модуль формыТолько пока открыта форма объектаУправление видимостью элементов, оформление, реакции на действия пользователя
Модуль менеджераВыполняется без привязки к конкретному экземпляруЗапросы к коллекциям, печатные формы, обработчики получения данных выбора
Общий модульВызывается из любого места конфигурацииБиблиотечные процедуры и функции, переиспользуемая логика

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

Типовые сценарии использования

Проверка и контроль данных

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

// ОбработкаПроверкиЗаполнения

Если Товары.Итог("Сумма") > ЛимитПоДоговору Тогда

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

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Сумма документа превышает лимит по договору";

Сообщение.Сообщить();

КонецЕсли;

Автоматическое заполнение реквизитов

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

Проведение и движения по регистрам

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

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

Особенности выполнения: сервер, контекст, права

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

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

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

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

Типичные ошибки
01
Размещение бизнес-логики в модуле формы: при программной записи объекта обработкой или обменом логика не срабатывает, и в базе появляются некорректные данные
02
Вызов Записать() внутри обработчика ПередЗаписью или ПриЗаписи: это вызывает рекурсию и завершение сеанса с ошибкой
03
Обращение к элементам формы или модальным диалогам: на сервере эти вызовы недоступны и приводят к ошибке выполнения
04
Тяжёлые запросы и циклы в обработчиках записи: увеличивают время транзакции и провоцируют блокировки при параллельной работе
05
Проверки только через свойство «Проверка заполнения» реквизита без обработчика: не покрывают сложные условия, зависящие от нескольких полей

Отдельно стоит упомянуть рекурсивную запись: если в ПриЗаписи объекта А записывается объект Б, а в ПриЗаписи объекта Б — снова объект А, система попадёт в бесконечный цикл. Такие связи разрывают флагами-реквизитами, параметрами сеанса или дополнительными свойствами объекта (ДополнительныеСвойства.Вставить("НеЗаписыватьСвязанные", Истина)).

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

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

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

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

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

Запись документа с нарушением правила
Норма

Запись отклонена, пользователь видит понятное сообщение

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

Документ записывается, нарушение попадает в базу

Программная запись из обработки
Норма

Срабатывают те же проверки, что и при интерактивной записи

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

Проверки пропускаются — логика находится в модуле формы

Проведение документа
Норма

Движения по регистрам соответствуют табличной части, остатки контролируются

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

Движения дублируются, отсутствуют или не очищаются при отмене проведения

Время записи при параллельной работе
Норма

Запись занимает доли секунды, конфликтов блокировок нет

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

В журнале регистрации ошибки превышения времени ожидания блокировки

FAQ: частые вопросы о модуле объекта

Чем модуль объекта отличается от модуля набора записей?

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

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

Да, если процедура объявлена с ключевым словом Экспорт. Получите объект через ссылку (Ссылка.ПолучитьОбъект()) и вызовите метод. Учитывайте, что ПолучитьОбъект() загружает весь объект в память — для массовой обработки это затратно, и часть операций лучше переносить в модуль менеджера.

Почему обработчик ПередЗаписью не срабатывает при записи из моей обработки?

Чаще всего причина в том, что обработка работает не с объектом, а напрямую с набором записей или использует обмен данными с признаком ОбменДанными.Загрузка = Истина. В режиме загрузки большинство проверок и обработчиков намеренно пропускается — это штатное поведение для ускорения обменов.

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

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

Где размещать код печатной формы документа — в модуле объекта?

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

Итог

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

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