Разработка и Конфигурация · 11 мин
Модуль объекта в 1С: что это и для чего нужен
Модуль объекта в 1С: назначение, события, отличия от модуля формы и модуля менеджера. Практические примеры кода, типичные ошибки и рекомендации для разработчиков.
Модуль объекта в 1С — это контейнер программного кода, привязанный к конкретному объекту конфигурации: справочнику, документу, плану счетов, регистру и так далее. Код в нём выполняется тогда, когда система или пользователь работает с самим объектом: создаёт его, записывает, проводит, удаляет. Именно здесь разработчик описывает бизнес-логику, которая должна срабатывать независимо от того, как именно изменяется объект — через форму, программно, при обмене данными или загрузке из файла.
Главная причина существования модуля объекта — гарантия целостности данных. Если правило «при проведении документа списывать товар со склада» записать только в модуле формы, оно сработает лишь при интерактивной работе пользователя. А тот же документ, проведённый обработкой загрузки или обменом, пройдёт мимо этой логики. Код в модуле объекта выполняется всегда, поэтому все проверки, заполнение реквизитов и движения по регистрам принято размещать именно здесь.
Открыть модуль объекта можно в конфигураторе: выделите нужный объект в дереве конфигурации, нажмите правую кнопку мыши и выберите «Открыть модуль объекта». Внутри доступны предопределённые процедуры — обработчики событий жизненного цикла объекта, а также возможность объявлять собственные экспортные процедуры и функции, расширяя программный интерфейс объекта.
Где находится модуль объекта и как его открыть
Модуль объекта существует у тех типов конфигурации, которые порождают самостоятельные сущности базы данных: справочники, документы, планы видов характеристик, планы счетов, планы видов расчёта, бизнес-процессы, задачи, планы обмена. У регистров своя разновидность — модуль набора записей, работающий по похожему принципу.
Чтобы открыть модуль, в конфигураторе разверните ветку нужного типа объектов, кликните правой кнопкой по конкретному объекту и выберите пункт «Открыть модуль объекта». Альтернатива — вкладка «Дополнительно» в палитре свойств объекта, где доступны переходы ко всем его модулям. Если пункт неактивен, проверьте, что конфигурация открыта на изменение и объект не находится на поддержке с запретом редактирования.
При работе с типовой конфигурацией на поддержке изменения в модуле объекта снимут объект с полной поддержки. Безопасная альтернатива — расширение конфигурации, где модуль объекта заимствуется и дополняется собственными обработчиками с аннотациями «Перед», «После» или «Вместо».
Какие события обрабатываются в модуле объекта
Система вызывает обработчики в строгом порядке в ходе жизненного цикла объекта. Понимание этой последовательности — ключ к правильному размещению кода. Наиболее востребованные события:
- ПередЗаписью — последняя точка, где можно изменить данные объекта или отказаться от записи, установив параметр Отказ в Истина.
- ПриЗаписи — объект уже записан в транзакции, уместно обновлять связанные данные.
- ОбработкаЗаполнения — начальное заполнение реквизитов при создании объекта или вводе на основании.
- ОбработкаПроверкиЗаполнения — собственные проверки обязательных и согласованных данных.
- ОбработкаПроведения — формирование движений по регистрам (только для документов).
- ОбработкаУдаленияПроведения — действия при отмене проведения.
- ПередУдалением — контроль и очистка связанных данных перед удалением.
- ПриКопировании — корректировка реквизитов при копировании объекта.
Порядок вызова при проведении документа выглядит так: ОбработкаПроверкиЗаполнения → ПередЗаписью → ПриЗаписи → ОбработкаПроведения. Если на любом этапе установлен Отказ, цепочка прерывается, транзакция откатывается, и объект остаётся в прежнем состоянии.
Чем модуль объекта отличается от модуля формы и модуля менеджера
Новички часто размещают логику не в том модуле, и это источник большинства ошибок. Различия принципиальны:
| Модуль | Когда выполняется | Что размещать |
|---|---|---|
| Модуль объекта | При любых операциях с объектом — интерактивных и программных | Проверки данных, проведение, контроль целостности |
| Модуль формы | Только пока открыта форма объекта | Управление видимостью элементов, оформление, реакции на действия пользователя |
| Модуль менеджера | Выполняется без привязки к конкретному экземпляру | Запросы к коллекциям, печатные формы, обработчики получения данных выбора |
| Общий модуль | Вызывается из любого места конфигурации | Библиотечные процедуры и функции, переиспользуемая логика |
Практическое правило: если логика касается данных объекта и должна работать всегда — ей место в модуле объекта. Если она касается только отображения на экране — в модуле формы. Если работает с множеством объектов без создания экземпляра — в модуле менеджера. Повторно используемый код выносится в общие модули.
Типовые сценарии использования
Проверка и контроль данных
Классическая задача — запретить запись документа с некорректными данными. В обработчике ОбработкаПроверкиЗаполнения проверяются условия, которые нельзя выразить свойствами реквизитов: например, сумма по табличной части не должна превышать лимит договора, а дата документа — выходить за границы периода.
// ОбработкаПроверкиЗаполнения
Если Товары.Итог("Сумма") > ЛимитПоДоговору Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сумма документа превышает лимит по договору";
Сообщение.Сообщить();
КонецЕсли;
Автоматическое заполнение реквизитов
В обработчике ОбработкаЗаполнения задаются значения по умолчанию: ответственный, склад, организация, валюта. Параметр ДанныеЗаполнения содержит основание при вводе на основании — это позволяет перенести данные из документа-источника.
Проведение и движения по регистрам
ОбработкаПроведения — главное место модуля объекта для документов. Здесь формируются записи в регистрах накопления, сведений и бухгалтерии. Стандартный подход — установить Движения.Регистр.Записывать = Истина, заполнить движения циклом по табличной части и при необходимости выполнить контроль остатков.
- 1Откройте конфигуратор, найдите объект и откройте его модуль объекта
- 2Добавьте обработчик ОбработкаПроверкиЗаполнения через меню «Текст — Процедуры и функции» или вручную
- 3Опишите условие и установите Отказ = Истина при нарушении, выведите понятное сообщение пользователю
- 4Обновите конфигурацию базы данных (F7)
- 5Проверьте срабатывание: при интерактивной записи и при программной записи объекта из обработки
Особенности выполнения: сервер, контекст, права
Модуль объекта в клиент-серверном режиме исполняется на сервере. Это накладывает ограничения: в нём недоступны элементы формы, диалоги открытия файлов и другие интерактивные механизмы. Попытка вызвать модальное окно или обратиться к реквизиту формы приведёт к ошибке выполнения.
Внутри модуля доступны все реквизиты и табличные части объекта напрямую по имени, а также объектные методы: Записать(), ПроверитьЗаполнение(), УстановитьНовыйНомер(). Экспортные переменные, процедуры и функции, объявленные в модуле, становятся частью программного интерфейса объекта и доступны извне через ссылку на объект.
Учитывайте права: код модуля объекта выполняется в контексте текущего пользователя. Если у пользователя нет прав на регистр, в который документ делает движения, проведение завершится ошибкой. Для привилегированных операций используйте УстановитьПривилегированныйРежим(Истина) — но осознанно, так как это отключает проверку прав для всего последующего кода в вызове.
Типичные ошибки при работе с модулем объекта
Отдельно стоит упомянуть рекурсивную запись: если в ПриЗаписи объекта А записывается объект Б, а в ПриЗаписи объекта Б — снова объект А, система попадёт в бесконечный цикл. Такие связи разрывают флагами-реквизитами, параметрами сеанса или дополнительными свойствами объекта (ДополнительныеСвойства.Вставить("НеЗаписыватьСвязанные", Истина)).
Как проверить, что код работает правильно
Минимальная проверка — прогнать объект по полному циклу: создать, заполнить, записать, провести, отменить проведение, пометить на удаление. На каждом шаге контролируйте, что срабатывают нужные обработчики и данные остаются согласованными.
Обязательно проверьте программный сценарий: запишите объект из внешней обработки или консоли кода. Если логика случайно осталась в модуле формы, именно этот тест покажет пропуск проверок. Для отладки модуля объекта в конфигураторе включите отладку сервера — точки останова в модуле объекта срабатывают при отладке предприятия в клиент-серверном режиме только при настроенной серверной отладке.
Как проверить результат
Запись отклонена, пользователь видит понятное сообщение
Документ записывается, нарушение попадает в базу
Срабатывают те же проверки, что и при интерактивной записи
Проверки пропускаются — логика находится в модуле формы
Движения по регистрам соответствуют табличной части, остатки контролируются
Движения дублируются, отсутствуют или не очищаются при отмене проведения
Запись занимает доли секунды, конфликтов блокировок нет
В журнале регистрации ошибки превышения времени ожидания блокировки
FAQ: частые вопросы о модуле объекта
Чем модуль объекта отличается от модуля набора записей?
Модуль набора записей есть у регистров и обслуживает не одиночный объект, а набор записей регистра. Принципы те же: обработчики ПередЗаписью и ПриЗаписи срабатывают при любой модификации набора. Логику контроля записей регистра размещают там, а не в модуле документа-регистратора.
Можно ли вызвать процедуру модуля объекта из другого места конфигурации?
Да, если процедура объявлена с ключевым словом Экспорт. Получите объект через ссылку (Ссылка.ПолучитьОбъект()) и вызовите метод. Учитывайте, что ПолучитьОбъект() загружает весь объект в память — для массовой обработки это затратно, и часть операций лучше переносить в модуль менеджера.
Почему обработчик ПередЗаписью не срабатывает при записи из моей обработки?
Чаще всего причина в том, что обработка работает не с объектом, а напрямую с набором записей или использует обмен данными с признаком ОбменДанными.Загрузка = Истина. В режиме загрузки большинство проверок и обработчиков намеренно пропускается — это штатное поведение для ускорения обменов.
Как изменить модуль объекта типовой конфигурации без снятия с поддержки?
Создайте расширение конфигурации, заимствуйте нужный объект и добавьте в его модуль собственные обработчики с аннотациями &Перед, &После или &Вместо. Расширения обновляются вместе с конфигурацией и не требуют снятия с поддержки, хотя при существенных изменениях типовой логики обработчики расширения нужно перепроверять после каждого обновления.
Где размещать код печатной формы документа — в модуле объекта?
Нет, печатные формы принято размещать в модуле менеджера объекта в процедуре Печать или в общих модулях подсистемы печати. Модуль объекта предназначен для логики самого экземпляра, а формирование табличного документа работает с выборкой данных и не требует загрузки объекта.
Что важно запомнить
Модуль объекта — место для бизнес-логики, которая должна работать при любом способе изменения объекта: проверки, заполнение, проведение. Код интерфейса держите в модуле формы, работу с коллекциями — в модуле менеджера, переиспользуемые функции — в общих модулях. Типовые конфигурации изменяйте через расширения и всегда проверяйте программный сценарий записи, а не только интерактивный.