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

CRM

Связи между сущностями

Рабочая справка по связям CRM-сущностей в коробочном Bitrix24: сделки, контакты, компании, смарт-процессы и привязки дел.

Связи CRM не всегда лежат в одном поле карточки. Часть связей хранится в полях вроде COMPANY_ID, часть — в отдельных таблицах связей, а у смарт-процессов часто используются поля вида PARENT_ID_*.

Основные связи

Самые частые связи: сделка с компанией, сделка с контактами, контакт с компаниями.

Сделка — компания

Основная компания сделки хранится в поле COMPANY_ID.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Service;

const CRM_DEAL_TYPE_ID = \CCrmOwnerType::Deal;

Loader::includeModule('crm');

/**
 * Получает ID компании сделки.
 */
function fetchDealCompanyId(int $deal_id): int
{
    $factory = Service\Container::getInstance()->getFactory(CRM_DEAL_TYPE_ID);

    if ($factory === null) {
        return 0;
    }

    $deal_item = $factory->getItem($deal_id);

    if ($deal_item === null) {
        return 0;
    }

    return (int) $deal_item->get('COMPANY_ID');
}

$company_id = fetchDealCompanyId($deal_id);

echo $company_id;

Сделка — контакты

У сделки может быть несколько контактов. Для связи сделки с контактами используется DealContactTable.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Binding\DealContactTable;

Loader::includeModule('crm');

/**
 * Получает ID контактов сделки.
 */
function fetchDealContactIds(int $deal_id): array
{
    return DealContactTable::getDealContactIDs($deal_id);
}

/**
 * Привязывает контакты к сделке.
 */
function bindDealContacts(int $deal_id, array $contact_ids): void
{
    DealContactTable::bindContactIDs($deal_id, $contact_ids);
}

$contact_ids = fetchDealContactIds($deal_id);

print_r($contact_ids);

Поле CONTACT_ID может быть удобно для основного контакта, но для всех контактов сделки лучше использовать таблицу связи.

Контакт — компании

Контакт может быть связан с несколькими компаниями. Для этого используется ContactCompanyTable.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Binding\ContactCompanyTable;

Loader::includeModule('crm');

/**
 * Получает ID компаний контакта.
 */
function fetchContactCompanyIds(int $contact_id): array
{
    return ContactCompanyTable::getContactCompanyIDs($contact_id);
}

/**
 * Привязывает контакт к компаниям.
 */
function bindContactCompanies(int $contact_id, array $company_ids): void
{
    ContactCompanyTable::bindCompanyIDs($contact_id, $company_ids);
}

$company_ids = fetchContactCompanyIds($contact_id);

print_r($company_ids);

Связи смарт-процессов

У смарт-процессов связи с CRM-сущностями часто представлены как поля.

PARENT_ID_*

В смарт-процессах часто встречаются поля вида PARENT_ID_2, где число — entityTypeId родительской CRM-сущности. Например, 2 — сделка.

/**
 * Получает код поля родительской связи.
 */
function buildParentFieldId(int $parent_entity_type_id): string
{
    return 'PARENT_ID_' . $parent_entity_type_id;
}

$deal_parent_field_id = buildParentFieldId(\CCrmOwnerType::Deal);

echo $deal_parent_field_id;

Получить поля связи

Самый безопасный способ — вывести описание полей через фабрику и посмотреть реальные коды связей на своём портале.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Service;

const SMART_PROCESS_ENTITY_TYPE_ID = 1044;

Loader::includeModule('crm');

/**
 * Получает поля смарт-процесса.
 */
function fetchSmartProcessFields(int $entity_type_id): array
{
    $factory = Service\Container::getInstance()->getFactory($entity_type_id);

    if ($factory === null) {
        return [];
    }

    return $factory->getFieldsInfo();
}

$fields = fetchSmartProcessFields(SMART_PROCESS_ENTITY_TYPE_ID);

print_r($fields);

Связи дел и таймлайна

Дела CRM могут быть привязаны к нескольким сущностям.

Привязки дел

У дел есть отдельные привязки к CRM-сущностям. Это не то же самое, что связь сделки с контактами.

<?php

use Bitrix\Main\Loader;

Loader::includeModule('crm');

/**
 * Получает привязки дела CRM.
 */
function fetchActivityBindings(int $activity_id): array
{
    $bindings = [];

    $binding_result = \CCrmActivity::GetBindings($activity_id);

    foreach ($binding_result as $binding) {
        $bindings[] = $binding;
    }

    return $bindings;
}

$activity_bindings = fetchActivityBindings($activity_id);

print_r($activity_bindings);

Источники