﻿# Обработка событий в дублях

> [HTML Version](duplicates-events-processing.html)

Когда в приложении включён поиск похожих элементов, можно создать обработчик событий, который будет отслеживать объединение дублей и запускать нужные действия через скрипт или бизнес-процесс.

Настройка обработчика событий осуществляется в рамках создания [пользовательского модуля](/ru/help/platform/extentions.html). В обработчик можно передавать ссылку на основной элемент и запись, отмеченную дублем, а также свойства из их контекста.

````
начало внимание

````
Обработчик событий для объединения одинаковых записей в приложении доступен при активации решения **ELMA365 CRM**, в котором включён поиск дублей. Создавать модуль и настраивать в нём обработчик могут только пользователи, входящие в группу [Администраторы](360006871932.md#administrators).

````
конец внимание

## ````
Пример обработчика с отслеживанием объединения дублей

Рассмотрим пример создания обработчика событий для приложений раздела **CRM**, в которых включён поиск дублей. 

Например, пользователь находит два элемента с одинаковыми данными и объединяет их в одну запись. Добавленный обработчик события фиксирует это действие и запускает процесс. В его ходе с помощью скриптов передаются данные об основном и объединённом элементе. Затем ответственному менеджеру и его руководителю отправляется задача ознакомления со списком объединённых дублей.

Для настройки обработчика выполните следующие действия:

1. Перейдите в раздел **Администрирование > Модули** и [создайте пользовательский модуль](create-extention.md).

2. В настройках модуля перейдите на вкладку **Процессы** и добавьте [бизнес-процесс](extention-processes.md), который будет выполняться каждый раз после объединения записей-дублей.

Для нашего примера добавим процесс **Уведомление об объединении дублей** и настроим его схему следующим образом:

**(duplicates-events-processing-1.png)**

3. В дизайнере бизнес-процессов перейдите на вкладку **Контекст** и добавьте переменные, в которые обработчик в результате слияния дублей передаст ссылки на основной элемент и объединённые записи:

- **Объединенный элемент** — свойство типа **Произвольное приложение (один)**;

- **Дубликаты** — свойства типа **Произвольное приложение (несколько)**.

4. На вкладке **Схема** разместите два блока [Скрипт](/ru/help/platform/360027203731.html) и задайте в них функции, с помощью которых будет определяться основной элемент и его записи-дубли.

1. Пример скрипта для получения данных о дублях

````
async function getDoubles(): Promise<void> \{  
    // Context.data.doubles — переменная Дубликаты из контекста процесса Уведомление об объединении дублей.  
    // Когда создаётся обработчик события, в нём выполняются настройки, с помощью которых в эту переменную записываются все объединяемые в процессе поиска дублей элементы.  
    // Чтобы узнать, к какому приложению относятся дубли, и определить, к каким свойствам можно обращаться внутри сценария, нужно получить первый элемент списка Context.data.doubles и прочитать его свойство code:  
    let element = await Context.data.doubles\!\[0\].fetch(); // Получаем первый элемент списка Context.data.doubles.  
    let doubles\_app\_code = element.code; // Читаем свойство code.  
    // При помощи проверки значения свойства code, можно сформировать пользовательский сценарий обработки элементов для каждого приложения, в котором активирован поиск дублей:  
    switch(doubles\_app\_code) \{  
        case "\_opportunities":  
            // Создаём в контексте бизнес-процесса переменную Дубли лиды (тип: Приложение > Лиды с опцией Несколько, код для обращения: Context.data.opportunities\_doubles). В ней сохраняются ссылки на записи‑дубли, если тип элементов — лиды:  
            Context.data.opportunities\_doubles = Context.data.doubles as BaseApplicationItem<Application\$\_clients\$\_opportunities\$Data, Application\$\_clients\$\_opportunities\$Params>\[\];  
            // Теперь можно обрабатывать дубли в приложении Лиды:  
            for (let i = 0; i < Context.data.opportunities\_doubles\!.length; i++) \{  
                let opportunity\_double = await Context.data.opportunities\_doubles\[i\].fetch(); // Получаем элемент в цикле  
                let opportunity\_name = opportunity\_double.data.\_\_name; // Получаем имя элемента. Аналогичным образом доступны значения других свойств приложения.  
            \}  
            break;  
        case "\_leads":  
            // При обращении к этому приложению может быть реализована обработка дублей‑сделок.  
            break;  
        case "\_companies":  
            // При обращении к этому приложению может быть реализована обработка дублей‑компаний.  
            break;  
        case "\_contacts":  
            // При обращении к этому приложению может быть реализована обработка дублей‑контактов.  
            break;  
    \}  
\}
````

````
2. Пример скрипта для получения данных об основном (объединённом) элементе

````
async function getMainElement(): Promise<void> \{  
    // Обработка главного (объединённого) элемента аналогична обработке записей‑дублей. Главным отличием является то, что дубликатов всегда несколько, а главный элемент — один.  
    let element = await Context.data.main\_element\!.fetch(); // Получаем первый элемент списка Context.data.doubles.  
    let doubles\_app\_code = element.code; // Читаем свойство code.  
    // При помощи проверки значения свойства code, можно сформировать пользовательский сценарий обработки элементов для каждого приложения, в котором активирован поиск дублей:  
    switch(doubles\_app\_code) \{  
        case "\_opportunities":  
        // Создаём в контексте бизнес-процесса переменную Основной элемент лид (тип: Приложение > Лиды с опцией Один, код для обращения: Context.data.opportunity\_main\_element). В ней сохраняется ссылка на основной элемент — лид:  
        Context.data.main\_element\_opportunity = Context.data.main\_element\! as BaseApplicationItem<Application\$\_clients\$\_opportunities\$Data, Application\$\_clients\$\_opportunities\$Params>;  
        // Теперь можно обрабатывать основной элемент приложения Лиды:  
        let main\_element\_opportunity = await Context.data.main\_element\_opportunity.fetch(); // Получаем элемен.т  
        let main\_opportunity\_name = main\_element\_opportunity.data.\_\_name; // Получаем имя элемента. Аналогичным образом доступны значения других свойств приложения  
            break;  
        case "\_leads":  
        // При обращении к этому приложению может быть реализована обработка дублей‑сделок.  
            break;  
        case "\_companies":  
            // При обращении к этому приложению может быть реализована обработка дублей‑компаний.  
            break;  
        case "\_contacts":  
            // При обращении к этому приложению может быть реализована обработка дублей‑контактов.  
            break;  
    \}  
\}
````

5. ````
Поскольку участники процесса будут определяться в его ходе, на схеме процесса создайте [динамические зоны ответственности](/ru/help/platform/360012263032.html#dynamic): 

- для отвечающих за элемент приложения сотрудников;

- для руководителя отдела продаж.  

6. Чтобы сотрудники могли ознакомиться со списком дублей, найденных обработчиком события, в зонах ответственности разместите блоки [Задача](/ru/help/platform/360012495611.html) и добавьте на форму задачи переменные **Объединенный элемент** и **Дубликаты**.

7. Сохраните и опубликуйте процесс. 

8. В настройках модуля перейдите на вкладку [Обработка событий](/ru/help/platform/events_processing.html). Добавьте обработчик, указав: название, домен события — **Дубли**, событие — **Объединение дубликатов**, тип обработчика — **Запуск процесса**.

**(duplicates-events-processing-2.png)**

9. На открывшейся странице настроек обработчика событий укажите процесс, созданный ранее внутри пользовательского модуля.

10. Перейдите на вкладку **Входные переменные** и назначьте источники данных для переменных из контекста процесса в колонке **Поле элемента**. Для этого сопоставьте их со свойствами события. 

Для события **Объединение дубликатов** предусмотрен набор системных полей (идентификатор события, время выполнения, название объекта, автор и т. д.), а также индивидуальные свойства: ссылка на основной элемент и дубликаты. Для нашего примера необходимо сопоставить переменные **Дубликаты** и **Объединённый элемент**.

**(duplicates-events-processing-3.png)**

Обратите внимание,** **на вкладке **Входные переменные** отображаются свойства, присутствующие в контексте процесса в момент его привязки к обработчику события. Если контекст процесса был изменён, новые переменные не появятся в настройках обработчика. Необходимо повторно создать и настроить обработчик событий, привязав к нему тот же самый бизнес-процесс.

11. На верхней панели страницы настроек нажмите **Сохранить** и **Опубликовать**, чтобы активировать обработчик событий.

12. Вернитесь на основную страницу модуля и включите его.

Теперь, когда пользователь объединит между собой несколько элементов-дублей, в системе сработает обработчик событий, который запустит настроенный бизнес-процесс. Ответственные сотрудники и руководитель отдела ознакомятся с похожими записями на форме отдельных задач.