В этом разделе мы постарались собрать полезные примеры по работе с сущностью.

Поиск по основным параметрам

Найти компании, в названии которых есть буква “А”

\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();
    }
}

Телефонный номер в таблице дубликатов хранится в виде строки состоящей из чисел, поэтому предавая ее на поиск в менеджере дубликатов предварительно нужно очистить ненужные символы.