DB.SaveStorage

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

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

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

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

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

Синтаксис

DB.SaveStorage(<Наименования накопителя (STRING)>,<Содержимое накопителя текущего документа (TAB)>,<Установить дату записей (DATE)>)

Аргументы

  • <Наименования накопителя (STRING)> - Задает наименование накопителя, для которого будет инициирована попытка записи. Документ может иметь движения только в накопителях, заданных для этого документа в Студии (это сделано для оптимизации скорости работы некоторых функций).
  • <Содержимое накопителя текущего документа (TAB)> - Таблица, полученная функциями LoadStorage или InitStorageTab. Таблицы можно заполнять любыми данными. Таблица содержит следующие столбцы:
    • _DOCUMENT -- задает текущий документ таблицы при чтении таблицы с помощью функции LoadStorage, при записи таблицы этот столбец не используется (и может отсутствовать).
    • _DATE -- столбец присутствует для накопителей, записи которых датируются. Если накопитель не имеет даты записей, столбец не используется и может отсутствовать.
    • _EXPENSE -- столбец присутствует для накопителей, записи которых имеют флаг расхода. Если накопитель не имеет флагов расхода, столбец не используется и может отсутствовать.
    • <Наименование реквизита накопителя> -- в таблице присутствуют все реквизиты накопителя (включая аккумуляторы и активы), для каждого из столбца указан тип данных.
  • <Установить дату записей (DATE)> - (необязательный аргумент) Аргумент помогает установить указанную дату во всех строках таблицы предыдущего аргумента до начала записи. Если аргумент не указан, столбцы _DATE для датирующихся накопителей должны быть заполнены до момента вызова функции.

Примеры

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

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