Описание

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

Компании связаны с контактами, сделками и другими элементами CRM, что делает их центральным элементом для анализа и автоматизации бизнес-логики.

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

Пример 1: Базовое получение всех компаний

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

  • Установлен лимит: не больше 500 компаний (лимит можно изменить в строке 21-23)
  use Bitrix\Crm\CompanyTable;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// Получение всех компаний без фильтров

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // ПОЛУЧЕНИЕ ДАННЫХ: Выборка всех компаний с лимитом
    $companies = CompanyTable::getList([
        'select' => ['ID', 'TITLE'],
        'limit' => 500, // Лимит записей за один запрос (критично для производительности)
        'cache' => ['ttl' => 3600]
    ])->fetchAll();
    
    if (empty($companies)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("CompanyIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        return;
    }
    
    $companyIDs = array();
    foreach ($companies as $company) {
        $companyIDs[] = $company['ID'];
    }
    
    // Проверка лимита
    if (count($companies) >= 500) {
        $this->WriteToTrackingService("[WARNING] Достигнут лимит выборки 500 записей, возможны необработанные компании");
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Массив ID компаний и статус выполнения
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("CompanyIDs", $companyIDs);
    $rootActivity->SetVariable("FoundCount", count($companyIDs));
    $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());
}
  

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

Данный пример не требует входных параметров - получает все компании из CRM.

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

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

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

СтатусПричинаРешение
DB_ERRORОшибка при работе с базой данныхПроверить логи, доступность БД
NOT_FOUNDКомпании не найденыПроверить наличие компаний в CRM

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

  • Убедитесь, что модуль crm подключен с помощью Loader::includeModule('crm')
  • Для больших объемов данных (>500 компаний) используйте пагинацию
  • Используйте кеширование для повышения производительности
  • Всегда проверяйте переменную Status в следующих шагах БП

Пример 2: Получение компаний с фильтрацией по полю

Этот пример демонстрирует, как получить компании с фильтром по определенному полю.

  • Установлен лимит: не больше 500 компаний (лимит можно изменить в строке 30-33)
  use Bitrix\Crm\CompanyTable;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// ВХОДНЫЕ ПАРАМЕТРЫ: Код поля и значение для фильтрации
$fieldCode = "{{FieldCode}}"; // Например: TITLE, ASSIGNED_BY_ID
$fieldValue = "{{FieldValue}}";

// Валидация входных данных
if (empty($fieldCode) || empty($fieldValue)) {
    $this->WriteToTrackingService("[ERROR] Не переданы обязательные параметры FieldCode или FieldValue");
    $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;
    }
    
    // ФИЛЬТРАЦИЯ: Выборка компаний по указанному полю
    $companies = CompanyTable::getList([
        'filter' => [$fieldCode => $fieldValue],
        'select' => ['ID', 'TITLE'],
        'limit' => 500, // Лимит записей за один запрос
        'cache' => ['ttl' => 3600]
    ])->fetchAll();
    
    if (empty($companies)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("CompanyIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        return;
    }
    
    $companyIDs = array();
    foreach ($companies as $company) {
        $companyIDs[] = $company['ID'];
    }
    
    if (count($companies) >= 500) {
        $this->WriteToTrackingService("[WARNING] Достигнут лимит выборки, возможны необработанные записи");
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Массив ID найденных компаний и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("CompanyIDs", $companyIDs);
    $rootActivity->SetVariable("FoundCount", count($companyIDs));
    $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());
}
  

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

ПараметрТипОписаниеОбязательный
FieldCodestringКод поля для фильтрации (например: TITLE, ASSIGNED_BY_ID). Как узнать?Да
FieldValuemixedЗначение для фильтрацииДа

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

ПеременнаяТипОписание
CompanyIDsarrayМассив ID найденных компаний
FoundCountintКоличество найденных компаний
StatusstringСтатус выполнения операции
ErrorMessagestringОписание ошибки

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

СтатусПричинаРешение
INPUT_ERRORНе переданы обязательные параметры (FieldCode или FieldValue)Передать оба параметра
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
NOT_FOUNDКомпании по заданному фильтру не найденыПроверить корректность поля и значения
DB_ERRORОшибка при выполнении запроса к БДПроверить логи системы

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

  • Коды полей можно узнать через инспектор браузера (F12) в карточке компании
  • Стандартные поля: TITLE (название), ASSIGNED_BY_ID (ответственный), TYPE_ID (тип компании)
  • Для пользовательских полей используйте формат UF_CRM_*
  • Используйте параметр select для выборки только необходимых полей - это ускоряет выполнение

Пример 3: Production-ready поиск компаний по телефону и email

Продвинутый пример для поиска компаний по телефонам и email с детальной обработкой результатов.

  • Установлен лимит: не больше 500 компаний (лимит можно изменить в строке 40-43)
  use Bitrix\Crm\CompanyTable;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// ВХОДНЫЕ ПАРАМЕТРЫ: Телефоны и email для поиска
