← Назад к справке

Открытые линии

Связь с CRM

Рабочая справка по связи открытых линий с CRM: как найти чат и сессию по CRM-сущности, где искать CRM_ENTITY_ID и как понимать imopenlines.crm.*.

Открытая линия может быть связана с лидом, сделкой, контактом или компанией. В коробке связь часто удобнее искать через сессии открытых линий и IM-чат.

Общее понимание

Связь с CRM нужна, чтобы понять, к какой карточке относится диалог с клиентом.

Как открытая линия связана с CRM

Когда клиент пишет в открытую линию, Битрикс может создать или найти CRM-карточку и связать её с диалогом. Конкретное поведение зависит от настроек открытой линии и CRM.

Поиск связи

В коробке практично начинать с сессии и чата.

Через сессию открытой линии

Поля CRM в сессии могут отличаться в зависимости от версии и настроек. Поэтому сначала полезно вывести одну сессию целиком и посмотреть фактическую структуру.

<?php

use Bitrix\Main\Loader;
use Bitrix\ImOpenLines\Model\SessionTable;

Loader::includeModule('imopenlines');

/**
 * Получает последнюю сессию открытой линии и выводит все поля.
 */
function fetchOpenLineSessionRaw(int $chat_id): ?array
{
    $session = SessionTable::getList([
        'select' => [
            '*',
        ],
        'filter' => [
            '=CHAT_ID' => $chat_id,
        ],
        'order' => [
            'ID' => 'DESC',
        ],
        'limit' => 1,
    ])->fetch();

    return is_array($session) ? $session : null;
}

$session = fetchOpenLineSessionRaw($chat_id);

print_r($session);

После проверки реальных полей можно оставить в select только нужные: ID, CHAT_ID, USER_CODE, STATUS, CRM_ENTITY_TYPE, CRM_ENTITY_ID, если они есть на портале.

Через чат CRM

Если у чата заполнены ENTITY_TYPE и ENTITY_ID, связь можно искать через ChatTable.

<?php

use Bitrix\Main\Loader;
use Bitrix\Im\Model\ChatTable;

Loader::includeModule('im');

/**
 * Получает CRM-чаты по внешнему ID сущности.
 */
function fetchCrmChatsByEntityId(string $entity_id): array
{
    $chats = [];

    $chat_result = ChatTable::getList([
        'select' => [
            'ID',
            'TITLE',
            'TYPE',
            'ENTITY_TYPE',
            'ENTITY_ID',
            'ENTITY_DATA_1',
            'ENTITY_DATA_2',
            'ENTITY_DATA_3',
        ],
        'filter' => [
            '=ENTITY_TYPE' => 'CRM',
            '=ENTITY_ID' => $entity_id,
        ],
        'order' => [
            'ID' => 'DESC',
        ],
    ]);

    while ($chat = $chat_result->fetch()) {
        $chats[] = $chat;
    }

    return $chats;
}

$deal_chats = fetchCrmChatsByEntityId('DEAL|123');

print_r($deal_chats);

Сообщения из CRM

Для REST-интеграций у открытых линий есть отдельные методы работы с CRM-чатом.

Найти чат по CRM-сущности

В REST-документации для открытых линий описан сценарий: найти чат, связанный с CRM-сущностью, через imopenlines.crm.chat.get или получить данные диалога через imopenlines.dialog.get.

/**
 * Готовит параметры поиска чата открытой линии по CRM-сущности.
 */
function buildOpenLineCrmChatPayload(string $crm_entity_type, int $crm_entity_id): array
{
    return [
        'CRM_ENTITY_TYPE' => $crm_entity_type,
        'CRM_ENTITY_ID' => $crm_entity_id,
    ];
}

$payload = buildOpenLineCrmChatPayload('DEAL', $deal_id);

print_r($payload);

Отправка сообщения

Для отправки сообщения из CRM в чат открытой линии в REST используется imopenlines.crm.message.add. В коробочном PHP лучше не имитировать это прямой вставкой в таблицу сообщений.

/**
 * Готовит параметры отправки сообщения в CRM-чат открытой линии.
 */
function buildOpenLineCrmMessagePayload(
    string $crm_entity_type,
    int $crm_entity_id,
    int $user_id,
    string $message
): array {
    return [
        'CRM_ENTITY_TYPE' => $crm_entity_type,
        'CRM_ENTITY_ID' => $crm_entity_id,
        'USER_ID' => $user_id,
        'MESSAGE' => $message,
    ];
}

$payload = buildOpenLineCrmMessagePayload(
    'DEAL',
    $deal_id,
    $user_id,
    'Комментарий из CRM'
);

print_r($payload);

Источники