Как найти CRM-объект, созданный из диалога открытой линии

Scope: imopenlines, crm

Кто может выполнять методы:

  • imconnector.send.messages — приложение с доступом к открытым линиям
  • imopenlines.dialog.get — пользователь с правом на доступ к диалогу
  • crm.item.list — пользователь с правом на чтение элементов CRM

Выберите инструмент для разработки с AI-агентом:

  • используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
  • используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации

Коннектор открытой линии передает в Битрикс24 сообщения клиента из внешнего канала: мессенджера, чата на сайте или сервиса поддержки. Если CRM-трекер создает лид, контакт или компанию по обращению, интеграции часто нужно получить идентификатор созданного CRM-объекта.

Не передавайте технические идентификаторы в поле email метода imconnector.send.messages. В CRM это поле используется как адрес электронной почты клиента. Невалидное значение может попасть в контакт или компанию и помешать сценариям, где нужен настоящий email, например отправке чека клиенту.

Как получить идентификатор связанного CRM-объекта

Чтобы найти лид, контакт или компанию, которые CRM-трекер связал с диалогом открытой линии, последовательно выполним методы:

  1. imconnector.send.messages — отправим сообщение клиента в открытую линию и получим идентификатор чата

  2. imopenlines.dialog.get — получим данные диалога и код пользователя открытой линии

  3. crm.item.list — найдем лид, контакт или компанию по точному значению поля мессенджера

Что понадобится

  • Приложение с доступом к открытым линиям и CRM
  • Код коннектора из параметра ID метода imconnector.register. В примерах используется myconnector
  • Идентификатор открытой линии. В примерах используется 107
  • Внешний идентификатор чата или канала. В примерах используется channel-123
  • Внешний идентификатор клиента. В примерах используется ext-user-42

1. Отправим сообщение клиента

Передадим сообщение в открытую линию методом imconnector.send.messages. В блоке user укажем контактные данные клиента.

  • CONNECTOR — код коннектора, который передали в параметре ID метода imconnector.register. Укажем myconnector

  • LINE — идентификатор открытой линии. Укажем 107

  • MESSAGES — массив сообщений. Передадим данные клиента, сообщения и внешнего чата

Как использовать примеры в документации

BX24.callMethod(
            'imconnector.send.messages',
            {
                CONNECTOR: 'myconnector',
                LINE: 107,
                MESSAGES: [
                    {
                        user: {
                            id: 'ext-user-42',
                            name: 'Иван',
                            phone: '+79990000000'
                        },
                        message: {
                            id: 'ext-msg-1001',
                            date: Math.floor(Date.now() / 1000),
                            text: 'Добрый день'
                        },
                        chat: {
                            id: 'channel-123',
                            name: 'Канал поддержки',
                            url: 'https://example.ru/chats/123'
                        }
                    }
                ]
            },
            function(result)
            {
                if(result.error())
                {
                    console.error(result.error());
                }
                else
                {
                    console.dir(result.data());
                }
            }
        );
        
require_once('crest.php');
        
        $result = CRest::call(
            'imconnector.send.messages',
            [
                'CONNECTOR' => 'myconnector',
                'LINE' => 107,
                'MESSAGES' => [
                    [
                        'user' => [
                            'id' => 'ext-user-42',
                            'name' => 'Иван',
                            'phone' => '+79990000000',
                        ],
                        'message' => [
                            'id' => 'ext-msg-1001',
                            'date' => time(),
                            'text' => 'Добрый день',
                        ],
                        'chat' => [
                            'id' => 'channel-123',
                            'name' => 'Канал поддержки',
                            'url' => 'https://example.ru/chats/123',
                        ],
                    ],
                ],
            ]
        );
        
        echo '<PRE>';
        print_r($result);
        echo '</PRE>';
        

Если сообщение передано успешно, метод вернет данные сессии открытой линии в блоке session.

{
            "result": {
                "SUCCESS": true,
                "DATA": {
                    "RESULT": [
                        {
                            "SUCCESS": true,
                            "session": {
                                "ID": "323",
                                "CHAT_ID": "1767"
                            }
                        }
                    ]
                }
            }
        }
        

Сохраните значения:

  • session.ID — идентификатор сессии открытой линии

  • session.CHAT_ID — идентификатор чата в Битрикс24. Он понадобится на следующем шаге

2. Получим данные диалога

Получим данные чата методом imopenlines.dialog.get. В параметр CHAT_ID передадим значение session.CHAT_ID из ответа метода imconnector.send.messages.

