﻿# Обработка событий в задачах CRM

> [HTML Version](crm-events-processing.html)

Обработчик событий позволяет настроить автоматический запуск заданного действия при изменениях в [задаче CRM](360012911980.md). Добавление такого обработчика доступно в [пользовательском модуле](extentions.md).

Вы можете отслеживать события по любому типу задач CRM: **Звонок**, **Письмо**, **Вебинар**, **Встреча**, [пользовательский тип](create-custom-crm-task.md). Для этого выберите, когда сработает обработчик:

- создание — при добавлении новой задачи CRM вручную или с помощью [графических элементов](call.md);

- обновление — при изменении значения в свойстве из контекста задачи CRM. Например, когда она [переназначается](actions-with-tasks.md#reassign-task), её выполнение переносится на другой срок или меняется статус. При закрытии задачи CRM также фиксируется событие обновления;

- отмена — когда исполнение задачи CRM прерывается;

- завершение — при закрытии задачи CRM.

````
начало внимание

````
Создавать модуль и настраивать в нём обработчики событий могут только [администраторы системы](/ru/help/platform/360006871932.html#administartors).

````
конец внимание 

## ````
Пример обработчика с отслеживанием создания задачи CRM

Данные о задаче и элементе, по которому она поставлена, поступают в обработчик в виде JSON-файла. Вы можете получить из него отдельные значения свойств из контекста задачи. Затем их можно передать в настроенный бизнес-процесс или скрипт, с которым связан обработчик событий. Например, так можно использовать ID задачи, дату её создания и окончания, ответственного за выполнение пользователя и т. д.

Рассмотрим пример обработчика событий, в котором при создании задачи CRM типа **Письмо** с помощью скрипта обрабатывается JSON‑файл с данными об этой задаче. Затем они передаются в бизнес-процесс и записываются в отдельные переменные. В ходе процесса руководитель отдела продаж получает задачу ознакомления с деталями добавленного письма.

Для настройки обработчика, выполните следующие действия:

1. Перейдите в раздел **Администрирование > Модули** и [создайте пользовательский модуль](create-extention.md). 

2. В настройках модуля перейдите на вкладку **Процессы** и добавьте [бизнес-процесс](/ru/help/platform/extention-processes.html), который будет выполняться каждый раз после создания задачи CRM. 

Для нашего примера добавим простой процесс **Уведомление о новой задаче CRM**. Его схема будет выглядеть следующим образом:

(crm-events-processing-1.png)

3. В дизайнере бизнес-процессов перейдите на вкладку **Контекст** и добавьте переменные, в которые обработчик в результате создания задачи передаст данные о ней. При создании каждой переменной выберите код, тип и подтипы приведённые ниже:

(crm-events-processing-2.png)

- **Строковое представление события **— в переменную запишется строковое представление JSON-объекта, содержащего данные о задаче CRM;

- **Название задачи**, **Контакты по задаче**, **Описание задачи**, **Дата начала задачи**, **Дата окончания задачи**, **Исполнитель** — свойства, в которые с помощью скрипта в процессе передаются полученные данные из созданной задачи. 

4. Перейдите на вкладку **Схема**. В зоне ответственности **Инициатор** сразу после стартового события разместите блок [Скрипт](/ru/help/platform/360027203731.html) и задайте в нём функцию `afterInit`. С помощью скрипта в функции из полученного от обработчика JSON-файла формируется строковое представление данных о задаче, а затем информация записывается в отдельные свойства.

Пример скрипта для получения данных о задаче CRM из JSON-файла

````
async function afterInit(): Promise<void> \{   
    // Из полученной в виде JSON-файла константы task формируем строковое представление:  
    const task = JSON.parse(Context.data.event\_string\!);  
    // Теперь полученные данные можно записать в отдельные свойства  
    //Получаем название задачи CRM:  
    Context.data.task\_name = task.\_\_name;  
    //Получаем описание задачи CRM:  
    Context.data.task\_description = task.description;  
    // С помощью цикла получаем список контактов, указанных в задаче CRM  
    Context.data.task\_contact = \[\];  
    for (const contact\_id of task.instance.contacts) \{  
        const contact = await Context.fields.task\_contact.app.search()  
            .where(  
                f => f.\_\_id.eq(contact\_id)  
            ).first();  
        Context.data.task\_contact.push(contact\!);  
    \}  
    // Получаем дату и время создания задачи CRM  
    Context.data.task\_start\_date = new Datetime(new Date(task.planStart));  
    // Получаем дату и время завершения задачи CRM  
    Context.data.task\_end\_date = new Datetime(new Date(task.planEnd));  
    //Получаем ответственного за выполнение задачи по ID пользователя  
    const performer\_id = task.originalPerformers\[0\];  
    Context.data.task\_executor = await System.users.search().where(  
        f => f.\_\_id.eq(performer\_id)  
    ).first();  
\}
````

5. ````
Перейдите на схему процесса и создайте [статическую зону ответственности](/ru/help/platform/360012263032.html#static), поскольку задача назначается руководителю отдела продаж, записанному в элемент оргструктуры. 

6. Чтобы руководитель мог ознакомиться с данными о созданном письме, полученными из обработчика событий, разместите в дополнительной зоне ответственности блок [Задача](/ru/help/platform/360012495611.html). На форму задачи вынесите свойства, в которые в процессе записывается информация о письме: **Название задачи**, **Контакты по задаче**, **Описание задачи**, **Дата начала задачи**, **Дата окончания задачи**, **Исполнитель**.

7. Сохраните и опубликуйте процесс.

8. В настройках модуля перейдите на вкладку [Обработка событий](/ru/help/platform/events_processing.html). Добавьте обработчик, указав: название обработчика, домен — **Задачи**, событие — **Создание задачи CRM**, тип задачи — **Письмо**, тип обработчика — **Запуск скрипта**.

(crm-events-processing-3.png)

9. На открывшейся странице настроек обработчика событий перейдите на вкладку **Скрипты**. В функции `action` укажите скрипт, который будет преобразовывать JSON-файл в строковое представление и запускать настроенный ранее процесс **Уведомление о новой задаче CRM**: 

````
async function action(): Promise<void> \{  
    // Получаем строковое представление данных о задаче, создание которой запустило обработчик, и сохраняем их в константу task\_json\_string:  
    const task\_json\_string = JSON.stringify(Context.data.task);  
    // Запускаем раннее созданный бизнес-процесс, передав task\_json\_string в переменную Строковое представление события из контекста процесса:  
    await Namespace.processes.uvedomlenie\_o\_novoi\_zadache\_crm.run(\{  
        event\_string: task\_json\_string,  
    \})  
\}

10. ````
На верхней панели страницы нажмите **Сохранить**, а затем **Опубликовать**, чтобы активировать обработчик событий.

11. Вернитесь на основную страницу модуля и включите его.

Теперь при включённом модуле, когда пользователь создаст задачу CRM — **Письмо**, в системе сработает обработчик событий. C помощью скрипта он запустит настроенный бизнес-процесс. Руководитель отдела продаж получит задачу, в которой сможет ознакомиться со всеми данными о задаче.