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

Мне необоходимо после создания задачи скопировать в нее продукты с документа. Я решил это сделать на событие 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.

Например:

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);
 }
}

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

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