logo

[ELMA3] Проверка наличия незавершенных процессов согласования документа с помощью сценария

Сценарий для проверки наличия незавершенных процессов согласования документа. В начало бизнес-процесса необходимо добавить исключающий ИЛИ-шлюз и блок сценария.

Переход "Есть незавершённый процессы" необходимо пометить как переход по умолчанию.

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

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

Контекстные переменные:

  • Документ (context.DocumentHere) – переменная типа Документ. Документ, который отправляется на согласование;
  • Итератор (context.Iterator) – переменная типа Целое число. Не может иметь пустое значение, по умолчанию имеет значение ‘0’;
  • Список процессов (context.CheckList) – переменная типа Текст.

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

using EleWise.ELMA.API;

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

var findedWorkflows = PublicAPI.Processes.WorkflowInstance.Filter().GeneralStatus(PublicAPI.Enums.Workflow.WorkflowInstanceGeneralStatus.Current).Query(String.Format("Id IN (FROM P_Approvement SELECT WorkflowInstance WHERE DocumentThere = {0})", context.DocumentHere.Id.ToString())).Find();
//Запись наименований запущенных процессов согласования в текстовую переменную CheckList
foreach(var proc in findedWorkflows)
{
    context.CheckList += "\n" + proc.Name.ToString(); //Запись наименования экземпляра процесса
    context.Iterator++; //Увеличение счётчика запущенных процессов
}

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

Контекстные переменные:

  • Документ (context.DocumentHere) – переменная типа Документ. Документ, который отправляется на согласование;
  • Итератор (context.Iterator) – переменная типа Целое число. Не может иметь пустое значение, по умолчанию имеет значение ‘0’;
  • Список процессов (context.CheckList) – переменная типа Текст.

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

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

Текст сценария в блоке Поиск запущенных процессов:

var filter = InterfaceActivator.Create<IWorkflowInstanceFilter>(); //Создание фильтра по экземплярам процесса
filter.GeneralStatus = WorkflowInstanceGeneralStatus.Current; //Поиск запущенных процессов
filter.Query = String.Format("Id IN (FROM P_Approvement SELECT WorkflowInstance WHERE DocumentThere = {0})", context.DocumentHere.Id.ToString());
var findedWorkflows = WorkflowInstanceManager.Instance.Find(filter, null); //Поиск экземпляров процессов по указанному фильтру

//Запись наименований запущенных процессов согласования в текстовую переменную CheckList
foreach(var proc in findedWorkflows)
{
	context.CheckList += "\n" + proc.Name.ToString(); //Запись наименования экземпляра процесса
	context.Iterator++; //Увеличение счётчика запущенных процессов
}

Разбор запроса filter.Query:

P_Approvement имя класса процесса в базе данных, запущенные экземпляры которого мы ищем. Найти это имя можно во вкладке Настройки бизнес-процесса.

DocumentThere – имя контекстной переменной в базе, совпадения по которой мы ищем. В данном примере нам нужно найти документ. Имя можно посмотреть во вкладке Контекст бизнес-процесса, запущенные экземпляры которого необходимо найти.

В условии перехода Нет запущенных процессов необходимо указать сценарий:

if(context.Iterator == 0)
	return true;
else
	return false;