Описание

Реквизиты в Битрикс24 — это юридическая и контактная информация компании: название, ИНН, КПП, адреса и банковские данные. Данный раздел содержит примеры PHP-кода для работы с реквизитами компаний. Вы можете использовать эти примеры для автоматического заполнения реквизитов, синхронизации с внешними системами и генерации документов в бизнес-процессах.

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

Примеры использования

Пример 1: Получение реквизитов компании

Этот пример показывает, как получить список реквизитов компании.

  • Установлен лимит: не больше 500 реквизитов (лимит можно изменить в строке 28-31)
  use Bitrix\Crm\EntityRequisite;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// ВХОДНОЙ ПАРАМЕТР: ID компании
$companyId = "{{CompanyID}}";

// Валидация входных данных
if (empty($companyId)) {
    $this->WriteToTrackingService("[ERROR] Не передан ID компании");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Отсутствует обязательный параметр CompanyID");
    return;
}

$companyId = (int)$companyId;

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // ПОЛУЧЕНИЕ ДАННЫХ: Выборка реквизитов компании
    $requisite = new EntityRequisite();
    $requisiteList = $requisite->getList([
        'filter' => [
            'ENTITY_ID' => $companyId,
            'ENTITY_TYPE_ID' => \CCrmOwnerType::Company
        ],
        'select' => ['ID', 'PRESET_ID', 'RQ_COMPANY_NAME']
    ])->fetchAll();
    
    if (empty($requisiteList)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("RequisiteIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        return;
    }
    
    $requisiteIDs = array();
    foreach ($requisiteList as $req) {
        $requisiteIDs[] = $req['ID'];
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Массив ID реквизитов и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("RequisiteIDs", $requisiteIDs);
    $rootActivity->SetVariable("FoundCount", count($requisiteIDs));
    $rootActivity->SetVariable("Status", "SUCCESS");
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка получения реквизитов: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
}
  

Входные параметры:

ПараметрТипОписаниеОбязательный
CompanyIDint/stringID компанииДа

Выходные переменные:

ПеременнаяТипОписание
RequisiteIDsarrayМассив ID реквизитов компании
FoundCountintКоличество найденных реквизитов
StatusstringСтатус выполнения: SUCCESS, NOT_FOUND, INPUT_ERROR, MODULE_ERROR, DB_ERROR
ErrorMessagestringОписание ошибки (заполняется при ошибках)

Возможные ошибки:

СтатусПричинаРешение
INPUT_ERRORНе передан CompanyIDПередать ID компании
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
NOT_FOUNDРеквизиты не найденыПроверить наличие реквизитов у компании
DB_ERRORОшибка при работе с базой данныхПроверить логи системы

Рекомендации по использованию:

  • Всегда проверяйте переменную Status в следующих шагах БП
  • У одной компании может быть несколько реквизитов разных типов
  • PRESET_ID определяет тип реквизита (1-Организация, 3-ИП, 5-Физлицо)
  • Для получения полной информации добавьте в select нужные поля (RQ_INN, RQ_KPP и т.д.)

Пример 2: Добавление или обновление реквизитов компании

Этот пример демонстрирует добавление новых реквизитов или обновление существующих.

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

Loader::includeModule('crm');

// ВХОДНЫЕ ПАРАМЕТРЫ: ID компании и данные реквизитов
$companyId = "{{CompanyID}}";
$companyName = "{{CompanyName}}";
$presetId = "{{PresetID}}"; // 1-Организация, 3-ИП, 5-Физлицо
$inn = "{{INN}}";

// Валидация входных данных
if (empty($companyId) || empty($companyName) || empty($presetId)) {
    $this->WriteToTrackingService("[ERROR] Не переданы обязательные параметры");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Отсутствуют обязательные параметры: CompanyID, CompanyName или PresetID");
    return;
}

$companyId = (int)$companyId;
$presetId = (int)$presetId;

// Дополнительная валидация PresetID
if (!in_array($presetId, [1, 3, 5])) {
    $this->WriteToTrackingService("[ERROR] Некорректный PresetID. Допустимы: 1, 3, 5");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Некорректный тип реквизита");
    return;
}

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    $requisite = new EntityRequisite();
    
    // СЛОЖНАЯ ЛОГИКА: Проверка существующих реквизитов
    $existingRequisites = $requisite->getList([
        'filter' => [
            'ENTITY_ID' => $companyId,
            'ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
            'PRESET_ID' => $presetId
        ],
        'select' => ['ID']
    ])->fetchAll();
    
    // Подготовка полей
    $fields = array(
        'ENTITY_ID' => $companyId,
        'ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
        'PRESET_ID' => $presetId,
        'NAME' => $companyName,
        'SORT' => 500,
        'ACTIVE' => 'Y',
        'RQ_COMPANY_NAME' => $companyName,
        'RQ_COMPANY_FULL_NAME' => $companyName
    );
    
    // Добавление ИНН если передан
    if (!empty($inn)) {
        $fields['RQ_INN'] = $inn;
    }
    
    // СОЗДАНИЕ ИЛИ ОБНОВЛЕНИЕ: Логика выбора операции
    if (!empty($existingRequisites)) {
        // Обновление существующего реквизита
        $requisiteId = $existingRequisites[0]['ID'];
        $result = $requisite->update($requisiteId, $fields);
        $operation = "UPDATE";
    } else {
        // Добавление нового реквизита
        $result = $requisite->add($fields);
        $requisiteId = $result->getId();
        $operation = "CREATE";
    }
    
    if (!$result->isSuccess()) {
        $errors = $result->getErrorMessages();
        $this->WriteToTrackingService("[ERROR] Ошибка операции: " . implode(", ", $errors));
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "OPERATION_ERROR");
        $rootActivity->SetVariable("ErrorMessage", implode(", ", $errors));
        return;
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: ID реквизита и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("RequisiteID", $requisiteId);
    $rootActivity->SetVariable("Operation", $operation);
    $rootActivity->SetVariable("Status", "SUCCESS");
    
    $this->WriteToTrackingService("[SUCCESS] Реквизит " . $operation . ". ID: " . $requisiteId);
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка работы с реквизитами: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
}
  

