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

CRM

Реквизиты

Работа с реквизитами CRM в коробочном Bitrix24: получение, добавление, изменение, удаление и автозаполнение по ИНН.

Главная особенность: реквизиты не являются обычными полями компании или контакта. Это отдельная CRM-сущность, которая привязывается к CRM-карточке через ENTITY_ID и ENTITY_TYPE_ID.

Основные операции

Базовая работа с реквизитами: получить список, добавить, изменить или удалить запись.

Получить реквизиты

Так можно получить список реквизитов, связанных с компаниями, у которых заполнены ИНН и КПП. Для компаний используется тип CCrmOwnerType::Company.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityRequisite;

const CRM_COMPANY_TYPE_ID = \CCrmOwnerType::Company;

Loader::includeModule('crm');

/**
 * Получает реквизиты компаний с заполненными ИНН и КПП.
 */
function fetchCompanyRequisitesWithTaxNumbers(): array
{
    $requisites = [];
    $entity_requisite = new EntityRequisite();

    $requisite_result = $entity_requisite->getList([
        'select' => [
            'ID',
            'ENTITY_ID',
            'ENTITY_TYPE_ID',
            'NAME',
            'RQ_COMPANY_FULL_NAME',
            'RQ_INN',
            'RQ_KPP',
        ],
        'filter' => [
            '=ENTITY_TYPE_ID' => CRM_COMPANY_TYPE_ID,
            '!RQ_INN' => '',
            '!RQ_KPP' => '',
        ],
        'order' => [
            'RQ_INN' => 'ASC',
        ],
    ]);

    while ($requisite = $requisite_result->fetch()) {
        $requisites[] = $requisite;
    }

    return $requisites;
}

$requisites = fetchCompanyRequisitesWithTaxNumbers();

print_r($requisites);

Этот вариант удобен для проверки дублей, сверки ИНН/КПП или выгрузки реквизитов по компаниям.

Добавить реквизиты

При добавлении важно передать владельца реквизитов: ENTITY_ID и ENTITY_TYPE_ID. Также нужен PRESET_ID — шаблон реквизитов.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityRequisite;

const CRM_COMPANY_TYPE_ID = \CCrmOwnerType::Company;
const REQUISITE_PRESET_ID = 2;
const REQUISITE_SORT = 500;

Loader::includeModule('crm');

/**
 * Подготавливает поля реквизитов компании.
 */
function buildCompanyRequisiteFields(int $company_id, string $title, string $inn): array
{
    return [
        'ENTITY_ID' => $company_id,
        'ENTITY_TYPE_ID' => CRM_COMPANY_TYPE_ID,
        'PRESET_ID' => REQUISITE_PRESET_ID,
        'NAME' => $title,
        'SORT' => REQUISITE_SORT,
        'ACTIVE' => 'Y',
        'RQ_COMPANY_FULL_NAME' => $title,
        'RQ_INN' => $inn,
    ];
}

/**
 * Добавляет реквизиты компании.
 */
function addCompanyRequisite(array $requisite_fields): int
{
    $entity_requisite = new EntityRequisite();

    return (int) $entity_requisite->add($requisite_fields);
}

$requisite_fields = buildCompanyRequisiteFields($company_id, $title, $inn);
$requisite_id = addCompanyRequisite($requisite_fields);

if ($requisite_id > 0) {
    // Реквизиты добавлены
} else {
    // Реквизиты не добавлены
}

В примере указан минимальный набор полей для компании. Поля вроде RQ_KPP, RQ_OGRN, RQ_DIRECTOR и адреса можно добавить позже, если они нужны в конкретном сценарии.

Изменить реквизиты

Для изменения используется ID самих реквизитов, а не ID компании. Это частая ошибка: $company_id и $requisite_id — разные значения.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityRequisite;

Loader::includeModule('crm');

/**
 * Изменяет ИНН и КПП в реквизитах.
 */
function updateRequisiteTaxNumbers(int $requisite_id, string $inn, string $kpp): bool
{
    $entity_requisite = new EntityRequisite();

    $is_updated = $entity_requisite->update(
        $requisite_id,
        [
            'RQ_INN' => $inn,
            'RQ_KPP' => $kpp,
        ]
    );

    return (bool) $is_updated;
}

$is_updated = updateRequisiteTaxNumbers($requisite_id, $inn, $kpp);

if ($is_updated) {
    // Реквизиты обновлены
} else {
    // Реквизиты не обновлены
}

Удалить реквизиты

Удаление реквизитов стоит делать осторожно. Реквизиты могут использоваться в документах, счетах, печатных формах и других связанных сценариях.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityRequisite;

Loader::includeModule('crm');

/**
 * Удаляет реквизиты по ID.
 */
function deleteRequisite(int $requisite_id): bool
{
    $entity_requisite = new EntityRequisite();

    $is_deleted = $entity_requisite->delete($requisite_id);

    return (bool) $is_deleted;
}

$is_deleted = deleteRequisite($requisite_id);

if ($is_deleted) {
    // Реквизиты удалены
} else {
    // Реквизиты не удалены
}

Автозаполнение

Для российских организаций можно попробовать получить данные по ИНН через модуль socialservices.

Получить данные по ИНН

