[ELMA3] Выполнение скрипта по событию
В примере рассмотрено, каким образом по событию Создание клиента можно выполнить какой-либо сценарий.
Порядок действий
- Создать в Дизайнере какой-либо служебный объект. В нем будет находиться сценарий с переопределением события.
- В карточке объекта перейти на вкладку Сценарии и создать модуль.
- Добавить класс с переопределением события:
[Component]
public class НазваниеКлассаЖелательноНаЛатинице : PostFlushEventListener
{
//создание объекта
public override void OnPostInsert(PostInsertEvent @event)
{
// Проверяем @event.Entity на нужный тип и выполняем с ним необходимы действия
}
//редактирование объекта
public override void OnPostUpdate(PostUpdateEvent @event)
{
// Проверяем @event.Entity на нужный тип и выполняем с ним необходимы действия
}
}
4. Опубликовать объект и перезапустить сервер. После этого при создании контрагента будет выполняться описанное в сценарии действие.
Пример сценария для запуска определенного процесса при создании Контрагента
Пример сценария с использованием PublicAPI
Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.15.38 включительно.
Пространство имен:
using EleWise.ELMA.API;
Текст сценария:
[Component]
public class Contractor_proc_run : PostFlushEventListener
{
public override void OnPostInsert(PostInsertEvent @event)
{
// Проверяем @event.Entity на нужный тип и выполняем с ним необходимы действия
if (@event.Entity is IContractor)
{
var header = PublicAPI.Processes.ProcessHeader.Filter().Startable(true).Name("контрагент").Find().FirstOrDefault();
if (header == null) //нужно написать свое название процесса
{
throw new Exception("Процесс не найден"); // Если процесс не обнаружен, то выводим ошибку
}
var process = header.Published;
if (process == null)
{
throw new Exception("Процесс не опубликован"); // Если процесс не опубликован, то выводим ошибку
}
try
{
PublicAPI.Processes.WorkflowInstance.StartProcess(process, "_Name");//"_Name" - название экземпляра
} catch (Exception ex)
{
// Logger.Log.Error("Ошибка запуска процесса", ex); // Сообщение об ошибке запуска процессе
// Выйти из процедуры запуска
}
}
}
}
Пример сценария без использования PublicAPI
Пространства имен:
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.CRM.Models;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Types.Settings;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Runtime.NH.Listeners;
using EleWise.ELMA.Security.Services;
using EleWise.ELMA.Services;
using EleWise.ELMA.Workflow.Managers;
using EleWise.ELMA.Workflow.Services;
using EleWise.ELMA.Workflow.Models;
using NHibernate.Event;
Текст сценария:
[Component]
public class Contractor_proc_run : PostFlushEventListener
{
public override void OnPostInsert(PostInsertEvent @event)
{
// Проверяем @event.Entity на нужный тип и выполняем с ним необходимы действия
if (@event.Entity is IContractor)
{
//var header = PublicAPI.Processes.ProcessHeader.Filter().Startable(true).Name("контрагент").Find().FirstOrDefault();
var mng = ProcessHeaderManager.Instance;
var filter = InterfaceActivator.Create<ProcessHeaderFilter>();
filter.Name = "контрагент";
filter.Startable = true;
var header = mng.Find(filter, null).FirstOrDefault();
if (header == null) //нужно написать свое название процесса
{
throw new Exception("Процесс не найден"); // Если процесс не обнаружен, то выводим ошибку
}
var process = header.Published;
if (process == null)
{
throw new Exception("Процесс не опубликован"); // Если процесс не опубликован, то выводим ошибку
}
var workflowService = Locator.GetServiceNotNull<IWorkflowRuntimeService>();
var instance = WorkflowInstanceManager.Instance.Create();
instance.Process = process;
instance.Name = "_Name"; //имя экземпляра процесса
instance.Initiator = AuthenticationService.GetCurrentUser<EleWise.ELMA.Security.Models.IUser>(); // Запуск от текущего исполнителя
try
{
workflowService.Run(instance);
} catch (Exception ex)
{
// Logger.Log.Error("Ошибка запуска процесса", ex); // Сообщение об ошибке запуска процессе
// Выйти из процедуры запуска
}
}
}
}