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

CRM

Пользовательские поля

Рабочая справка по пользовательским полям CRM в коробочном Bitrix24: UF_CRM_*, UserFieldTable, CUserTypeEntity и фабрики CRM.

Пользовательские поля CRM — это поля вида UF_CRM_*. Их значения лежат в карточках CRM, а описание поля хранится отдельно в системе пользовательских полей.

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

Пользовательское поле состоит из двух частей: описание поля и значение поля в конкретной карточке.

Что такое UF-поля

Если стандартных полей CRM не хватает, добавляют пользовательские поля. В коде они обычно выглядят как UF_CRM_1234567890 или, для смарт-процессов, как UF_CRM_8_1234567890.

Что нужно Где смотреть
Описание поля Bitrix\Main\UserFieldTable или getUserFieldsInfo()
Значение поля В карточке CRM через фабрику, get() или toArray()
Создание/изменение поля CUserTypeEntity

ENTITY_ID пользовательских полей

У пользовательского поля есть ENTITY_ID — код сущности, к которой поле относится.

CRM-сущность ENTITY_ID
Лиды CRM_LEAD
Сделки CRM_DEAL
Контакты CRM_CONTACT
Компании CRM_COMPANY
Смарт-процессы Лучше получать через фабрику: $factory->getUserFieldEntityId()
<?php

use Bitrix\Main\Loader;

Loader::includeModule('crm');

/**
 * Получает ENTITY_ID пользовательских полей CRM-сущности.
 */
function fetchUserFieldEntityId(int $entity_type_id): string
{
    return \CCrmOwnerType::ResolveUserFieldEntityID($entity_type_id);
}

$deal_user_field_entity_id = fetchUserFieldEntityId(\CCrmOwnerType::Deal);

echo $deal_user_field_entity_id;

Получение полей

Для чтения описания полей удобнее использовать фабрику или D7-таблицу пользовательских полей.

Через фабрику CRM

Фабрика возвращает описание стандартных и пользовательских полей конкретного типа CRM.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Service;

const CRM_ENTITY_TYPE_ID = \CCrmOwnerType::Deal;

Loader::includeModule('crm');

/**
 * Получает описание полей через фабрику.
 */
function fetchCrmFactoryFieldsInfo(int $entity_type_id): array
{
    $factory = Service\Container::getInstance()->getFactory($entity_type_id);

    if ($factory === null) {
        return [];
    }

    return [
        'fields' => $factory->getFieldsInfo(),
        'user_fields' => $factory->getUserFieldsInfo(),
    ];
}

$fields_info = fetchCrmFactoryFieldsInfo(CRM_ENTITY_TYPE_ID);

print_r($fields_info);

Через UserFieldTable

UserFieldTable удобно использовать для чтения списка полей и их системных настроек.

<?php

use Bitrix\Main\Loader;
use Bitrix\Main\UserFieldTable;

Loader::includeModule('crm');

/**
 * Получает пользовательские поля по ENTITY_ID.
 */
function fetchUserFieldsByEntityId(string $entity_id): array
{
    $user_fields = [];

    $user_field_result = UserFieldTable::getList([
        'select' => [
            'ID',
            'ENTITY_ID',
            'FIELD_NAME',
            'USER_TYPE_ID',
            'XML_ID',
            'SORT',
            'MULTIPLE',
            'MANDATORY',
            'SHOW_IN_LIST',
            'EDIT_IN_LIST',
            'IS_SEARCHABLE',
            'SETTINGS',
        ],
        'filter' => [
            '=ENTITY_ID' => $entity_id,
        ],
        'order' => [
            'SORT' => 'ASC',
            'ID' => 'ASC',
        ],
    ]);

    while ($user_field = $user_field_result->fetch()) {
        $user_fields[] = $user_field;
    }

    return $user_fields;
}

$user_fields = fetchUserFieldsByEntityId('CRM_DEAL');

print_r($user_fields);

Получить значения из карточки

Значение пользовательского поля читается как обычное поле элемента CRM.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Service;

const CRM_DEAL_TYPE_ID = \CCrmOwnerType::Deal;
const DEAL_CUSTOM_FIELD_ID = 'UF_CRM_1234567890';

Loader::includeModule('crm');

/**
 * Получает значение пользовательского поля сделки.
 */
function fetchDealCustomFieldValue(int $deal_id, string $field_id)
{
    $factory = Service\Container::getInstance()->getFactory(CRM_DEAL_TYPE_ID);

    if ($factory === null) {
        return null;
    }

    $deal_item = $factory->getItem($deal_id);

    if ($deal_item === null) {
        return null;
    }

    return $deal_item->get($field_id);
}

$field_value = fetchDealCustomFieldValue($deal_id, DEAL_CUSTOM_FIELD_ID);

print_r($field_value);

Создание и изменение

Для изменения описания пользовательских полей в коробке обычно используют CUserTypeEntity.

Добавить пользовательское поле

<?php

use Bitrix\Main\Loader;

Loader::includeModule('crm');

/**
 * Добавляет строковое пользовательское поле.
 */
function addStringUserField(string $entity_id, string $field_name, string $label): int
{
    $user_type_entity = new \CUserTypeEntity();

    $field_id = $user_type_entity->Add([
        'ENTITY_ID' => $entity_id,
        'FIELD_NAME' => $field_name,
        'USER_TYPE_ID' => 'string',
        'XML_ID' => $field_name,
        'SORT' => 500,
        'MULTIPLE' => 'N',
        'MANDATORY' => 'N',
        'SHOW_FILTER' => 'I',
        'SHOW_IN_LIST' => 'Y',
        'EDIT_IN_LIST' => 'Y',
        'IS_SEARCHABLE' => 'Y',
        'EDIT_FORM_LABEL' => [
            'ru' => $label,
            'en' => $label,
        ],
        'LIST_COLUMN_LABEL' => [
            'ru' => $label,
            'en' => $label,
        ],
        'LIST_FILTER_LABEL' => [
            'ru' => $label,
            'en' => $label,
        ],
    ]);

    return (int) $field_id;
}

$field_id = addStringUserField(
    'CRM_DEAL',
    'UF_CRM_CUSTOM_COMMENT',
    'Комментарий интеграции'
);

echo $field_id;

Изменить настройки поля

<?php

/**
 * Изменяет подпись пользовательского поля.
 */
function updateUserFieldLabel(int $user_field_id, string $label): bool
{
    $user_type_entity = new \CUserTypeEntity();

    return (bool) $user_type_entity->Update(
        $user_field_id,
        [
            'EDIT_FORM_LABEL' => [
                'ru' => $label,
                'en' => $label,
            ],
            'LIST_COLUMN_LABEL' => [
                'ru' => $label,
                'en' => $label,
            ],
            'LIST_FILTER_LABEL' => [
                'ru' => $label,
                'en' => $label,
            ],
        ]
    );
}

$is_updated = updateUserFieldLabel($user_field_id, 'Новое название поля');

var_dump($is_updated);

Удалить поле

Удаление поля удалит и значения этого поля в карточках. Перед удалением лучше отдельно проверить, где поле используется: карточки, роботы, бизнес-процессы, отчёты, интеграции.

<?php

/**
 * Удаляет пользовательское поле.
 */
function deleteUserField(int $user_field_id): bool
{
    $user_type_entity = new \CUserTypeEntity();

    return (bool) $user_type_entity->Delete($user_field_id);
}

$is_deleted = deleteUserField($user_field_id);

var_dump($is_deleted);

Источники