Входные параметры:

ПараметрТипОписаниеОбязательный
CompanyIDint/stringID компанииДа
CompanyNamestringНазвание компанииДа
PresetIDint/stringID шаблона реквизитов (1-Организация, 3-ИП, 5-Физлицо). Как узнать?Да
INNstringИНН компанииНет

Выходные переменные:

ПеременнаяТипОписание
RequisiteIDintID реквизита (созданного или обновленного)
OperationstringТип операции: CREATE (создан) или UPDATE (обновлен)
StatusstringСтатус выполнения операции
ErrorMessagestringОписание ошибки

Возможные ошибки:

СтатусПричинаРешение
INPUT_ERRORНе переданы обязательные параметры или некорректный PresetIDПередать все параметры с корректным PresetID
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
OPERATION_ERRORОшибка при создании/обновлении реквизитаПроверить корректность данных
DB_ERRORОшибка при работе с базой данныхПроверить логи системы

Типы реквизитов (PRESET_ID):

IDТипОписание
1ОрганизацияЮридическое лицо (ООО, ЗАО и т.д.)
3ИПИндивидуальный предприниматель
5ФизлицоФизическое лицо

Рекомендации по использованию:

  • Код автоматически определяет: создавать новый реквизит или обновлять существующий
  • Проверяйте переменную Operation для понимания выполненного действия
  • ИНН является опциональным параметром, но рекомендуется для организаций
  • Используйте константы для PresetID для избежания ошибок

Пример 3: Production-ready работа с реквизитами и адресами

Продвинутый пример создания/обновления реквизитов с добавлением юридического адреса.

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

Loader::includeModule('crm');

// ВХОДНЫЕ ПАРАМЕТРЫ: Полные данные реквизитов и адреса
$companyId = "{{CompanyID}}";
$companyName = "{{CompanyName}}";
$presetId = "{{PresetID}}"; // 1-Организация, 3-ИП, 5-Физлицо
$inn = "{{INN}}";
$kpp = "{{KPP}}";
$addressStreet = "{{AddressStreet}}";
$addressCity = "{{AddressCity}}";
$addressPostalCode = "{{AddressPostalCode}}";
$addressCountry = "{{AddressCountry}}";

// Валидация обязательных параметров
if (empty($companyId) || empty($companyName) || empty($presetId)) {
    $this->WriteToTrackingService("[ERROR] Не переданы обязательные параметры");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Отсутствуют обязательные параметры");
    return;
}

$companyId = (int)$companyId;
$presetId = (int)$presetId;

// Валидация типа реквизита
if (!in_array($presetId, [1, 3, 5])) {
    $this->WriteToTrackingService("[ERROR] Некорректный PresetID");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    return;
}

