есть необходимость выполнить задачу из скрипта (выполнить шаг бизнес-процесса)
сначала обновляю статус и результат задачи на нужные для перехода по БП
из задачи беру WorkflowItemID
далее такие строки:
WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
все отлично, задача выполнилась, шаг сделан
создалась новая задача по бизнес-процессу к ней привязана запись в tbl_WorkflowItem, но эта запись не привязана к tbl_Workflow и следовательно бизнес-процесс разваливается
Карло Сергей писал как необходимо сделать: https://community.terrasoft.ru/forum/topic/757#comment-2633
у меня не хватает одной строчки
подскажите, пожалуйста, как создать этот недостающий нотифай
Нравится
Виталий, мне кажется в Вашем случае дело не в недостающей нотификации.
Вложите, пожалуйста, полную версию скрипта для тестирования.
собственно сам скрипт, вернее функция
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); } }
в этой части записываются нужные статус и результат задачи, сделал это хранимой процедурой, так как если менять через датасет, то запись затирается и создается аналогичная этой, DisableEvents() не сработал, решил не заморачиваться и по быстрому хранимку написал
ID - Задачи, которую необходимо завершить
StatusID - статут задачи
ResultID - результат задачи, для перехода к нужному следующему шагу
WorkflowItemID - ID записи в tbl_WorkflowItem, задачи которую завершаем
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(); WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
Немного поясню, мы вместе с Виталием бьемся с этой проблемой.
вот команда которая должна выполнить шаг бизнес процесса:
WorkflowEngine.ProcessWorkflowItem(WorkflowItemID);
в нашем случае шаг - это завершить задачу и создать новую в рамках БП, мы хотим это сделать без участия пользователя, с помощью JobManager
проблемы следующие:
1. WorkflowEngine.ProcessWorkflowItem(WorkflowItemID) не завершает задачу, мы сами скриптом ее завершаем, это еще можно понять.
2. После ProcessWorkflowItem в новом созданном WorkflowItem не заполнено поле WorkflowID, и к тому же из всех предыдущих WorkflowItem созданных в рамках этого процесса зачищаются данные.
Мы попытались дебаггером опеределить в какой момент создается WorflowItem и где зачищается. оказалось
что WorflowItem создается абсолютно нормальным со всеми необходимыми данными, но после AfterExecute элемента БП дебаггер "уходит в никуда", т.е. не показывает что дальше делается ()...когда он снова становится активным, данные уже зачищены.
Мы пробовали вставлять дебаггеры и в afterpost и в beforepost ds_WorkflowItem и в ds_task, однако найти в какой момент выполняются операции по зачищению данных не можем. Какбудто этот процесс выполняется вне скриптов террасофта, а гдето в исполняемых файлах или в хранимых процедурах.
приложу скрипты bp.rar
Для проведения тестирование использовался такой код:
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); } }
В результате процесс пошел дальше и информация о WorkflowItemID и WorkflowID зафиксировалась корректно (рис 1 и рис 2).
Задача (WorkflowItemID = '{CB3B6EEB-E57C-4E70-A523-D23F5CBC7A5B}'), с которой продолжен процесс была в статусе «Не начата».
В Вашем случае нужно проверить, что корректно получаете WorkflowItemID (возможно, получаете не тот идентификатор, который нужен).