← Назад к справке

CRM

Адреса реквизитов

Работа с адресами реквизитов CRM в коробочном Bitrix24: получение, добавление, изменение, удаление и связь с компанией.

Главная особенность: адрес компании обычно не лежит прямо в компании. В актуальной модели CRM адрес хранится у реквизита, а сам реквизит уже связан с компанией или контактом.

Общее понимание

Адреса реквизитов лучше воспринимать как отдельный слой данных: компания → реквизиты → адреса.

Где хранятся адреса

Для работы с адресами в коробочном PHP используется \Bitrix\Crm\EntityAddress. Через него можно получить адреса, сохранить адрес нужного типа или удалить адрес.

Адрес привязывается к родительскому объекту через поля ENTITY_TYPE_ID и ENTITY_ID. Для адресов реквизитов родительский объект — это реквизит, а не компания.

Основные операции

Базовые действия: получить адреса, сохранить адрес нужного типа или удалить его.

Получить адреса компании

Пример получает все реквизиты компании, а затем адреса этих реквизитов. Так можно увидеть юридический, фактический, почтовый и другие адреса, если они заполнены.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityAddress;
use Bitrix\Crm\EntityRequisite;

const CRM_COMPANY_TYPE_ID = \CCrmOwnerType::Company;
const CRM_REQUISITE_TYPE_ID = \CCrmOwnerType::Requisite;

Loader::includeModule('crm');

/**
 * Получает ID реквизитов компании.
 */
function fetchCompanyRequisiteIds(int $company_id): array
{
    $requisite_ids = [];
    $entity_requisite = new EntityRequisite();

    $requisite_result = $entity_requisite->getList([
        'select' => [
            'ID',
        ],
        'filter' => [
            '=ENTITY_TYPE_ID' => CRM_COMPANY_TYPE_ID,
            '=ENTITY_ID' => $company_id,
        ],
        'order' => [
            'SORT' => 'ASC',
            'ID' => 'ASC',
        ],
    ]);

    while ($requisite = $requisite_result->fetch()) {
        $requisite_ids[] = (int) $requisite['ID'];
    }

    return $requisite_ids;
}

/**
 * Получает адреса по ID реквизитов.
 */
function fetchAddressesByRequisiteIds(array $requisite_ids): array
{
    if (empty($requisite_ids)) {
        return [];
    }

    $addresses = [];
    $entity_address = new EntityAddress();

    $address_result = $entity_address->getList([
        'select' => [
            'TYPE_ID',
            'ENTITY_TYPE_ID',
            'ENTITY_ID',
            'ADDRESS_1',
            'ADDRESS_2',
            'CITY',
            'POSTAL_CODE',
            'REGION',
            'PROVINCE',
            'COUNTRY',
            'COUNTRY_CODE',
            'ANCHOR_TYPE_ID',
            'ANCHOR_ID',
        ],
        'filter' => [
            '=ENTITY_TYPE_ID' => CRM_REQUISITE_TYPE_ID,
            '@ENTITY_ID' => $requisite_ids,
        ],
        'order' => [
            'ENTITY_ID' => 'ASC',
            'TYPE_ID' => 'ASC',
        ],
    ]);

    while ($address = $address_result->fetch()) {
        $addresses[] = $address;
    }

    return $addresses;
}

$requisite_ids = fetchCompanyRequisiteIds($company_id);
$addresses = fetchAddressesByRequisiteIds($requisite_ids);

print_r($addresses);

Если нужно получить адреса одного конкретного реквизита, можно сразу фильтровать по ENTITY_TYPE_ID = CCrmOwnerType::Requisite и ENTITY_ID нужного реквизита.

Добавить или изменить адрес

Для сохранения адреса используется EntityAddress::register(). Если адрес такого типа уже был у реквизита, он будет обновлён. Если не был — будет создан.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityAddress;
use Bitrix\Crm\EntityAddressType;

const CRM_COMPANY_TYPE_ID = \CCrmOwnerType::Company;
const CRM_REQUISITE_TYPE_ID = \CCrmOwnerType::Requisite;

Loader::includeModule('crm');

