Здравствуйте.
Скажите пожалуйста можно ли сделать так, чтобы один бизнес-процесс завершался тем, что устанавливается дата запуска такого же бизнес-процесса через некоторое время.
И как это можно сделать?
Спасибо большое.
Нравится
Здравствуйте Ирина,
Если необходимо регулярно выполнять БП предлагаю воспользоваться инструментом JobManager (появлялся в 3.4.0)
Алексей, а как работает этот инструмент? Он поможет нам выполнить нашу задачу. То есть чтобы один БП заканчивался назначением даты автоматического запуска другого БП? Спасибо.
Ирина теоритически данную задачу можно выполнить двумя способами:
- Если в БП есть элемент Задача, то в данном элементе есть такие параметры, как "Выполнить через" (ExecuteAfterTimeValue)
- 2. В БП дату записать в специальную таблицу, при старте Terrasoft'a проверять данную таблицу, на совпадение текущей даты с введённой ранее по БП, и в зависимости от этого запускать БП функцией WFStartByID
Фактически мы можем пересчитать дни в дате, которую вы получаете по БП, в определенный тип ExecuteAfterTimeTypeID (день, час, неделя, год) и зациклить данный процесс, предварительно установив нужные значения в ExecuteAfterTimeValue
Алексей, с первым шагом все понятно. А вот второй можно по-подробнее. Как это реализовать? Спасибо.
Ирина, здравствуйте.
Предлагаю решить задачу следующим образом:
1. Создать таблицу tbl_NextStartTime(tbl + sq + ds) через TS Admin, добавив туда поле NextStartDate типа DateTime. Добавить это поле в sq и ds. Добавить туда одну запись (запись нужно добавить через SQL Скрипт, для того чтобы таблица не была пуста и её можно было отредактировать методом Edit();)
2. В искомом БП, к примеру последним пунктом, добавить элемент скрипт и определить для него событие OnExecute, в котором записываем в созданную таблицу дату следующего запуска:
var Dataset = Services.GetNewItemByUSI('ds_NextStartTime'); Dataset.Open(); Dataset.Edit(); var CurrentDate = new Date(System.Now()); var NextDate = new Date(CurrentDate.getFullYear(), CurrentDate.getMonth(), CurrentDate.getDate()+1); Dataset.Values('NextStartTime') = NextDate.getVarDate(); Dataset.Post(); Dataset.Close();
Далее при старте системы (ссылка), добавляем вызов своей функции, которая будет проверять текущую дату с той, которая записана в датасете, и если она больше либо равна той, записанной в датасете, вызывался запуск бизнес процесса:
var Dataset = Services.GetNewItemByUSI('ds_NextStartTime'); Dataset.Open(); var Now = new Date(System.Now()); var NextStart = Dataset('NextStartTime').ValAsDateTime; Dataset.Close(); if (Now.getFullYear() == NextStart.getFullYear() && Now.getMonth() == NextStart.getMonth() && Now.getDate() == NextStart.getDate()) { var WorkflowEngine = GetWorkflowEngine(); var WorkflowUSI = 'Workflow\\Workflow Diagrams\\wd_AutoSale'; var Now = new Date(System.Now()).getVarDate(); var ID = WorkflowEngine.StartWorkflow(WorkflowUSI, Now); }