Как сохранить периодическое значение между запусками одного БП
Мне необоходимо после создания задачи скопировать в нее продукты с документа. Я решил это сделать на событие OnAfterExecute задачи и чтобы не делать копирование каждый раз после вызова элемента задачи использую параметры:
ProductsWhereCopied - булевый, значение по-умолчанию false
Вот примерный код того, как я делаю:
// Получаем 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 уже закрыта.
Подскажите как можно сделать так, чтобы этот параметр запоминался в БД?
Нравится
Попробуйте сохранять значение в параметр диаграммы, а не элемента. Если таких элементов несколько и они не выполняются параллельно, можно после завершения каждого из них опять устанавливать параметру значение 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.