Перейти к содержанию

Смарт процессы

Использование методов

<?php
// b_crm_dynamic_type.ENTITY_TYPE_ID
$entityTypeId = 187;

// b_crm_product_row.OWNER_TYPE
// вернёт Tbb
$entityType = \CCrmOwnerTypeAbbr::ResolveByTypeID($entityTypeId);

$query = \Bitrix\Crm\Service\Container::getInstance()
    ->getFactory($entityTypeId)
    ->getDataClass()::query();

// вернёт 187
$result = CCrmOwnerType::ResolveID('DYNAMIC_187');

// значение, используемое как значение "Объект" для пользовательского поля.
// вернёт CRM_5
$userFieldEntityId = CCrmOwnerType::ResolveUserFieldEntityID($entityTypeId);

Примерная терминология

При работе со смартами встречаются такие идентификаторы:

  • ENTITY_TYPE_ID — числовое значение, которое формируется рандомно в момент создания и фиксируется в b_crm_dynamic_type.ENTITY_TYPE_ID. Используется в именовании таблицы b_crm_dynamic_items_{ENTITY_TYPE_ID}
  • ENTITY_TYPE — вычисляемое значение, которое вычисляется как CCrmOwnerTypeAbbr::DynamicTypeAbbreviationPrefix + dechex(ENTITY_TYPE_ID). Например Tbb. Используется в качестве b_crm_product_row.OWNER_TYPE.
  • ENTITY_NAME. Встретил при работе с UF полями. Выглядит как CRM_4, где 4 — ID смарт процесса (b_crm_dynamic_type.ID)
  • DYNAMIC_187. В таком виде прилетает в компонент ТЧ

Ссылки

Архитектура БД

  • b_crm_dynamic_type — таблица смарт процессов
    • ID — ID сущности
    • ENTITY_TYPE_ID
    • TABLE_NAME — имя таблицы, в которой хранятся значения этого Смарт процесса
  • b_crm_dynamic_items_{b_crm_dynamic_type.ENTITY_TYPE_ID} — таблица значений конкретного смарт процесса. Содержит колонки — UF_ свойства
  • b_user_field — содержит создаваемые UF_ свойства
    • ENTITY_IDCRM_{b_crm_dynamic_type.ID}

UF_* свойства содержатся как в b_user_field в виде записей, так и в b_crm_dynamic_items_* в виде колонок

  • b_crm_entity_relation — связь с CRM сущностями. Например, со сделками
    • SRC_ENTITY_TYPE_ID — ID типа исходной сущности. Для сделки — CCrmOwnerType::Deal (2)
    • SRC_ENTITY_ID — ID элемента сущности. Например, ID сделки
    • DST_ENTITY_TYPE_ID — ID типа необходимого смарта процесса (b_crm_dynamic_type.ENTITY_TYPE_ID)
    • DST_ENTITY_ID — ID элемента смарт процесса

ENTITY_TYPE_ID

Это поле описано в Bitrix\Crm\Model\Dynamic\TypeTable:

<?php
(new ORM\Fields\IntegerField('ENTITY_TYPE_ID'))
    ->configureTitle(Loc::getMessage('CRM_TYPE_ENTITY_TYPE_ID_TITLE_MSGVER_1'))
    ->configureRequired()
    ->configureUnique()
    ->addValidator([static::class, 'validateEntityTypeId'])
    ->configureDefaultValue(static function() {
        $nextId = static::getNextAvailableEntityTypeId();
        if (!$nextId) {
            throw new InvalidOperationException(Loc::getMessage('CRM_TYPE_ENTITY_TYPE_ID_LIMIT_ERROR_MSGVER_1'));
        }

        return $nextId;
    })

Логика getNextAvailableEntityTypeId:

  • Рассматривается интервал от \CCrmOwnerType::DynamicTypeStart до \CCrmOwnerType::DynamicTypeEnd - 1
  • Учитываются записи в корзине Bitrix\Crm\Integration\Recyclebin\Dynamic::getSurveyInfoFromRecyclebin()
  • Если удалённых нет, то берётся случайное целое между \CCrmOwnerType::DynamicTypeStart и \CCrmOwnerType::DynamicTypeEnd - 1
  • Если есть удалённые, то строится array_diff, полученный массив перемешивается (shuffle), первый элемент (незанятый ID) возвращается как defaultValue

UF свойства

UF свойства можно создавать через публичный интерфейс. Но битрикс сам подставит префикс UF_CRM_{b_crm_dynamic_type.ID}_. Получится что-нибудь типа UF_CRM_3_UF_USER — это никак не изменить.

UF свойство можно создавать через админский интерфейс, в качестве Объекта указать CRM_{b_crm_dynamic_type.ID}. Через админку не будет проблем с префиксом.

В обоих случаях битрикс создаст запись в b_user_field, а так же создаст колонки в b_crm_dynamic_items_*.