Метод getByInn() возвращает данные организации по ИНН. Доступность и полнота ответа зависят от сервиса, лицензии и конкретных данных.

<?php

use Bitrix\Main\Loader;
use Bitrix\Socialservices\Properties\Client;

Loader::includeModule('socialservices');

/**
 * Получает данные организации по ИНН.
 */
function fetchCompanyDataByInn(string $inn): array
{
    $client = new Client();
    $company_data = $client->getByInn($inn);

    return is_array($company_data) ? $company_data : [];
}

$company_data = fetchCompanyDataByInn($inn);

print_r($company_data);

Перед использованием лучше один раз вывести результат через print_r и посмотреть фактическую структуру ответа на своём портале.

Создать реквизиты по ИНН

Ниже пример заготовки: получаем данные по ИНН, берём название организации и создаём реквизиты для компании. Структуру ответа нужно проверить на своём портале, поэтому часть полей оставлена через безопасные fallback-значения.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityRequisite;
use Bitrix\Socialservices\Properties\Client;

const CRM_COMPANY_TYPE_ID = \CCrmOwnerType::Company;
const REQUISITE_PRESET_ID = 2;
const REQUISITE_SORT = 500;

Loader::includeModule('crm');
Loader::includeModule('socialservices');

/**
 * Получает данные организации по ИНН.
 */
function fetchCompanyDataByInn(string $inn): array
{
    $client = new Client();
    $company_data = $client->getByInn($inn);

    return is_array($company_data) ? $company_data : [];
}

/**
 * Получает название организации из данных сервиса.
 */
function fetchCompanyTitleFromData(array $company_data, string $default_title): string
{
    if (!empty($company_data['NAME'])) {
        return (string) $company_data['NAME'];
    }

    if (!empty($company_data['TITLE'])) {
        return (string) $company_data['TITLE'];
    }

    return $default_title;
}

/**
 * Подготавливает поля реквизитов компании.
 */
function buildCompanyRequisiteFields(int $company_id, string $title, string $inn): array
{
    return [
        'ENTITY_ID' => $company_id,
        'ENTITY_TYPE_ID' => CRM_COMPANY_TYPE_ID,
        'PRESET_ID' => REQUISITE_PRESET_ID,
        'NAME' => $title,
        'SORT' => REQUISITE_SORT,
        'ACTIVE' => 'Y',
        'RQ_COMPANY_FULL_NAME' => $title,
        'RQ_INN' => $inn,
    ];
}

/**
 * Добавляет реквизиты компании.
 */
function addCompanyRequisite(array $requisite_fields): int
{
    $entity_requisite = new EntityRequisite();

    return (int) $entity_requisite->add($requisite_fields);
}

$company_data = fetchCompanyDataByInn($inn);
$title = fetchCompanyTitleFromData($company_data, $fallback_title);
$requisite_fields = buildCompanyRequisiteFields($company_id, $title, $inn);

$requisite_id = addCompanyRequisite($requisite_fields);

Этот пример лучше считать основой. После проверки реального ответа можно добавить заполнение RQ_KPP, RQ_OGRN, полного названия, руководителя и других полей.

Связь с CRM

Реквизиты живут отдельно, но всегда должны быть привязаны к CRM-сущности.

ENTITY_ID и ENTITY_TYPE_ID

Через эти поля реквизиты связываются с карточкой CRM. Например, для компании ENTITY_ID — это ID компании, а ENTITY_TYPE_ID — тип компании.

Поле Что означает Пример
ENTITY_ID ID CRM-карточки, к которой относятся реквизиты. ID компании или контакта.
ENTITY_TYPE_ID Тип CRM-сущности. CCrmOwnerType::Company
ID ID самих реквизитов. Используется для update/delete.

Главное не путать ID компании и ID реквизитов. Получение по компании идёт через ENTITY_ID, а изменение и удаление — по ID реквизитов.

PRESET_ID и поля реквизитов

PRESET_ID указывает шаблон реквизитов. Набор полей зависит от шаблона и страны. Поэтому перед массовым заполнением лучше проверить, какие поля используются на конкретном портале.

Поле Назначение
NAME Название записи реквизитов.
RQ_COMPANY_FULL_NAME Полное название компании.
RQ_INN ИНН.
RQ_KPP КПП.
RQ_OGRN ОГРН.
SORT Сортировка, если у карточки несколько наборов реквизитов.
ACTIVE Флаг активности. В REST-документации указано, что сейчас поле фактически ни на что не влияет.

События

В REST есть события, связанные с реквизитами, адресами, банковскими реквизитами и пользовательскими полями реквизитов.

Список событий

Для коробочного PHP-кода чаще используются прямые методы класса, но для приложений и интеграций полезно знать REST-события.

Событие Когда вызывается
onCrmRequisiteAdd После добавления реквизитов.
onCrmRequisiteUpdate После изменения реквизитов.
onCrmRequisiteDelete После удаления реквизитов.
onCrmAddressRegister После регистрации адреса.
onCrmAddressUnregister После удаления адреса.
onCrmBankDetailAdd После добавления банковских реквизитов.
onCrmBankDetailUpdate После изменения банковских реквизитов.
onCrmBankDetailDelete После удаления банковских реквизитов.

Источники