Параметры процесса
Передача параметра
Бизнес-процессы
Разработка

Как сохранить периодическое значение между запусками одного БП

Мне необоходимо после создания задачи скопировать в нее продукты с документа. Я решил это сделать на событие OnAfterExecute задачи и чтобы не делать копирование каждый раз после вызова элемента задачи использую параметры:
ProductsWhereCopied - булевый, значение по-умолчанию false

Вот примерный код того, как я делаю:

function Action1OnAfterExecute(ActionItem, IsComplete) {
 // Получаем ID созданной задачи
 var TaskID = WFGetParamValue(ActionItem, 'TaskID');   
 if (!IsEmptyGUID(TaskID)) {
  // Проверяем были ли скопированы в этот документ продукты ранее
   var ProductsWhereCopied = WFGetParamsMapItemValue(ActionItem,'ProductsWhereCopied');
  // Сразу после создания задачи переносим в нее продукты с документа заявки
   if (ProductsWhereCopied == false) { 
    var ParentDiagram = ActionItem.ParentItems.ParentDiagram;
    // Получаем ID документа созданного ранее
    var DocumentID = WFGetParamValue(ParentDiagram, 'DocumentID');
    // Копируем продукты с документа в задачу
    CopyOfferingsFromDocumentToTask(DocumentID, TaskID);
    // Устанавливаем признак того, что на деталь "Продукты" были скопированы
    // продукты
    WFSetParamsMapItemValue(ActionItem, 'ProductsWhereCopied', true);                  
   }   
 }
}

Загвоздка в том, что когда я повторно запускаю элемент БП "Задача", почему-то значение параметра ProductsWhereCopied остается старым, то есть false, и происходит повторное копирование продуктов.

Есть подозрение, что на событие OnExecute можно менять значение параметров и оно будет запоминаться, а на событие OnAfterExecute оно не запоминается, так как, возможно, таблица tbl_WorkflowItem уже закрыта.

Подскажите как можно сделать так, чтобы этот параметр запоминался в БД?

Нравится

1 комментарий

Попробуйте сохранять значение в параметр диаграммы, а не элемента. Если таких элементов несколько и они не выполняются параллельно, можно после завершения каждого из них опять устанавливать параметру значение false.

Например:
[javascript]
function Action1OnAfterExecute(ActionItem, IsComplete) {
var ParentDiagram = GetDiagramByItem(ActionItem);
// Получаем ID созданной задачи
var TaskID = WFGetParamValue(ActionItem, 'TaskID');
if (!IsEmptyGUID(TaskID)) {
// Проверяем были ли скопированы в этот документ продукты ранее
var ProductsWhereCopied = WFGetParamValue(ParentDiagram,'ProductsWhereCopied');
// Сразу после создания задачи переносим в нее продукты с документа заявки
if (ProductsWhereCopied == false) {
// Получаем ID документа созданного ранее
var DocumentID = WFGetParamValue(ParentDiagram, 'DocumentID');
// Копируем продукты с документа в задачу
CopyOfferingsFromDocumentToTask(DocumentID, TaskID);
// Устанавливаем признак того, что на деталь "Продукты" были скопированы
// продукты
WFSetParamValue(ParentDiagram, 'ProductsWhereCopied', true);
}
}
if (IsComplete) {
WFSetParamValue(ParentDiagram, 'ProductsWhereCopied', false);
}
}
[/javascript]

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Показать все комментарии