Использование фильтра по контексту процесса

В данной статье представлен пример использования фильтра по контексту бизнес-процесса. Допустим, требуется получить экземпляры процесса, в которых переменная context.Nomer=10. Следует отметить, что в процессе, по которому будет осуществляться поиск, у контекстной переменной Nomer обязательно должен быть установлен флажок Участвует в поиске.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.13.11 включительно.

Пространства имен:

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

Текст сценария:

var filter = InterfaceActivator.Create<WorkflowInstanceFilter>();//создаем экземпляр фильтра
var header = PublicAPI.Processes.ProcessHeader.Load(31);//загружаем процесс в переменную в зависимости от id
//var header = PublicAPI.Processes.ProcessHeader.Find("Name = 'Мой процесс'").FirsOrDefault();//Или ищем по имени
//var header = PublicAPI.Processes.ProcessHeader.Find("Token = 'WebToker'").FirsOrDefault();//Или по токену запуска из внешних систем, если он задан
var contextFilterType = Locator.GetServiceNotNull<WorkflowInstanceContextService>().GetInstanceContextFilterType(header.Published);//задаем тип фильтра контекста
dynamic fl = Activator.CreateInstance(contextFilterType);//создаем экземпляр фильтра по контексту
fl.StrokaVPoiske = "строка"; //присваиваем значение переменной, по которому будет фильтровать
filter.ContextFilter = fl;//присваиваем искомое значение фильтру
filter.ProcessHeader = header;    //присваиваем фильтру процесс, который определили по Id
var process = WorkflowInstanceManager.Instance.FindUsingContext(filter, null);//задаем поиск по контексту.
foreach(var p in process)
{
    Console.WriteLine(p.AsDynamic().WorkflowInstance.Name);//выводим названия экземпляров процесса
}

Пример сценария без использования PublicAPI

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

Microsoft.CSharp

Пространства имен:

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

Текст сценария:

var filter = InterfaceActivator.Create<WorkflowInstanceFilter>();//создаем экземпляр фильтра
var header = ProcessHeaderManager.Instance.Load(31);//загружаем процесс в переменную в зависимости от id
var contextFilterType = Locator.GetServiceNotNull<WorkflowInstanceContextService>().GetInstanceContextFilterType(header.Published);//задаем тип фильтра контекста
dynamic fl = Activator.CreateInstance(contextFilterType);//создаем экземпляр фильтра по контексту
fl.StrokaVPoiske = "строка"; //присваиваем значение переменной, по которому будет фильтровать
filter.ContextFilter = fl;//присваиваем искомое значение фильтру
filter.ProcessHeader = header;    //присваиваем фильтру процесс, который определили по Id
var process = WorkflowInstanceManager.Instance.FindUsingContext(filter, null);//задаем поиск по контексту.
foreach(var p in process)
            {
                Console.WriteLine(p.AsDynamic().WorkflowInstance.Name);//выводим названия экземпляров процесса
            }

Стоит обратить внимание, что после выполнения данного сценария, в переменную "Process” запишется список объектов, которые удовлетворяют условию фильтра. Работать с этим списком, зачастую, нужно как с динамическим набором данных (система воспринимает данные в переменной как список даже при учете, что условию удовлетворяет один экземпляр). В дальнейшем можно поставить цикл для работы со списками и работать уже с конкретным экземпляром процесса, например:

foreach(var p in process)
{
      p.AsDynamic().WorkflowInstance.Name = "Измененное имя";//смена имени.
}