DB.PublishedMark

From SunFlurry wiki
Jump to: navigation, search
  PublishedMark (Установка или снятие пометки обработки документа)
Объект:Объект базы данных
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Сервер и БД
Исключения:Невозможно превратить в число, ошибка сервера
Визуальность:Нет

Функция устанавливает пометку обработки на документе, если аргумент больше нуля, или снимает пометку обработки, если аргумент равен нулю. Функция может использоваться, к примеру, при обработке документов вне события OnPublish, которое автоматически устанавливает пометку обработки, поэтому нет необходимости в вызове этой функции. Функцией нужно пользоваться с осторожностью, так как при отмене статуса обработки и не удалении движений документа в накопителях, можно получить не обработанный документ, имеющий движения. См. также Publish.

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

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

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

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

Синтаксис

DB.PublishedMark(<Ноль для отмены обработки, больше нуля -- индекс пометки обработки (INT)>):<Текущий индекс обработки (INT)>

Аргументы

  • <Ноль для отмены обработки, больше нуля -- индекс пометки обработки (INT)> - (необязательный аргумент) Если аргумент не указан, функция возвращает текущую пометку обработки документа (для обработанных документов совпадает с результатом функции Status, уменьшенным на 1; для необработанных документов, функция возвратит 0), при этом статус не изменяется, иначе происходит изменение статуса. Возможные значения аргумента:
    • 0 -- снять пометку обработки документа
    • 1..199 -- установить пометку обработки документа. Данный индекс будет увеличен на единицу и записан в статус текущего документа. При вызове функции Status будет возвращена пометка, отличающаяся на единицу от указанной здесь. Т.е., после выполнения операции <Doc>.PublishedMark(1), функция Status будет возвращать число 2.

Возвращаемое значение

Возвращается текущая пометка обработки документа, уменьшенная на 1, если документ обработан, либо 0, если документ не обработан.

Примеры

//Пример для документа аДок, который обрабатывает документ вне стандартного события обработки документа. 
//Пример демонстрирует алгоритм, описанный выше.
//Созданные заранее таблицы с накопителями документа содержатся в списке спНакопители
//Данный пример больше подходит для загрузки документов вместе с движения из внешнего источника, так как нет блока проверки корректности данных

//Флаг успешной транзакции
ФлОк:=0;
BeginTransaction();
Try
  //Бесконечный цикл ожидания блокировки накопителей документа
  While 0=0 Do
    Try
      аДок.ClearStorages();
    Except
      RollbackTransaction();
      Sleep(100);
      BeginTransaction();
      Continue;
    EndTry;
    Break;
  EndDo;  
  //Установка пометки обработки
  аДок.PublishedMark(1);

  //Запись движений в накопители
  For i:=1 To спНакопители.Size() Do
    aTab:=спНакопители.Get(i);
    ИмяНак:=спНакопители.GetName(i);
    If aTab.Size()>0 Then
      аДок.SaveStorage(ИмяНак,aTab,аДок.DocDate);
    EndIf;  
  EndDo;
            
  //Сохранение документа
  аДок.Save();
  //Транзакция успешна
  ФлОк:=1;
Finally
  If ФлОк Then
    CommitTransaction();
  Else
    RollbackTransaction();
  EndIf;
EndTry;