Задать вопрос
@elov4anin
Frontend developer

Битрикс CRM Получить ID контакта?

Какой есть метод в коробочной версии Битрикс 24 получить ID контакта или как отфильтровать из общего списка контактов, если известно его ФИО в системе:
Вот что какие данные известны скрипту
["CONTACT_NAME"]=>
string(12) "Имя"
["CONTACT_SECOND_NAME"]=>
string(20) "Отчество"
["CONTACT_LAST_NAME"]=>
string(16) "Фамилия"
["CONTACT_FULL_NAME"]=>
string(29) "Полное имя"
["CONTACT_POST"]=>
string(0) ""
["CONTACT_ADDRESS"]=>
string(78) "Адрес"
  • Вопрос задан
  • 5421 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 2
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Есть как минимум 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 еще один ключик
- Субъективно код легче воспринимается
Ответ написан
artemky
@artemky
Пример запроса:
if(!CModule::IncludeModule('crm')) die('error');

$res = CCrmContact::GetList($arOrder = array('DATE_CREATE' => 'DESC'), $arFilter = array("NAME"=>"Имя", "LAST_NAME"=>"Фамилия"), $arSelect = array(), $nPageTop = false);
while($ob = $res->GetNext()){
	$arContacts = $ob;
}

- фильтр контактов по имени и фамилии.
Метод: bxapi.ru/src/?module_id=crm&name=CCrmContact%3A%3A...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы