DB.ClearStorages

From SunFlurry wiki
Revision as of 08:43, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  ClearStorages (Работа с накопителями документа)
Объект:Объект базы данных
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Сервер и БД
Исключения:Невозможно превратить в число, строку, неверные накопители, накопители уже заблокированы.
Визуальность:Нет

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

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

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

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

Синтаксис

DB.ClearStorages(<Режим (INT)>=1,<Наименования накопителей (STRING)>)

Аргументы

  • <Режим (INT)> - Задает режим работы функции, доступны следующие значения:
    • 0 -- Удалить движения только из накопителей не заблокированных в данный момент. Внимание: этот режим опасен для использования, он будет неверно работать в событии обработки документа при наличии вложенных транзакций, так как используется общая для всех документов транзакции блокировка накопителей, это может привести к тому, что движения какой-либо накопителя, заблокированного в другом документе, не будут удалены. Режим никогда не должен использоваться внутри события обработки (или отмены обработки) документов.
    • 1 (по умолчанию) -- Удалить движения из всех накопителей данного документа. Внутри транзакции этот режим блокирует все накопители, в которые возможна запись из текущего документа, поэтому этот режим может быть не самым выгодным с точки зрения времени удержания накопителей. Режим совместим с порядком блокировки накопителей.
    • 2 -- Удалить движения из всех накопителей документа, кроме тех, которые перечислены во втором аргументе. Режим совместим с порядком блокировки накопителей.
    • 3 -- Удалить движения только из тех накопителей, которые перечислены во втором аргументе. Режим совместим с порядком блокировки накопителей.
  • <Наименования накопителей (STRING)> - Наименования накопителей, разделенные запятой. Документ может иметь движения только в накопителях, заданных для этого документа в Студии.

Примеры

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

//Флаг успешной транзакции
ФлОк:=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;