Есть как минимум 2 варианта (без прямых запросов в базу) как это сделать:
1) Высокоуровневый (работает всегда). Метод с поддержкой обратной совместимости: CCrmContact::GetList (
bxapi.ru/src/?id=183244)
Применение (за основу взял код описанный
Артем):
/* @var array Список контактов */
$arContacts = array();
if ( \Bitrix\Main\Loader::IncludeModule('crm') )
{
/* @var array Сортировка полученного списка контактов */
$arOrder = array('ID' => 'DESC');
/* @var array Условия получаемого списка контактов */
$arFilter = array(
"NAME" => "Имя",
"LAST_NAME" => "Фамилия",
'CHECK_PERMISSIONS' => 'N' // Данный ключ необходим для того чтобы получить всех пользоватей,
// иначе, будет найден только если ответственным за него является тот,
// под кем запускается скрипт в битриксе
);
/* @var array Получаемые поля для списка контактов */
$arSelect = array(
'ID'
);
// NOTE: Запрашивайте только необходимые поля
$res = CCrmContact::GetList( $arOrder, $arFilter, $arSelect );
while( $arContact = $res->fetch() )
{
$arContacts[ $arContact['ID'] ] = $arContact['ID'];
}
}
// Тут в $arContacts либо пустой массив, либо массив с ID контактами, которые соответствуют условию поиска
2) Низкоуровневый DataMapper (новый подход d7)
use \Bitrix\Main\Loader;
use \Bitrix\Crm;
/* @var array Список контактов */
$arContacts = array();
if ( Loader::IncludeModule('crm') )
{
$resContacts = Crm\ContactTable::getList(array(
'select' => array('ID'),
'filter' => array(
"NAME" => "Имя",
"LAST_NAME" => "Фамилия",
),
'order' => array('ID' => 'DESC')
));
while( $arContact = $resContacts->fetch() )
{
$arContacts[ $arContact['ID'] ] = $arContact['ID'];
}
/*
Начиная с 17 версии (вроде бы), можно делать так:
foreach( $resContacts as $arContact)
{
$arContacts[ $arContact['ID'] ] = $arContact['ID'];
}
вместо while цикла
*/
}
Преимущество первого подхода:
- Работает всегда, как для новых, так и для старых проектов
- Можно использовать уровни доступа
Преимущество нового подхода:
- Технологически универсален за счет d7 (можно в runtime прибавлять связи, доставать связанные сущности и т.п.)
- В DataMapper есть технология кеширования, т.е. можно закешировать результат просто добавив в массив getList еще один ключик
- Субъективно код легче воспринимается