Вопрос

Запуск БП из нового окна

Добрый день!
Воспользовался советом из http://community.terrasoft.ua/forum/topic/1989
Решаю сходную проблему, только вместо задачи запускаю бизнес процесс

1. Создать небольшое простое окно с кодом wnd_MySchedulesWindow, и обработчик его событий OnPrepare и OnShow

function PeriodicTasksOnPrepare(Window) {
  debugger;
  var DateObject = new Date(); //получаем объект типа Date с текущей датой
  var DayOfMonth = DateObject.getDate();
  if (DayOfMonth == 21)
    {
      WFStartByID('{38ABACB8-F3F5-409B-993D-6553D6393AB4}',null,null);
    }
}

В WFStartByID первой строкой идет присвоение переменной

var WorkflowEngine = GetAttribute(Connector, 'WorkflowEngine');

Но присваивается ей пустая строка и соответственно дальше ничего не работает.
Как я понял, у моего окна не созданы атрибуты.
А как их создать?
И не могли бы Вы прислать пример этого простого окна?

Нравится

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

Добрый день, Кирилл!

В скрипте scr_Main в функции Initialize() нашел следующий пример:

var WorkflowEngine =
	System.CreateObject('TSWorkflowLibrary.WorkflowEngine');
WorkflowEngine.Connector = Connector;
Connector.Attributes(WorkflowEngineAttrName) = WorkflowEngine;

WorkflowEngineAttrName - константа, описанная в scr_Consts:

var WorkflowEngineAttrName = 'WorkflowEngine';

Другими словами, Вам в скрипте необходимо выполнить аналогичный код.
Желаю успехов!

Спасибо. Процесс запустился, но как я понимаю нужно еще принудительно выполнить шаг?

Насколько помню, запуска WFStartByID вполне достаточно.

После выполнения WFStartByID, процесс стартует и встает в состояния ожидания, и задача не генерится.

Чтобы запустить шаг нужно выполнить что-то типа такого...

  WorkflowEngine.ProcessWorkflowItem(ItemID);

А где взять этот ItemID не понятно....

Попробовал воспроизвести.
Реализовал следующий код:

function wnd_TestOnPrepare(Window) {
	var WorkflowEngine =
	        System.CreateObject('TSWorkflowLibrary.WorkflowEngine');
	WorkflowEngine.Connector = Connector;
	Connector.Attributes('WorkflowEngine') = WorkflowEngine;	
	WFStartByID('{F3D2290C-3EFA-437B-A0E9-25D477CD0385}');
}

Этот код выполняется во время подготовки окна, которое запускал так:

tscrm.exe /wnd=wnd_Test

Процесс ("Тендер") замечательно запустился, никаких дополнительных действий не нужно. Видимо, в Вашем случае проблема с самим процессом, а не механизмом его запуска. Придется отлаживаться построчно, проверять как работает процесс.

Желаю успехов!

Хм... а у меня процесс тендер тоже не запустился ;-(
Вероятно всего дело в том, что у меня версия Террасофта 3.1.0.16, а Вы, наверное, пробуете на 3.2

Спасибо Вам за помощь.

Наиболее вероятная причина того, что Вы не видели, как процесс запустился - принудительное закрытие Вашего окна на OnShow, которое влечет за собой принудительное закрытие всех окон приложения без возможности отмены. Дело в том, что созданная по процессу задача не сохраняется в БД, пока пользователь не нажмет ОК в карточке задачи.
На самом деле процесс запускается (первый элемент выполняется, но не до конца), просто пользователь может об этом узнать, если зайдет в раздел Процессы и выполнит шаг.

Т.е. нужно программно нажать на кнопку Ok (поскольку человека там никакого не будет), а как это сделать?
Нужно же сначало как-то получить указатель на окно задачи, а потом еще нажать кнопку?

Мы решили подобную задачу таким образом (нужно было запускать определенный процесс без показа первой задачи):
1. Доработали элемент процесса "Задача" (wa_TaskActionScript):
- добавили параметр 'HideTaskEditForm', который берем из соответствующего параметра процесса:

function wa_TaskActionOnInitialize(WorkflowAction, ActionItem) {
	//...
	//Привязка параметра
	WFConnectParams(ActionItem, 'HideTaskEditForm');
}

2. Добавили метод для создания задачи без показа формы редактирования:

function SilentAddTaskWorkflowItem(DiagramItem, WorkflowItemID, ExecuteDate, DueDate){
	TaskID = Connector.GenGUID();
	var TaskDataset = GetSingleItemByCode('ds_Task', 'TaskAction');
	TaskDataset.Append();
	try {
		TaskDataset.Values('ID') = TaskID;
		TaskDataset.Values('Title') =  DiagramItem.Caption;
 
		//Здесь нужно разместить свою логику по заполнению параметров задачи
		/*
		var OpportunityID = WFGetParamValue(DiagramItem, 'OpportunityID');
		TaskDataset.Values('OpportunityID') = OpportunityID;
	 	var AccountID = WFGetParamValue(DiagramItem, 'AccountID');
		TaskDataset.Values('AccountID') = AccountID;
	 	var ContactID = WFGetParamValue(DiagramItem, 'ContactID');
		TaskDataset.Values('ContactID') = ContactID;
		TaskDataset.Values('TypeID') = WFGetParamValue(DiagramItem, 'TypeID');
		TaskDataset.Values('OwnerID') =  WFGetParamValue(DiagramItem, 'OwnerID');
		*/
		TaskDataset.Values('WorkflowItemID') = WorkflowItemID;
		TaskDataset.Values('StartDate') = ExecuteDate;
		TaskDataset.Values('DueDate') = DueDate.getVarDate();
		TaskDataset.Post();
	} finally {
		TaskDataset.Close();
	}
}

3. Доработали логику в OnExecute элемента:

function wa_TaskActionOnExecute(WorkflowAction, ActionItem, ItemDataset,
		IsComplete, ResultLinkCodes) {
	//...
	if (WFGetParamValue(ActionItem, 'HideTaskEditForm')){
		SilentAddTaskWorkflowItem(ActionItem, ItemID, ExecuteDate, DueDate);
    		WFSetParamValue(ActionItem, 'HideTaskEditForm', false);
	}
	else { 
		ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);
	}
	IsComplete.Value = false;
}

4. При запуске процесса задаем значение параметра HideEditForm:

var ParamNames = new Array('HideTaskEditForm');
var ParamValues = new Array(true);	
WFStartByID('{F3D2290C-3EFA-437B-A0E9-25D477CD0385}', ParamNames, ParamValues);

Спасибо, буду пробовать.

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