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