logo

[ELMA3] Выполнение скрипта по событию

В примере рассмотрено, каким образом по событию Создание клиента можно выполнить какой-либо сценарий.

Порядок действий

  1. Создать в Дизайнере какой-либо служебный объект. В нем будет находиться сценарий с переопределением события.
  2. В карточке объекта перейти на вкладку Сценарии и создать модуль.
  3. Добавить класс с переопределением события:
[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); // Сообщение об ошибке запуска процессе 
                    // Выйти из процедуры запуска 
                } 
            }    
        }
    }