Добрый день!
Воспользовался советом из http://community.terrasoft.ua/forum/topic/1989
Решаю сходную проблему, только вместо задачи запускаю бизнес процесс
debugger;
var DateObject = new Date(); //получаем объект типа Date с текущей датой
var DayOfMonth = DateObject.getDate();
if (DayOfMonth == 21)
{
WFStartByID('{38ABACB8-F3F5-409B-993D-6553D6393AB4}',null,null);
}
}
В WFStartByID первой строкой идет присвоение переменной
Но присваивается ей пустая строка и соответственно дальше ничего не работает.
Как я понял, у моего окна не созданы атрибуты.
А как их создать?
И не могли бы Вы прислать пример этого простого окна?
Нравится
Добрый день, Кирилл!
В скрипте scr_Main в функции Initialize() нашел следующий пример:
[javascript]
var WorkflowEngine =
System.CreateObject('TSWorkflowLibrary.WorkflowEngine');
WorkflowEngine.Connector = Connector;
Connector.Attributes(WorkflowEngineAttrName) = WorkflowEngine;
[/javascript]
WorkflowEngineAttrName - константа, описанная в scr_Consts:
[javascript]
var WorkflowEngineAttrName = 'WorkflowEngine';
[/javascript]
Другими словами, Вам в скрипте необходимо выполнить аналогичный код.
Желаю успехов!
Спасибо. Процесс запустился, но как я понимаю нужно еще принудительно выполнить шаг?
Насколько помню, запуска WFStartByID вполне достаточно.
После выполнения WFStartByID, процесс стартует и встает в состояния ожидания, и задача не генерится.
Чтобы запустить шаг нужно выполнить что-то типа такого...
[javascript]
WorkflowEngine.ProcessWorkflowItem(ItemID);
[/javascript]
А где взять этот ItemID не понятно....
Попробовал воспроизвести.
Реализовал следующий код:
[javascript]
function wnd_TestOnPrepare(Window) {
var WorkflowEngine =
System.CreateObject('TSWorkflowLibrary.WorkflowEngine');
WorkflowEngine.Connector = Connector;
Connector.Attributes('WorkflowEngine') = WorkflowEngine;
WFStartByID('{F3D2290C-3EFA-437B-A0E9-25D477CD0385}');
}
[/javascript]
Этот код выполняется во время подготовки окна, которое запускал так:
tscrm.exe /wnd=wnd_Test
Процесс ("Тендер") замечательно запустился, никаких дополнительных действий не нужно. Видимо, в Вашем случае проблема с самим процессом, а не механизмом его запуска. Придется отлаживаться построчно, проверять как работает процесс.
Желаю успехов!
Хм... а у меня процесс тендер тоже не запустился ;-(
Вероятно всего дело в том, что у меня версия Террасофта 3.1.0.16, а Вы, наверное, пробуете на 3.2
Спасибо Вам за помощь.
Наиболее вероятная причина того, что Вы не видели, как процесс запустился - принудительное закрытие Вашего окна на OnShow, которое влечет за собой принудительное закрытие всех окон приложения без возможности отмены. Дело в том, что созданная по процессу задача не сохраняется в БД, пока пользователь не нажмет ОК в карточке задачи.
На самом деле процесс запускается (первый элемент выполняется, но не до конца), просто пользователь может об этом узнать, если зайдет в раздел Процессы и выполнит шаг.
Т.е. нужно программно нажать на кнопку Ok (поскольку человека там никакого не будет), а как это сделать?
Нужно же сначало как-то получить указатель на окно задачи, а потом еще нажать кнопку?
Мы решили подобную задачу таким образом (нужно было запускать определенный процесс без показа первой задачи):
1. Доработали элемент процесса "Задача" (wa_TaskActionScript):
- добавили параметр 'HideTaskEditForm', который берем из соответствующего параметра процесса:
[javascript]function wa_TaskActionOnInitialize(WorkflowAction, ActionItem) {
//...
//Привязка параметра
WFConnectParams(ActionItem, 'HideTaskEditForm');
}[/javascript]
2. Добавили метод для создания задачи без показа формы редактирования:
[javascript]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();
}
}[/javascript]
3. Доработали логику в OnExecute элемента:
[javascript]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;
}[/javascript]
4. При запуске процесса задаем значение параметра HideEditForm:
[javascript]var ParamNames = new Array('HideTaskEditForm');
var ParamValues = new Array(true);
WFStartByID('{F3D2290C-3EFA-437B-A0E9-25D477CD0385}', ParamNames, ParamValues);[/javascript]