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