BX24.callMethod(
            'imopenlines.dialog.get',
            {
                CHAT_ID: 1767
            },
            function(result)
            {
                if(result.error())
                {
                    console.error(result.error());
                }
                else
                {
                    console.dir(result.data());
                }
            }
        );
        
require_once('crest.php');
        
        $result = CRest::call(
            'imopenlines.dialog.get',
            [
                'CHAT_ID' => 1767,
            ]
        );
        
        echo '<PRE>';
        print_r($result);
        echo '</PRE>';
        

В ответе важны два поля:

  • entity_id — код пользователя открытой линии. По нему можно сформировать значение поля Мессенджер в CRM

  • entity_data_2 — строка с привязками CRM, которые уже есть у диалога

{
            "result": {
                "id": 1767,
                "entity_type": "LINES",
                "entity_id": "myconnector|107|channel-123|ext-user-42",
                "entity_data_2": "LEAD|0|COMPANY|0|CONTACT|42|DEAL|0",
                "dialog_id": "chat1767"
            }
        }
        

Чтобы получить значение поля Мессенджер в CRM, добавьте к entity_id префикс imol|. В примере это:

imol|myconnector|107|channel-123|ext-user-42
        

3. Найдем CRM-объект по полю мессенджера

Выполните точный поиск по полю мессенджера методом crm.item.list. Передавайте тип CRM-объекта в параметре entityTypeId:

  • 1 — лид
  • 3 — контакт
  • 4 — компания

В универсальных методах CRM значение мессенджера IMOL доступно в поле imol. Поле fm с мультиполями нельзя явно запросить через select. Чтобы получить fm в ответе, передайте select: ['*'].

В примере найдем контакт, поэтому передадим entityTypeId = 3.

  • entityTypeId — тип CRM-объекта. Для контакта укажите 3

  • filter[=imol] — значение поля Мессенджер: префикс imol| и entity_id из ответа метода imopenlines.dialog.get

  • select — список полей, которые нужно вернуть. Для поиска идентификатора достаточно поля id

BX24.callMethod(
            'crm.item.list',
            {
                entityTypeId: 3,
                select: [
                    'id',
                    'title',
                    'imol'
                ],
                filter: {
                    '=imol': 'imol|myconnector|107|channel-123|ext-user-42'
                }
            },
            function(result)
            {
                if(result.error())
                {
                    console.error(result.error());
                }
                else
                {
                    console.dir(result.data());
                }
            }
        );
        
require_once('crest.php');
        
        $result = CRest::call(
            'crm.item.list',
            [
                'entityTypeId' => 3,
                'select' => [
                    'id',
                    'title',
                    'imol',
                ],
                'filter' => [
                    '=imol' => 'imol|myconnector|107|channel-123|ext-user-42',
                ],
            ]
        );
        
        echo '<PRE>';
        print_r($result);
        echo '</PRE>';
        

Если контакт найден, метод вернет его данные в массиве items.

{
            "result": {
                "items": [
                    {
                        "id": 42,
                        "title": "Иван",
                        "imol": "imol|myconnector|107|channel-123|ext-user-42"
                    }
                ]
            },
            "total": 1
        }
        

Значение items[0].id — идентификатор найденного CRM-объекта. В примере найден контакт с идентификатором 42.

Если контакт не найден, повторите запрос с entityTypeId = 1 для лида и entityTypeId = 4 для компании.

Если CRM-объект не найден

Проверьте значения, которые связывают шаги сценария:

  • в ответе imconnector.send.messages есть блок session с CHAT_ID
  • в запрос imopenlines.dialog.get передан CHAT_ID из ответа imconnector.send.messages
  • в ответе imopenlines.dialog.get есть непустое поле entity_id
  • в фильтр crm.item.list передано значение с префиксом imol|, например imol|myconnector|107|channel-123|ext-user-42
  • в entityTypeId указан тип CRM-объекта, который мог создать CRM-трекер: 1, 3 или 4
  • пользователь, от имени которого выполняется crm.item.list, имеет право на чтение найденного CRM-объекта

Если метод crm.item.list возвращает ошибку INVALID_ARG_VALUE, проверьте поле в фильтре. Для поиска по мессенджеру используйте =imol.

Что важно учитывать

  • Не используйте поле email для технических маркеров. Передавайте в него только настоящий адрес электронной почты клиента
  • Сохраняйте session.CHAT_ID и session.ID из ответа imconnector.send.messages
  • Используйте entity_id из imopenlines.dialog.get с префиксом imol| как точное значение для поиска по мессенджеру
  • Проверяйте несколько типов CRM-объектов, если настройки CRM-трекера могут создавать лиды, контакты или компании