// Валидация адреса (если хотя бы одно поле адреса передано)
$hasAddress = !empty($addressStreet) || !empty($addressCity) || !empty($addressPostalCode);
if ($hasAddress && empty($addressCountry)) {
    $this->WriteToTrackingService("[WARNING] Адрес передан без страны, используется значение по умолчанию");
    $addressCountry = "Россия";
}

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    $requisite = new EntityRequisite();
    
    // СЛОЖНАЯ ЛОГИКА: Поиск существующих реквизитов
    $existingRequisites = $requisite->getList([
        'filter' => [
            'ENTITY_ID' => $companyId,
            'ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
            'PRESET_ID' => $presetId
        ],
        'select' => ['ID']
    ])->fetchAll();
    
    // ПОДГОТОВКА ДАННЫХ: Формирование полей реквизита
    $fields = array(
        'ENTITY_ID' => $companyId,
        'ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
        'PRESET_ID' => $presetId,
        'NAME' => $companyName,
        'SORT' => 500,
        'ACTIVE' => 'Y',
        'RQ_COMPANY_NAME' => $companyName,
        'RQ_COMPANY_FULL_NAME' => $companyName
    );
    
    // Добавление опциональных полей
    if (!empty($inn)) {
        $fields['RQ_INN'] = $inn;
    }
    if (!empty($kpp) && $presetId == 1) { // КПП только для организаций
        $fields['RQ_KPP'] = $kpp;
    }
    
    // СОЗДАНИЕ/ОБНОВЛЕНИЕ реквизита
    if (!empty($existingRequisites)) {
        $requisiteId = $existingRequisites[0]['ID'];
        $result = $requisite->update($requisiteId, $fields);
        $operation = "UPDATE";
    } else {
        $result = $requisite->add($fields);
        $requisiteId = $result->getId();
        $operation = "CREATE";
    }
    
    if (!$result->isSuccess()) {
        $errors = $result->getErrorMessages();
        $this->WriteToTrackingService("[ERROR] Ошибка операции с реквизитом: " . implode(", ", $errors));
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "OPERATION_ERROR");
        $rootActivity->SetVariable("ErrorMessage", implode(", ", $errors));
        return;
    }
    
    // РАБОТА С АДРЕСОМ: Регистрация юридического адреса если данные переданы
    if ($hasAddress && $requisiteId > 0) {
        $address = new EntityAddress();
        $addressFields = array(
            "ADDRESS_1" => $addressStreet,
            "CITY" => $addressCity,
            "POSTAL_CODE" => $addressPostalCode,
            "COUNTRY" => $addressCountry
        );
        
        // Регистрация адреса: тип 8 (реквизит), тип адреса 6 (юридический)
        $addressResult = $address->register(8, $requisiteId, 6, $addressFields);
        
        if (!$addressResult) {
            $this->WriteToTrackingService("[WARNING] Ошибка добавления адреса к реквизиту");
        }
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Результаты операции
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("RequisiteID", $requisiteId);
    $rootActivity->SetVariable("Operation", $operation);
    $rootActivity->SetVariable("AddressAdded", $hasAddress);
    $rootActivity->SetVariable("Status", "SUCCESS");
    
    $this->WriteToTrackingService("[SUCCESS] Реквизит " . $operation . ". ID: " . $requisiteId . 
                                  ($hasAddress ? " с адресом" : ""));
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка работы с реквизитами: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
}
  

Входные параметры:

ПараметрТипОписаниеОбязательный
CompanyIDint/stringID компанииДа
CompanyNamestringНазвание компанииДа
PresetIDint/stringID шаблона реквизитов (1, 3, 5). Как узнать?Да
INNstringИНН компании. Список полейНет
KPPstringКПП компании (только для организаций). Список полейНет
AddressStreetstringУлица, домНет
AddressCitystringГородНет
AddressPostalCodestringПочтовый индексНет
AddressCountrystringСтранаНет*

*Если передан адрес, страна обязательна (по умолчанию “Россия”)

Выходные переменные:

ПеременнаяТипОписание
RequisiteIDintID реквизита
OperationstringТип операции: CREATE или UPDATE
AddressAddedbooleanБыл ли добавлен адрес
StatusstringСтатус выполнения операции
ErrorMessagestringОписание ошибки (если есть)

Возможные ошибки:

СтатусПричинаРешение
INPUT_ERRORНе переданы обязательные параметры или некорректный PresetIDПроверить все параметры
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
OPERATION_ERRORОшибка при создании/обновлении реквизитаПроверить корректность данных
DB_ERRORОшибка при работе с базой данныхПроверить логи системы

Рекомендации по использованию:

  • КПП применяется только для организаций (PresetID = 1)
  • Адрес регистрируется отдельно после создания/обновления реквизита
  • Параметры адреса опциональны, но если передаются - нужна страна
  • Переменная AddressAdded показывает, был ли обработан адрес
  • Юридический адрес имеет тип 6 в системе Битрикс24

Фича примера кода №3:

