logo

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

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

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

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