Прерывание таймера в бизнес-процессе с помощью сценария

Пусть в бизнес-процессе необходимо реализовать следующую логику: задача по данному процессу должна быть назначена на начальника отдела. Если начальник отдела за определенный период времени (4 часа) не успевает выполнить эту задачу, то она автоматически должна переназначаться на его заместителя. На рис.1 изображен фрагмент графической модели процесса, в котором это реализовано:


Рис.1. 

В данном случае с помощью параллельного шлюза задано одновременное выполнение двух веток процесса: в тот момент, когда начальнику отдела назначается задача, включается таймер на 4 часа.  По истечении 4 часов выполняется сценарий, в котором проверяется статус задачи "Задача начальнику", и если она все еще не выполнена, то в этом же сценарии происходит переназначение задачи на заместителя. Если начальник успевает выполнить задачу в срок, то необходимо обеспечить выполнение следующих этапов процесса, т.е. требуется прервать таймер, чтобы процесс не ожидал истечения 4 часов для проверки статуса задачи.
Пример текста сценария, в котором происходит прерывание таймера:

var instances = new []{context.WorkflowInstance};
var allInstanceTimers = Locator.GetServiceNotNull<WorkflowInstanceManager>().GetActiveTimerInfos(instances);
//поиск таймера по его наименованию на графической модели
var t = allInstanceTimers.ToList().Find(a => a.ElementName == "Событие 1"); 
//вывод наименования в контекстную переменную
context.Str = t.ElementName;
var job = EntityManager<IResumeProcessSchedulerJob>.Instance.Load(t.SchedulerJobId);
if (job.Task != null && job.Task.Status == ELMA.Scheduling.Models.SchedulerTaskStatus.Enabled)
{
  //исполнение таймера в настоящий момент, т.е. прерывание
  job.Task.OnceExecuteTime = DateTime.Now;
  job.Task.Save();
}

Для корректной работы сценария необходимо подключить следующие пространства имен:

using EleWise.ELMA.Services;
using EleWise.ELMA.Workflow.Managers;
using EleWise.ELMA.Workflow.Models;
using EleWise.ELMA.Model.Managers;

Стоит отметить, что начиная с версии ELMA 3.2.0 такую логику можно реализовать проще, это продемонстрировано на Рис. 2:

Рис. 2.


В данном случае для решения задачи используется механизм эскалации, подробно эта возможность описана в справке по системе в разделе "Эскалация процесса". В приведенном примере используется эскалация по таймеру: если за 4 часа (время указывается в настройках таймера на переходе) начальник отдела не успевает выполнить задачу, бизнес-процесс автоматически переходит к задаче "Задача заместителю", которая размещена в соответствующей зоне ответственности.