$phoneString = "{{Phone}}";
$emailString = "{{Email}}";

// Валидация: Проверка наличия хотя бы одного критерия
if (empty($phoneString) && empty($emailString)) {
    $this->WriteToTrackingService("[ERROR] Не переданы параметры для поиска (Phone или Email)");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Необходим хотя бы один параметр для фильтрации");
    return;
}

// ОБРАБОТКА ВХОДНЫХ ДАННЫХ: Разбор строк телефонов и email
$phoneNumbers = !empty($phoneString) ? array_filter(array_map('trim', explode(",", $phoneString))) : array();
$emailAddresses = !empty($emailString) ? array_filter(array_map('trim', explode(",", $emailString))) : array();

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // СЛОЖНАЯ ЛОГИКА: Формирование фильтра OR (телефон ИЛИ email)
    $arFilter = array('LOGIC' => 'OR');
    
    if (!empty($phoneNumbers)) {
        $arFilter[] = array('PHONE' => $phoneNumbers);
    }
    if (!empty($emailAddresses)) {
        $arFilter[] = array('EMAIL' => $emailAddresses);
    }
    
    // ПОЛУЧЕНИЕ ДАННЫХ: Выборка компаний по телефонам и email
    $companies = CompanyTable::getList([
        'filter' => $arFilter,
        'select' => ['ID'], // Выбираем только ID для оптимизации запроса
        'order' => ['ID' => 'DESC'],
        'limit' => 500, // Лимит записей за один запрос
        'cache' => ['ttl' => 3600]
    ])->fetchAll();
    
    if (empty($companies)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("CompanyIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        $this->WriteToTrackingService("[INFO] Компании по заданным критериям не найдены");
        return;
    }
    
    // ОБРАБОТКА РЕЗУЛЬТАТОВ: Формирование выходных данных
    $companyIDs = array();
    
    foreach ($companies as $company) {
        $companyIDs[] = $company['ID'];
    }
    
    // Проверка лимита выборки
    if (count($companies) >= 500) {
        $this->WriteToTrackingService("[WARNING] Достигнут лимит выборки 500 записей. Найдено компаний: " . count($companies));
        $this->WriteToTrackingService("[WARNING] Возможны необработанные компании, соответствующие критериям поиска");
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Результаты поиска
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("CompanyIDs", $companyIDs);
    $rootActivity->SetVariable("FoundCount", count($companyIDs));
    $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());
    $rootActivity->SetVariable("CompanyIDs", array());
    $rootActivity->SetVariable("FoundCount", 0);
}
  

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

ПараметрТипОписаниеОбязательный
PhonestringТелефоны через запятую (например: “+79001234567, +79007654321”). Как работает?Да*
EmailstringEmail адреса через запятую. Как работает?Да*

*Примечание: Хотя бы один параметр (Phone или Email) должен быть передан

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

ПеременнаяТипОписание
CompanyIDsarrayМассив ID найденных компаний
FoundCountintКоличество найденных компаний
StatusstringСтатус выполнения операции
ErrorMessagestringОписание ошибки (если есть)

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

СтатусПричинаРешение
INPUT_ERRORНе переданы параметры Phone и EmailПередать хотя бы один параметр
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
NOT_FOUNDКомпании с указанными контактами не найденыПроверить корректность телефонов/email
DB_ERRORОшибка при работе с базой данныхПроверить логи, доступность БД

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

  • Телефоны можно передавать в любом формате, Битрикс24 выполнит нормализацию автоматически
  • Для множественного поиска разделяйте значения запятой
  • Фильтр работает по принципу OR - находит компании с любым из указанных контактов
  • Учитывайте, что одна компания может иметь несколько телефонов и email
  • Всегда проверяйте FoundCount перед обработкой результатов

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

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

  • Гибкой фильтрацией по телефонам и email (OR логика)
  • Обработкой множественных значений через запятую
  • Оптимизированным запросом (select только ID)
  • Детальным логированием всех этапов выполнения
  • Информативными сообщениями при достижении лимита выборки

Этот код можно использовать как основу для поиска компаний по контактным данным в бизнес-процессах.


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

  • Валидация: Всегда проверяйте входные параметры перед использованием, чтобы избежать некорректных запросов к БД
  • Статусы: Проверяйте переменную Status в следующих шагах БП для обработки различных сценариев выполнения
  • Лимиты: Для больших объемов данных (>500 компаний) используйте пагинацию с параметрами limit и offset
  • Производительность: Используйте кеширование (cache => ['ttl' => 3600]) для часто запрашиваемых данных
  • Фильтрация: CompanyTable поддерживает поиск по мультиполям (PHONE, EMAIL) - один запрос может найти компании по нескольким значениям
  • Безопасность: Всегда приводите числовые ID к типу int перед использованием в фильтрах

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