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

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

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

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

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

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

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

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

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

Ключевая особенность модуля — контекст выполнения. Внутри него реквизиты объекта доступны напрямую по имени, без обращения через переменную. Например, в модуле документа «Реализация товаров» можно написать просто Контрагент или Товары.Итог("Сумма"), и платформа поймёт, что речь идёт о реквизитах текущего документа.

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

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

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

ОбработкаЗаполненияСоздание объекта

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

ПередЗаписьюДо сохранения в базу

Здесь проверяют и корректируют данные, можно отменить запись через Отказ = Истина

ПриЗаписиПосле записи в транзакции

Дополнительные действия, требующие уже записанного объекта

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

Программная проверка обязательных полей и логики заполнения

ОбработкаПроведенияПроведение документа

Формирование движений по регистрам, контроль остатков

ПриКопированииКопирование объекта

Очистка полей, которые не должны переноситься в копию

События делятся на две группы по поведению параметра Отказ. В событиях «Перед» (ПередЗаписью, ОбработкаПроверкиЗаполнения, ОбработкаПроведения) установка Отказ = Истина прерывает операцию и откатывает транзакцию. В событиях «При» (ПриЗаписи) отказ также откатывает транзакцию, но сам объект уже записан в рамках этой транзакции — поэтому отказ здесь используют для отмены всей операции целиком.

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

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

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

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

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

Что размещать в модуле объекта: практические сценарии

Проверка и контроль заполнения

В обработчике ОбработкаПроверкиЗаполнения проверяют условия, которые нельзя выразить стандартным свойством «Проверка заполнения». Например: если способ доставки — «Курьер», то адрес доставки обязателен; сумма по табличной части не должна превышать лимит договора. При нарушении формируют сообщение через СообщениеПользователю и устанавливают Отказ = Истина.

Формирование движений документа

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

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

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

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

Экспортные процедуры объекта

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

Модуль менеджера и другие смежные модули

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

Модуль объекта или модуль менеджера

Модуль объекта

Логика конкретного экземпляра: проведение, проверки, заполнение. Требует создания объекта в памяти

Модуль менеджера

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

Модуль формы

Интерактивное поведение конкретной формы: видимость элементов, клиентские проверки, команды

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

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

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

Порядок действий
  1. 1
    Сделайте резервную копию информационной базы или выгрузку конфигурации
  2. 2
    Определите, какой обработчик подходит под задачу: заполнение, проверка, проведение
  3. 3
    Добавьте код в модуль объекта, по возможности через расширение конфигурации, а не прямое изменение
  4. 4
    Проверьте синтаксис модуля через меню Конфигурация — Проверка конфигурации
  5. 5
    Протестируйте на копии базы: создание, запись, проведение, отмена проведения, копирование
  6. 6
    Проверьте программную запись объекта, а не только работу через форму
  7. 7
    Обновите конфигурацию базы данных и убедитесь, что пользователи могут работать

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

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

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

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

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

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

Запись через форму
Норма

Проверки срабатывают, сообщения привязаны к полям

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

Ошибки не показываются или объект записывается с некорректными данными

Программная запись из консоли кода
Норма

Обработчики выполняются так же, как из формы

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

Программная запись обходит проверки — логика в форме, а не в объекте

Обмен данными
Норма

При загрузке лишняя логика пропускается через ОбменДанными.Загрузка

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

При синхронизации срабатывают проверки и побочные записи

Проведение и отмена проведения
Норма

Движения создаются и полностью удаляются

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

После отмены проведения остаются записи в регистрах

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

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

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

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

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

Почему Предупреждение() не работает в модуле объекта?

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

Сработает ли модуль объекта при обмене данными?

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

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

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

Где размещать формирование движений документа?

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

Итог

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

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