Для каждого (типа) документа может быть создан один обработчик, выполняемый в случае ряда событий, происходящих с документом.
Обработчик при создании документа BeforeCreate:
Вызывается при создании документа.
На вход передаются создаваемый документ и параметры его создания.
Обычно обработчик этого события используется для автоматического заполнения полей шапки создаваемого документа.
Обработчик инициализации документа AfterLoad:
Вызывается после открытия документа, но не вызывается при создании нового документа.
На вход передаются открываемый документ и флаг, определяющий будут ли загружены внутренние объекты документа.
С помощью обработчика этого события можно, например, загрузить дополнительные данные в документ.
Обработчик перед сохранением документа BeforeSave:
Вызывается при сохранении создаваемого/редактируемого документа.
На вход обработчика передается сохраняемый документ.
С помощью обработчика этого типа можно проверить данные документа и при необходимости изменить их перед сохранением, например:
•проверить не исчерпан ли кредит получателя;
•проверить есть ли отгружаемый товар на складе и при необходимости заменить его тем же товаром с другого склада и т.п.
После успешного выполнения обработчика документ будет сохранен, а ядром будет вызван обработчик проведения, либо, в случае неудачного выполнения, будет возвращена ошибка.
Транзакционные скрипты:
Вызываются ядром после успешного выполнения обработчика перед сохранением документа. Транзакционные скрипты ассоциируются с подтипами документа (для каждого подтипа документа их может быть несколько) и выполняются при сохранении документа соответствующего подтипа.
На вход передаются документ, который обрабатывался предыдущим обработчиком, коллекция пар проводок (для балансовых итогов) и коллекция проводок (для небалансовых итогов).
Обработчик создает движения, записываемые впоследствии ядром в итоги.
В результате успешного выполнения обработчиком возвращается массив движений, а ядром будет вызван обработчик после сохранения документа, либо, в случае неудачного выполнения, будет возвращена ошибка.
Обработчик при неудавшемся сохранении документа SaveFailed:
Вызывается в случае выдачи исключения во время операции сохранения документа.
На вход передаются сохраняемый документ и исключение, выданное во время сохранения.
Обработчик после сохранения документа AfterSave:
Вызывается после успешного выполнения обработчика проведения (сохранения ядром движений в базу данных) и после непосредственно сохранения документа, но до фиксации транзакции.
На вход передается документ, который обрабатывался предыдущим обработчиком.
C помощью обработчика этого события можно отменить сохранение, выдав исключение, и отменить все внесенные в документ изменения (внести изменения в уже сохраненный документ нельзя).
Также обработчик используется для автоматического выполнения действий, которые должны быть совершены только после корректного сохранения всех данных связанных с документом. Например, по факту обработки менеджером поступившего из интернет-магазина заказа необходимо отправить покупателю письмо по электронной почте с уведомлением, что его заказ ожидает передачи в службу доставки. Можно было бы сделать это с помощью обработчика перед сохранением документа, но теоретически возможна ситуация, когда после корректного завершения его работы ошибка будет возвращена уже обработчиком проведения, за которой последует откат всех внесенных в систему изменений и заказ так и не будет сохранен.
Обработчик генерации описания документа (значения поля Description) GenerateDescription:
Вызывается после сохранения документа, но перед обработчиком после сохранения.
На вход передается документ и значение описания;
С помощью обработчика этого события можно изменить описание документа, которое по умолчанию генерируется по шаблону {DocumentType}({DocumentSubtype}) #{ID} {TRANSACTION_DATE}.
Обработчик перед удалением документа BeforeDelete:
Вызывается перед удалением документа.
На вход передается идентификатор удаляемого документа;
С помощью обработчика этого события можно отменить удаление, выдав исключение.
Обработчик при неудавшемся удалении документа DeleteFailed:
Вызывается в случае выдачи исключения во время операции удаления документа.
На вход передаются идентификатор удаляемого документа и исключение, выданное во время удаления.
Обработчик после удаления документа AfterDelete:
Вызывается после успешного выполнения обработчика перед удалением, а также после успешного удаления документа (документа уже не существует), но до фиксации транзакции.
На вход передается идентификатор удаленного документа;
С помощью обработчика этого события можно отменить удаление, выдав исключение.
Кроме того, прикладной разработчик может изменять общий обработчик событий документа – он имеет такой же интерфейс, но вызывается при любом событии документа (кроме генерации его описания) любого типа.
Последовательность вызовов обработчиков событий документа следующая:
1.При сохранении:
•общий обработчик перед сохранением;
•обработчик перед сохранением;
•транзакционные скрипты;
•сохранение шапки и данных табличных частей в БД;
•сохранение транзакций в итогах;
•обработчик генерации описания документа;
•общий обработчик после сохранения;
•обработчик после сохранения;
Если на каком-либо этапе сохранения произошло исключение, будет вызван обработчик исключительной ситуации SaveFailed.
2.При удалении:
•общий обработчик перед удалением;
•обработчик перед удалением;
•удаление документа в БД;
•удаление транзакций из итогов;
•общий обработчик после удаления;
•обработчик после удаления;
Если на каком-либо этапе удаления произошло исключение, будет вызван обработчик исключительной ситуации DeleteFailed.
3.При создании:
•создание объекта соответствующего класса;
•получение нового идентификатора;
•общий обработчик при создании;
•обработчик при создании.
4.При загрузке документа:
•загрузка документа из БД и инициализация объекта;
•общий обработчик инициализации документа;
•обработчик инициализации документа.