Клиент в 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 ), но делать так не рекомендуется, так как не отработает запись изменений в историю, обновление последних выбранных контактов и др.