ProcessWorkflowItem
WorkflowEngine
WorkflowItemID
Бизнес-процессы
Разработка

выполнить шаг процесса из скрипта

есть необходимость выполнить задачу из скрипта (выполнить шаг бизнес-процесса)

сначала обновляю статус и результат задачи на нужные для перехода по БП
из задачи беру WorkflowItemID
далее такие строки:

var WorkflowEngine = GetWorkflowEngine();
WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);

все отлично, задача выполнилась, шаг сделан
создалась новая задача по бизнес-процессу к ней привязана запись в tbl_WorkflowItem, но эта запись не привязана к tbl_Workflow и следовательно бизнес-процесс разваливается

Карло Сергей писал как необходимо сделать: https://community.terrasoft.ru/forum/topic/757#comment-2633

у меня не хватает одной строчки

WorkflowEngine.NotifyObject = NotifyObject;

подскажите, пожалуйста, как создать этот недостающий нотифай

Нравится

5 комментариев

Виталий, мне кажется в Вашем случае дело не в недостающей нотификации.
Вложите, пожалуйста, полную версию скрипта для тестирования.

собственно сам скрипт, вернее функция
[javascript]
function ExecuteWFTaskBG(ID, StatusID, ResultID) {
var Parameters = CreateSPParameters();

CreateSPParameter(Parameters, 'ID', pdtGUID, ID);
CreateSPParameter(Parameters, 'StatusID', pdtGUID, StatusID);
CreateSPParameter(Parameters, 'ResultID', pdtGUID, ResultID);
CreateSPParameter(Parameters, 'WorkflowItemID', pdtGUID, null);

Parameters.ItemsByName('WorkflowItemID').ParamType = 1;

var SQLText = 'exec dbo.tsp_WFTaskEdit :ID, :StatusID, :ResultID, :WorkflowItemID OUTPUT';
Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);

var WorkflowItemID = '{' + Parameters.ItemsByName('WorkflowItemID').Value + '}';

var WorkflowEngine = GetWorkflowEngine();
if (Assigned(WorkflowEngine) && (WFGetItemState(WorkflowItemID) != ws_Done)) {
WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
}
}
[/javascript]

в этой части записываются нужные статус и результат задачи, сделал это хранимой процедурой, так как если менять через датасет, то запись затирается и создается аналогичная этой, DisableEvents() не сработал, решил не заморачиваться и по быстрому хранимку написал
ID - Задачи, которую необходимо завершить
StatusID - статут задачи
ResultID - результат задачи, для перехода к нужному следующему шагу
WorkflowItemID - ID записи в tbl_WorkflowItem, задачи которую завершаем
[javascript]
var Parameters = CreateSPParameters();

CreateSPParameter(Parameters, 'ID', pdtGUID, ID);
CreateSPParameter(Parameters, 'StatusID', pdtGUID, StatusID);
CreateSPParameter(Parameters, 'ResultID', pdtGUID, ResultID);
CreateSPParameter(Parameters, 'WorkflowItemID', pdtGUID, null);

Parameters.ItemsByName('WorkflowItemID').ParamType = 1;

var SQLText = 'exec dbo.tsp_WFTaskEdit :ID, :StatusID, :ResultID, :WorkflowItemID OUTPUT';
Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);

var WorkflowItemID = '{' + Parameters.ItemsByName('WorkflowItemID').Value + '}';
[/javascript]

и две строчки, которые и должны выполнить шаг в бизнес-процессе
[javascript]
var WorkflowEngine = GetWorkflowEngine();
WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
[/javascript]

Немного поясню, мы вместе с Виталием бьемся с этой проблемой.

вот команда которая должна выполнить шаг бизнес процесса:

WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);

в нашем случае шаг - это завершить задачу и создать новую в рамках БП, мы хотим это сделать без участия пользователя, с помощью JobManager

проблемы следующие:
1. WorkflowEngine.ProcessWorkflowItem(WorkflowItemID) не завершает задачу, мы сами скриптом ее завершаем, это еще можно понять.
2. После ProcessWorkflowItem в новом созданном WorkflowItem не заполнено поле WorkflowID, и к тому же из всех предыдущих WorkflowItem созданных в рамках этого процесса зачищаются данные.

Мы попытались дебаггером опеределить в какой момент создается WorflowItem и где зачищается. оказалось
что WorflowItem создается абсолютно нормальным со всеми необходимыми данными, но после AfterExecute элемента БП дебаггер "уходит в никуда", т.е. не показывает что дальше делается ()...когда он снова становится активным, данные уже зачищены.
Мы пробовали вставлять дебаггеры и в afterpost и в beforepost ds_WorkflowItem и в ds_task, однако найти в какой момент выполняются операции по зачищению данных не можем. Какбудто этот процесс выполняется вне скриптов террасофта, а гдето в исполняемых файлах или в хранимых процедурах.

приложу скрипты bp.rar

Для проведения тестирование использовался такой код:

[javascript]
function TestOnClick(Control) {
var WorkflowItemID = '{CB3B6EEB-E57C-4E70-A523-D23F5CBC7A5B}';
var Parameters = CreateSPParameters();
CreateSPParameter(Parameters, 'ID', pdtGUID, dlData.Dataset('ID'));
var SQLText = "UPDATE tbl_Task SET StatusID = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}', ResultID = '{FC3E0665-C980-4E6E-8941-FAF4294C653F}' WHERE ID = :ID";
Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
var WorkflowEngine = GetWorkflowEngine();
if (Assigned(WorkflowEngine) && (WFGetItemState(WorkflowItemID) != ws_Done)) {
WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
}
}
[/javascript]

В результате процесс пошел дальше и информация о WorkflowItemID и WorkflowID зафиксировалась корректно (рис 1 и рис 2).
Задача (WorkflowItemID = '{CB3B6EEB-E57C-4E70-A523-D23F5CBC7A5B}'), с которой продолжен процесс была в статусе «Не начата».
В Вашем случае нужно проверить, что корректно получаете WorkflowItemID (возможно, получаете не тот идентификатор, который нужен).

С окном все работает
Спасибо Наталия!

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