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 | После удаления банковских реквизитов. |