В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача перехватить момент сохранения объекта (документа, элемента справочника и т. д.), чтобы проверить корректность введенных пользователем данных, рассчитать дополнительные реквизиты или сформировать проводки и движения по регистрам. За процесс сохранения отвечает не одна процедура, а целая цепочка событий, распределенных между клиентским и серверным контекстами формы, модулем самого объекта и общими механизмами конфигурации.
Разберем детально, как устроена запись данных в платформе 1С, в каком порядке вызываются процедуры-обработчики и как быстро найти нужный участок кода.
Когда пользователь нажимает кнопку «Записать» или «Провести и закрыть» на форме документа или справочника, платформа инициирует строгую последовательность вызовов. Проанализируем каждый этап по шагам:
ПередЗаписью(Отказ, ПараметрыЗаписи): процедура выполняется на стороне клиента до отправки данных на сервер. Здесь проверяют заполнение реквизитов интерфейса, выводят предупреждения пользователю и запрашивают подтверждение действий. Если передать Отказ = Истина, процесс сохранения прерывается на клиенте.ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи): обработчик выполняется на сервере до открытия транзакции базы данных. Через параметр ТекущийОбъект разработчик получает доступ к прикладному объекту и может скорректировать его свойства перед записью.ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения): ключевое событие самого объекта. Здесь выполняется валидация непротиворечивости данных, расчет служебных полей и заполнение реквизитов непосредственно через свойства объекта (или ЭтотОбъект).ПередЗаписью: если в конфигурации зарегистрированы подписки на событие перед записью для данного типа метаданных, они выполняются сразу после процедуры модуля объекта внутри той же транзакции.ПриЗаписи(Отказ): вызывается, когда данные объекта уже физически записаны в таблицы БД, но транзакция еще не зафиксирована. На этом этапе доступна постоянная ссылка на объект, что позволяет изменять подчиненные или связанные сущности.ОбработкаПроведения(Отказ, РежимПроведения): событие вызывается только для документов при их проведении. Именно здесь формируются движения по регистрам сведений, накопления, бухгалтерии и расчета.ПослеЗаписиНаСервере и ПослеЗаписи: завершающие обработчики, предназначенные для обновления элементов интерфейса и оповещения открытых форм.Место изменения данных зависит от решаемой задачи. Рассмотрим типовые сценарии работы с реквизитами:
1. Изменение реквизитов объекта в модуле формы: если требуется изменить сохраняемые данные на уровне формы перед отправкой в базу, используем процедуру ПередЗаписьюНаСервере:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Изменяем реквизит через переданный параметр ТекущийОбъект
ТекущийОбъект.Комментарий = "Изменено пользователем: " + ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
КонецПроцедуры
2. Изменение реквизитов в модуле объекта: это универсальное место для бизнес-логики, так как код сработает и при интерактивной записи из формы, и при программной записи из внешних обработок:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() Тогда
ДатаСоздания = ТекущаяДатаСеанса();
КонецЕсли;
// Проверка корректности заполнения
Если Не ЗначениеЗаполнено(Организация) Тогда
Отказ = Истина;
ВызватьИсключение "Не указана организация!";
КонецЕсли;
КонецПроцедуры
Важное правило: никогда не изменяйте реквизиты записываемого объекта в процедуре ПриЗаписи модуля объекта, так как сам объект на этом шаге уже сохранен в таблице БД, и новые значения просто не попадут в базу без повторной записи.
Проанализируем разницу в поведении платформы в зависимости от способа вызова записи:
Объект.Записать() обработчики формы (ПередЗаписью, ПередЗаписьюНаСервере, ПослеЗаписи) не вызываются вообще. Выполняются только процедуры модуля объекта (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) и соответствующие подписки на события.По этой причине ключевую бизнес-логику и проверки критически важных данных всегда следует размещать в модуле объекта или в подписках на события, а не в модуле формы.
Если конфигурация незнакома или содержит большой объем кода, найти нужный обработчик можно следующими методами:
F9 в процедурах ПередЗаписью или ОбработкаПроведения. Запустите режим «1С:Предприятие» в режиме отладки и нажмите кнопку сохранения — выполнение остановится точно в момент записи.