Документация для разработчиков
Темная тема

Клиент в CRM

У нескольких типов сущностей CRM существует поле Клиент, позволяющее привязать к элементам данной сущности Контакт и Компанию. В зависимости от реализации, к одному элементу можно привязать от одного до нескольких Контактов и (или) Компаний.

Простой случай - одиночная привязка

В самом простом случае, к одному элементу можно привязать только одну клиентскую сущность. Чаще всего эта реализация применяется к Компании.

Связь обеспечивается посредством записи ID клиентской сущности в колонку CONTACT_ID для Контактов и COMPANY_ID для Компаний.

Пример подобной реализации - привязка Компании к сделке (таблица b_crm_deal).

Сложный случай - множественная привязка

К нескольким типам сущностей (Сделка, Предложение, Лид) можно привязать несколько Контактов. Один из них будет являться основным, остальные - дополнительными.

Со стороны БД

Для этого обеспечивается связь M:N между элементами сущностей и Контактов посредствам специальной таблицы. Для каждой сущности имеется отдельная таблица с названием вида b_crm_entity_type_name_contacts (например, b_crm_deal_contacts, b_crm_quote_contacts). Таблица имеет следующую структуру (на примере b_crm_deal_contacts):

Имя поля Описание Комментарий
DEAL_ID INT(1) UNSIGNED NOT NULL Ссылка на элемент сущности
CONTACT_ID INT(1) UNSIGNED NOT NULL Ссылка на контакт
SORT INT NOT NULL
ROLE_ID TINYINT(1) NOT NULL
IS_PRIMARY CHAR(1) NOT NULL Является ли контакт основным

ID основного контакта (IS_PRIMARY === 'Y') также дополнительно помещается в колонку CONTACT_ID связанной сущности.

У Заказа (order) реализована множественная привязка как Контактов, так и Компаний. Структура таблицы (b_crm_contact_company) и API в случае с данным типом сущности отличается от остального CRM, поэтому здесь он рассмотрен не будет.

Со стороны API

Для работы со связанными сущностями в CRM существует отдельный неймспейс Bitrix\Crm\Binding. Множественная связь с клиентами реализуется здесь же. В неймспейсе находятся таблеты промежуточных таблиц (DealContactTable и др.), и классы, обрабатывающие специальные массивы связи, которые будут рассмотрены ниже - EntityBinding и BindingHelper.

Массивы связи (bindings)

Информация о связях внутри CRM передается в формате массивов специальной структуры - массивов связи (bindings). Они формируются и обрабатываются с помощью методов класса EntityBinding.

Массив имеет следующую структуру:

$bindings = [
	[
		'CONTACT_ID' => 1, // Ссылка на клиентскую сущность. В случае с Компанией используется COMPANY_ID
		'SORT' => 10,
		'ROLE_ID' => 0,
		'IS_PRIMARY' => 'Y',
	], 
	// В массиве как минимум присутствуют поля CONTACT_ID (COMPANY_ID) и SORT
	[
		'CONTACT_ID' => 2,
		'SORT' => 20,
	],
];

Как добавить/удалить клиента

Добавить/удалить клиента можно при создании или обновлении сущности через соответствующий ей класс (CCrmDeal и т.п.). Для этого в параметре $arFields нужно передать соответствующие значения.

$deal = new \CCrmDeal();
$newDealId = $deal->Add([
	'COMPANY_ID' => 1,

	// Для привязки контакта можно передать любой из ключей ниже. Если передана один, другие не нужны
	'CONTACT_ID' => 12, // Привязка одного контакта
	'CONTACT_IDS' => [1, 2, 3], // Привязка нескольких контактов. Первый контакт будет сохранен как основной
	'CONTACT_BINDINGS' => [ // Привязка нескольких контактов. Позволяет в явном виде задать основной контакт, сортировку и др
		'CONTACT_ID' => 1, 
		'SORT' => 10, 
		'ROLE_ID' => 0,
		'IS_PRIMARY' => 'Y',
	],
	[
		'CONTACT_ID' => 2,
		'SORT' => 20,
	],
]);

При обновлении (CCrmDeal::Update) в параметре $arFields можно передать те же ключи, новые значения заменят старые. Если же при обновлении не передавать ничего, связанного с контактами или компанией, текущие значения останутся неизменными.

Так же множественные контакты можно редактировать напрямую через соответствующий таблет-посредник (DealContactTable ), но делать так не рекомендуется, так как не отработает запись изменений в историю, обновление последних выбранных контактов и др.



© «Битрикс», 2001-2024, «1С-Битрикс», 2024