Данный пример демонстрирует production-ready подход с:

  • ✅ Полной валидацией всех параметров (обязательные + опциональные)
  • ✅ Умной обработкой адреса (только если данные переданы)
  • ✅ Автоматической установкой значений по умолчанию (страна)
  • ✅ Условным добавлением КПП (только для организаций)
  • ✅ Детальным логированием всех операций
  • ✅ Раздельной обработкой реквизитов и адресов

Этот код можно использовать для автоматической синхронизации реквизитов из внешних систем.

Пример 4: Удаление всех реквизитов компании

Этот пример демонстрирует удаление всех реквизитов компании с предварительной проверкой их наличия.

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

Loader::includeModule('crm');

// ВХОДНОЙ ПАРАМЕТР: ID компании
$companyId = "{{CompanyID}}";

// Валидация входных данных
if (empty($companyId)) {
    $this->WriteToTrackingService("[ERROR] Не передан ID компании");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Отсутствует обязательный параметр CompanyID");
    return;
}

$companyId = (int)$companyId;

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // ПОЛУЧЕНИЕ ДАННЫХ: Поиск всех реквизитов компании
    $requisite = new EntityRequisite();
    $requisiteList = $requisite->getList([
        'filter' => [
            'ENTITY_ID' => $companyId,
            'ENTITY_TYPE_ID' => \CCrmOwnerType::Company
        ],
        'select' => ['ID']
    ])->fetchAll();
    
    // Проверка наличия реквизитов
    if (empty($requisiteList)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("DeletedCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        $this->WriteToTrackingService("[INFO] У компании нет реквизитов для удаления");
        return;
    }
    
    // УДАЛЕНИЕ: Удаление всех найденных реквизитов
    $deletedCount = 0;
    $errors = array();
    
    foreach ($requisiteList as $req) {
        $requisiteId = $req['ID'];
        $deleteResult = $requisite->delete($requisiteId);
        
        if ($deleteResult->isSuccess()) {
            $deletedCount++;
        } else {
            $errors[] = "ID " . $requisiteId . ": " . implode(", ", $deleteResult->getErrorMessages());
        }
    }
    
    // Проверка результатов удаления
    if (!empty($errors)) {
        $this->WriteToTrackingService("[WARNING] Ошибки при удалении некоторых реквизитов: " . implode("; ", $errors));
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Статистика удаления
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("DeletedCount", $deletedCount);
    $rootActivity->SetVariable("TotalFound", count($requisiteList));
    $rootActivity->SetVariable("Status", $deletedCount > 0 ? "SUCCESS" : "DELETE_ERROR");
    
    if (!empty($errors)) {
        $rootActivity->SetVariable("ErrorMessage", implode("; ", $errors));
    }
    
    $this->WriteToTrackingService("[SUCCESS] Удалено реквизитов: " . $deletedCount . " из " . count($requisiteList));
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка при удалении реквизитов: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
    $rootActivity->SetVariable("DeletedCount", 0);
}
  

Входные параметры:

ПараметрТипОписаниеОбязательный
CompanyIDint/stringID компанииДа

Выходные переменные:

ПеременнаяТипОписание
DeletedCountintКоличество успешно удалённых реквизитов
TotalFoundintОбщее количество найденных реквизитов
StatusstringСтатус выполнения операции
ErrorMessagestringОписание ошибок (если были проблемы при удалении)

Возможные ошибки:

СтатусПричинаРешение
INPUT_ERRORНе передан CompanyIDПередать ID компании
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
NOT_FOUNDУ компании нет реквизитовОперация пропускается
DELETE_ERRORВсе реквизиты не удалось удалитьПроверить права доступа и логи
DB_ERRORОшибка при работе с базой данныхПроверить логи системы

Рекомендации по использованию:

  • ⚠️ Операция необратима - используйте с осторожностью
  • Проверяйте переменные DeletedCount и TotalFound для контроля результата
  • При частичном удалении (DeletedCount < TotalFound) проверьте ErrorMessage
  • Удаление реквизитов не удаляет саму компанию
  • Рекомендуется использовать этот код в связке с бэкапом данных
  • Удаление также удаляет связанные адреса

Общие рекомендации по использованию

  • Валидация: Всегда проверяйте обязательные параметры и тип реквизита (PresetID)
  • Статусы: Проверяйте переменную Status в следующих шагах БП
  • Типы реквизитов: Используйте правильный PresetID (1, 3, 5) в зависимости от типа компании
  • КПП: Применяется только для организаций (PresetID = 1)
  • Адреса: Регистрируются отдельно через EntityAddress после создания реквизита
  • Обновление: Код автоматически определяет создание или обновление реквизита
  • Безопасность: Всегда приводите ID к типу int перед использованием

Связанные статьи