Смарт процессы
Использование методов
<?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_IDTABLE_NAME— имя таблицы, в которой хранятся значения этого Смарт процесса
b_crm_dynamic_items_{b_crm_dynamic_type.ENTITY_TYPE_ID}— таблица значений конкретного смарт процесса. Содержит колонки —UF_свойстваb_user_field— содержит создаваемыеUF_свойстваENTITY_ID—CRM_{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_*.