/**
 * Подготавливает поля адреса реквизита.
 */
function buildRequisiteAddressFields(int $company_id): array
{
    return [
        'ANCHOR_TYPE_ID' => CRM_COMPANY_TYPE_ID,
        'ANCHOR_ID' => $company_id,
        'ADDRESS_1' => 'ул. Ленина, д. 10',
        'ADDRESS_2' => 'офис 15',
        'CITY' => 'Москва',
        'POSTAL_CODE' => '101000',
        'REGION' => '',
        'PROVINCE' => 'Москва',
        'COUNTRY' => 'Россия',
        'COUNTRY_CODE' => 'RU',
    ];
}

/**
 * Сохраняет адрес реквизита.
 */
function saveRequisiteAddress(int $requisite_id, int $address_type_id, array $address_fields): void
{
    if (EntityAddress::isEmpty($address_fields)) {
        return;
    }

    EntityAddress::register(
        CRM_REQUISITE_TYPE_ID,
        $requisite_id,
        $address_type_id,
        $address_fields
    );
}

$address_fields = buildRequisiteAddressFields($company_id);

saveRequisiteAddress(
    $requisite_id,
    EntityAddressType::Registered,
    $address_fields
);

В примере используется тип EntityAddressType::Registered — юридический адрес. Для фактического, почтового или адреса доставки нужно выбрать другой тип.

Удалить адрес

Удаление адреса идёт по комбинации: тип родительской сущности, ID родительской сущности и тип адреса. Для адреса реквизита родительская сущность — реквизит.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\EntityAddress;
use Bitrix\Crm\EntityAddressType;

const CRM_REQUISITE_TYPE_ID = \CCrmOwnerType::Requisite;

Loader::includeModule('crm');

/**
 * Удаляет адрес реквизита нужного типа.
 */
function deleteRequisiteAddress(int $requisite_id, int $address_type_id): void
{
    EntityAddress::unregister(
        CRM_REQUISITE_TYPE_ID,
        $requisite_id,
        $address_type_id
    );
}

deleteRequisiteAddress($requisite_id, EntityAddressType::Registered);

Перед удалением лучше сначала получить адрес и проверить, что удаляется именно нужный тип адреса.

Поля и типы

Самые важные поля адреса и типы, которые чаще всего встречаются в CRM.

Основные поля адреса

Поле Что означает
TYPE_ID Тип адреса: юридический, фактический, почтовый, доставки и т. д.
ENTITY_TYPE_ID Тип родительской сущности. Для адреса реквизита — CCrmOwnerType::Requisite.
ENTITY_ID ID родительской сущности. Для адреса реквизита — ID реквизита.
ADDRESS_1 Улица, дом, корпус, строение.
ADDRESS_2 Квартира, офис, помещение.
CITY Город.
POSTAL_CODE Почтовый индекс.
REGION Район или регион, в зависимости от страны и шаблона.
PROVINCE Область, штат или субъект.
COUNTRY Страна.
COUNTRY_CODE Код страны. В старых сценариях может использоваться для совместимости.
LOC_ADDR_ID ID адреса из модуля местоположений, если адрес связан с location.

Типы адресов

Для типов адресов лучше использовать константы \Bitrix\Crm\EntityAddressType, а не числа напрямую.

Константа Когда использовать
EntityAddressType::Primary Основной адрес.
EntityAddressType::Registered Юридический адрес.
EntityAddressType::Post Почтовый адрес.
EntityAddressType::Delivery Адрес доставки.
EntityAddressType::Work Рабочий адрес.
EntityAddressType::Home Домашний адрес.

ANCHOR_TYPE_ID и ANCHOR_ID

У адреса есть родительская сущность и основной родитель. Для адреса реквизита ENTITY_ID указывает на реквизит, а ANCHOR_ID помогает понять, к какой основной CRM-карточке относится этот адрес.

Поле Для адреса реквизита компании
ENTITY_TYPE_ID CCrmOwnerType::Requisite
ENTITY_ID ID реквизита
ANCHOR_TYPE_ID CCrmOwnerType::Company
ANCHOR_ID ID компании

Источники