Difference between revisions of "DB.Unpublish"

From SunFlurry wiki
Jump to: navigation, search
 
m (1 revision imported)
 
(No difference)

Latest revision as of 08:43, 7 February 2021

  Unpublish (Отмена обработки документа)
Объект:Объект базы данных
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Сервер и БД
Исключения:Ошибка обработки, ошибка сервера и пр.
Визуальность:Нет

Функция выполняет процедуру отмены обработки документа. Обработка -- условное название процесса изменения состояния документа. Обработанным называется документ, когда он имеет движения в накопителях (документ может иметь движения только в накопителях, закрепленных за ним в Студии), и его статус больше 1. Функция помогает свести совокупность изменений, происходящих при отмене обработки документа в один вызов. При необходимости можно полностью эмулировать поведение этой функции, существует возможность также вызвать заданный в конфигурации обработчик OnUnpublish без вызова самой функции (см. InvokeEvent). Функция вызывается автоматически при удалении обработанного документа (Mark), либо его визуальном удалении из журналов документов. Функция последовательно выполняет следующие действия:

  • Если для документа указан режим автоматической транзакции, функция инициирует режим транзакции и сохраняет состояние текущего документа во внутреннем буфере.
  • Функция производит вызов события OnUnpublish, если оно задано в структуре метаданных проекта (см. Конфигурация данных проекта). Ожидается, что событие произведет проверку корректности и заполненности данных в документе, после чего, либо вернет ошибку (будет вызвано исключение), либо заблокирует и очистит движения документа в нужных накопителях. Если событие OnUnpublish не задано, функция очищает движения в накопителях самостоятельно.
  • Если для документа указан режим автоматической транзакции, функция проверяет состояние документа. Если он имеет состояние изменен, функция производит вызов события метаданных OnSave. Событие может отменить попытку отмены обработки (будет вызвано исключение).
    • Также, если объект открыт для визуального редактирования и он имеет обязательные для заполнения реквизиты, эти реквизиты будут проверены на заполненность, если хотя бы один из них не заполнен, будет вызвано исключение.
    • Будет произведена попытка сохранения измененного документа в базе данных (см. функцию Save).
  • Будет снята пометка обработки документа, если она уже не была снята в процессе выполнения обработчика OnUnpublish (см. PublishedMark). Документ получает состояние 0 -- нормальный объект.
  • Будет произведено фиксирование транзакции CommitTransaction
  • Если предусмотрено установками, создается соответствующая запись в таблице журнала регистрации событий. Функция заканчивает работу и возвращает управление вызвавшей программе.
  • При наличии исключения на любом из этапов работы функции, если для документа указан режим автоматической транзакции, функция отменяет транзакцию и возвращает предыдущее состояние документа из внутреннего буфера.

Синтаксис

DB.Unpublish(<Параметр>,<Опция>)

Аргументы

  • <Параметр>,<Опция> - (необязательный аргумент) Два необязательных параметра, которые будут доступны, как переменные Param и Option внутри обработчика события OnUnpublish.

Примеры

//Пример производит отмену обработки документа aEl
//Если обработка неудачна, событие ''OnUnpublish'' вернет текст ошибки, из которого функция Unpublish создает исключение
//Чтобы отличить ошибку обработки от системных ошибок и ошибок сервера, пример проверяет код ошибки и, если это ошибка обработки,
//  оставляет только текст, удаляя из сообщения ошибки лишнюю информацию.
аПольз:="";аМаш:="";аВремя:="";
If aEl.Lock(аПольз,аМаш,аВремя)=0 Then
  Message("Невозможно заблокировать документ, так как в данный момент с ним работает пользователь "+аПольз+" на "+аМаш+" в "+аВремя+"!","!");
  Exit;
EndIf;  
Try
  aEl.Reload();
  Try
    aEl.Unpublish();
  Except
    Стр:=PeekError();
    If Pos("(80 at",Стр)=1 Then
      Стр:=PopError(4);
    EndIf;
    Стр:=PopError();
    Message(Стр,"!");
  EndTry  
Finally
  aEl.Unlock();
EndTry