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