Открытые линии
Связь с CRM
Рабочая справка по связи открытых линий с CRM: как найти чат и сессию по CRM-сущности, где искать CRM_ENTITY_ID и как понимать imopenlines.crm.*.
Открытая линия может быть связана с лидом, сделкой, контактом или компанией. В коробке связь часто удобнее искать через сессии открытых линий и IM-чат.
Общее понимание
Связь с CRM нужна, чтобы понять, к какой карточке относится диалог с клиентом.
Как открытая линия связана с CRM
Когда клиент пишет в открытую линию, Битрикс может создать или найти CRM-карточку и связать её с диалогом. Конкретное поведение зависит от настроек открытой линии и CRM.
Где искать связь
| Где смотреть | Что искать |
|---|---|
SessionTable | CRM-поля сессии, если они заполнены на портале. |
ChatTable | ENTITY_TYPE, ENTITY_ID, служебные данные чата. |
REST imopenlines.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);