Template:Алгоритмы обработки документов

From SunFlurry wiki
Jump to: navigation, search

Ниже даны примерные алгоритмы обработки или отмены обработки документа. Внутри событий обработки или отмены обработки документа (OnPublish, OnUnpublish), когда события работают в режиме автоматического включения транзакции, работа с накопителями может быть построена по следующему алгоритму:

  • Начальная проверка информации, если информация не прошла проверку, выйти из события и возвратить ошибку.
  • Удаление движений накопителей текущего документа с помощью ClearStorages. Накопители будут в этот момент заблокированы и другие пользователи будут ждать их разблокировки, чтобы обработать свои документы. Данный шаг можно улучшить, если блокировать накопители последовательно при обработке, что увеличит их время доступности.
  • Проверка информации, использующая остатки или движения в накопителях. Такую проверку сложнее выполнить до удаления движений текущего документа, так как они могут мешать проверке (к примеру, проверка остатков товара на складе в документе списания остатков). Если информация не прошла проверку, выйти из события и возвратить ошибку. Накопители будут разблокированы автоматически, транзакция отменена, документ возвращен в исходное состояние.
  • Создание таблиц с новыми движениями накопителей (InitStorageTab и пр.) (этот и предыдущий пункт могут быть смешаны).
  • Сохранение таблиц движения документа в накопители документа SaveStorage (этот и предыдущие пункты могут быть смешаны).
  • При успешном выходе из события транзакция будет закреплена, накопители автоматически разблокированы.

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

  • Начальная проверка информации, если информация не прошла проверку, не инициировать изменение документа.
  • Сброс флага успешной транзакции
  • Инициирование режима транзакции BeginTransaction, защита внутреннего блока с помощью конструкции Try .. Finally
  • Попытка блокировки накопителей и удаления движений документа в помощью ClearStorages. Важно понимать, что сервер будет ожидать некоторое время, если накопители уже были заблокированы, однако, после определенного времени, будет возвращена ошибка о невозможности блокировки в данный момент, которая будет превращена в исключение.
  • Для обработки документа устанавливается пометка обработки, для отмены обработки пометка снимается (PublishedMark).
  • Проверка информации, использующая остатки или движения в накопителях. Такую проверку сложнее выполнить до удаления движений текущего документа, так как они могут мешать проверке (к примеру, проверка остатков товара на складе в документе списания остатков). Если информация не прошла проверку, может вызвать исключение или выйти из функции с ошибкой, конструкция Finally должна будет отменить транзакцию и возвратить текущий документ в исходное состояние, если это требуется.
  • Создание таблиц и сохранение таблиц движений с накопителями для текущего документа (InitStorageTab и SaveStorage).
  • Сохранение текущего документа с помощью функции Save, на случай, если документ был изменен до начала выполнения операции.
  • Установка флага спешной транзакции
  • Внутри конструкции Finally, если флаг успешной транзакции установлен, зафиксировать транзакцию, иначе отменить транзакцию и возвратить документ в исходное состояние, если это требуется.