Добрый день!

в таблице tbl_WorkflowItem есть поле DiagramItemType скажите, пожалуйста, в какой момент и где задается значение этого поля

значения этого поля можно посмотреть вот здесь
или scr_SysEnums -> Constants for enum _WorkflowDiagramItemTypeEnum

по этому полю легко определять к какому элементу принадлежит данная запись

Я добавил в БП новый элемент Опросы, все для него прописал, все работает, но DiagramItemType проставляется как у задачи - "7"

как мне для элемента "опрос" задать нужное мне значение?

Нравится

4 комментария

Добрый день!
А какое значение вы хотите поставить? Это ведь элемент типа Action

На изображении проставлены константы для каждого элемента, они соответствуют значениям из
scr_SysEnums -> Constants for enum _WorkflowDiagramItemTypeEnum

Большое спасибо за разъяснение!
Отвечая на вопрос: 9, но теперь это не правильно делать
суть была в том, чтобы можно было в разделе "Процессы" отфильтровать нужные мне элементы и чтобы можно было отталкиваясь от этого значения получать из различных элементов ответственных и авторов

Есть ли тогда возможность завести поле, например, DiagramItemSubType и разделить все элементы типа Action?

Добрый вечер.

Создать поле можно, да. Как вариант, на событии OnInitialize действий находите это действие в таблице tbl_WorkflowItem и записывайте туда подтип.

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

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

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

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

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

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

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

WorkflowEngine.NotifyObject = NotifyObject;

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

Нравится

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

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

собственно сам скрипт, вернее функция

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 (возможно, получаете не тот идентификатор, который нужен).

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

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