В этом разделе мы постарались собрать полезные примеры по работе с сущностью.
Table of Contents
Поиск по основным параметрам
Найти компании, в названии которых есть буква “А”
\Bitrix\Main\Loader::requireModule('crm');
$entityResult = \CCrmCompany::GetListEx(
[],
[
'%TITLE' => 'А',
'CHECK_PERMISSIONS' => 'N'
],
false,
false,
[
'ID',
'TITLE'
]
);
while( $entity = $entityResult->fetch() )
{
/**
* [ 'ID' => ..., 'TITLE' => ... ]
* @var array
*/
var_dump($entity);
var_dump($entity['ID']);
}
Найти все компании у которых есть телефон
Архитектурно множественные поля, такие как телефон, email или мессенджеры хранятся в отдельной таблице и чтобы не выполнять лишних запросов при операциях над такими компаниями созданы поля-прослойки, которые отмечают факт наличия определенных связей.
HAS_PHONE
(Y/N
) - Y
в случае наличия хотя бы одного телефона
HAS_EMAIL
(Y/N
) - Y
в случае наличия хотя бы одной почты
HAS_IMOL
(Y/N
) - Y
в случае наличия хотя бы одного мессенджера
\Bitrix\Main\Loader::requireModule('crm');
$entityResult = \CCrmCompany::GetListEx(
[],
[
'HAS_PHONE' => 'Y',
'CHECK_PERMISSIONS' => 'N'
],
false,
false,
[
'ID',
'FULL_NAME'
]
);
while( $entity = $entityResult->fetch() )
{
/**
* [ 'ID' => ..., 'TITLE' => ... ]
* @var array
*/
var_dump($entity);
var_dump($entity['ID']);
}
Множественные поля
Мы уже описали что Битрикс24 хранит множественные поля отдельно и часто возникает вопрос как работать с такими полями. Наиболее удобным способом является работа от API множественных полей.
Получение всех телефонов компании
Задача: найти все телефонные номера компании с ID:1
\Bitrix\Main\Loader::requireModule('crm');
$resFieldMulti = \CCrmFieldMulti::GetListEx(
[],
[
'ENTITY_ID' => \CCrmOwnerType::CompanyName,
'ELEMENT_ID' => 1,
'TYPE_ID' => \CCrmFieldMulti::PHONE
]
);
while( $multifield = $resFieldMulti->fetch() )
{
/**
* $multifield = [
* "ID" => string(1) "6",
* "ENTITY_ID" => string(7) "COMPANY",
* "ELEMENT_ID" => string(1) "1",
* "TYPE_ID" => string(5) "PHONE",
* "VALUE_TYPE" => string(4) "WORK",
* "COMPLEX_ID" => string(10) "PHONE_WORK"
* "VALUE" => string(9) "213 11 64"
* ];
*/
}
Найти компанию по номеру телефона
Метод CCrmFieldMulti::GetListEx
выглядит удобным для поиска компании по телефонному номеру, однако это ошибочное мнение. Дело в том что таблица хранит в себе заданные пользователем значения as is
(как есть), т.е. один телефонный номер может быть записан в нескольких вариантах, например:
- 88002000600
- +7 800 2000 600
- 8 (800) 200-60-00
С точки зрения человека это один и тот же номер, но с точки зрения системы это совершенно разные строки.
Для данного метода поиск требует чтобы данные были проиндексированы менеджером дубликатов. В случае если поиск не производился или он устарел, данные будут некорректны.
Наиболее удобным является поиск по номеру телефона в системе дубликатов.
Найдем все компании, которые имеют номер 2131164
:
\Bitrix\Main\Loader::requireModule('crm');
/**
* Телефон который будем искать
* @var string
*/
$phone = '2131164';
/**
* Список всех ID элементов с этим телефонным номером
* @var int[]
*/
$entityIds = [];
$adapter = \Bitrix\Crm\EntityAdapterFactory::create([
'FM' => [
'PHONE' => [
['VALUE' => $phone]
]
]
],
\CCrmOwnerType::Company
);
$dups = (new \Bitrix\Crm\Integrity\entityDuplicateChecker())
->findDuplicates(
$adapter,
new \Bitrix\Crm\Integrity\DuplicateSearchParams([
'FM.PHONE'
])
);
foreach($dups as &$dup)
{
if(!($dup instanceof \Bitrix\Crm\Integrity\Duplicate))
{
continue;
}
$entities = $dup->getEntities();
if(!(is_array($entities) && !empty($entities)))
{
continue;
}
//Each entity type limited by 50 items
foreach($entities as &$entity)
{
if(!($entity instanceof \Bitrix\Crm\Integrity\DuplicateEntity))
{
continue;
}
if ( $entity->getEntityTypeID() != \CCrmOwnerType::Company)
{
continue;
}
$entityIds[] = $entity->getEntityID();
}
}
Телефонный номер в таблице дубликатов хранится в виде строки состоящей из чисел, поэтому предавая ее на поиск в менеджере дубликатов предварительно нужно очистить ненужные символы.