Выполнение скрипта по событию
В примере рассмотрено, каким образом по событию Создание клиента можно выполнить какой-либо сценарий.
Порядок действий
- Создать в Дизайнере какой-либо служебный объект. В нем будет находиться сценарий с переопределением события.
- В карточке объекта перейти на вкладку Сценарии и создать модуль.
- Добавить класс с переопределением события:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [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.12.1 включительно.
Пространство имен:
1 | using EleWise.ELMA.API; |
Текст сценария:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | [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.Error("Ошибка запуска процесса", ex); // Сообщение об ошибке запуска процессе // Выйти из процедуры запуска } } } } |
Пример сценария без использования PublicAPI
Пространства имен:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; |
Текст сценария:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | [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.Error("Ошибка запуска процесса", ex); // Сообщение об ошибке запуска процессе // Выйти из процедуры запуска } } } } |