PHP: Получение компаний в Битрикс24
Примеры PHP‑кода для выборки компаний в Битрикс24: базовое получение, поиск по телефону и email, множественная фильтрация. Практика и рекомендации для бизнес-процессов.
Описание
Компании в Битрикс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.
Выходные переменные:
| Переменная | Тип | Описание |
|---|---|---|
| CompanyIDs | array | Массив ID всех найденных компаний |
| FoundCount | int | Количество найденных компаний |
| Status | string | Статус выполнения: SUCCESS, NOT_FOUND, DB_ERROR |
| ErrorMessage | string | Описание ошибки (заполняется при ошибках) |
Возможные ошибки:
| Статус | Причина | Решение |
|---|---|---|
| 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());
}
Входные параметры:
| Параметр | Тип | Описание | Обязательный |
|---|---|---|---|
| FieldCode | string | Код поля для фильтрации (например: TITLE, ASSIGNED_BY_ID). Как узнать? | Да |
| FieldValue | mixed | Значение для фильтрации | Да |
Выходные переменные:
| Переменная | Тип | Описание |
|---|---|---|
| CompanyIDs | array | Массив ID найденных компаний |
| FoundCount | int | Количество найденных компаний |
| Status | string | Статус выполнения операции |
| ErrorMessage | string | Описание ошибки |
Возможные ошибки:
| Статус | Причина | Решение |
|---|---|---|
| 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);
}
Входные параметры:
| Параметр | Тип | Описание | Обязательный |
|---|---|---|---|
| Phone | string | Телефоны через запятую (например: “+79001234567, +79007654321”). Как работает? | Да* |
| string | Email адреса через запятую. Как работает? | Да* |
*Примечание: Хотя бы один параметр (Phone или Email) должен быть передан
Выходные переменные:
| Переменная | Тип | Описание |
|---|---|---|
| CompanyIDs | array | Массив ID найденных компаний |
| FoundCount | int | Количество найденных компаний |
| Status | string | Статус выполнения операции |
| ErrorMessage | string | Описание ошибки (если есть) |
Возможные ошибки:
| Статус | Причина | Решение |
|---|---|---|
| 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 перед использованием в фильтрах
Связанные статьи
- Коды полей и идентификаторы - справочник кодов полей
- Работа с активностями компаний - получение и создание дел
- Работа с комментариями компаний - добавление и получение комментариев
- Работа с реквизитами компаний - управление реквизитами
Хотите следить за обновлениями?