Как получить entityTypeId из поля «Привязка к элементам CRM»
Как по L_281 и T88a_153 получить entityTypeId, проверить элемент через D7/REST и передать ID в фабрику. Поддерживаются CCrmOwnerType и динамические TypeTable.
Как получить entityTypeId для элемента, привязанного через поле «Привязка к элементам CRM» в карточке смарт‑процесса? В поле приходят значения типа:
Array
(
[0] => L_281 // лид
[1] => T88a_153 // смарт процесс
)
Из этого массива не удаётся достать entityTypeId. Нужен способ, чтобы:
- по строкам вида L_281 или T88a_153 определить соответствующий entityTypeId,
- проверить, существует ли привязанный элемент,
- получить entityTypeId для передачи в фабрику.
Какие методы/функции/API использовать для получения entityTypeId для разных типов сущностей (лид, смарт‑процесс и т.п.)?
Для привязки к элементам CRM строки парсятся по префиксу: L_ — стандартная сущность (лид и т.п.), T… — смарт‑процесс, где часть после T — шестнадцатеричный идентификатор типа; для получения entityTypeId смарт‑процесса выполните hexdec() от этой части, для стандартных сущностей сопоставьте префикс с константами CCrmOwnerType и получите numeric entityTypeId. После этого проверьте существование элемента через D7 ORM / фабрику или REST и передайте полученный entityTypeId в фабрику (TypeTable + Container::getInstance()->getFactory($entityTypeId)). [См. примеры и ссылки далее.]
Содержание
- Краткий алгоритм
- Разбор формата значений (L_, T…)
- Определение entityTypeId для стандартных сущностей
- Определение entityTypeId для смарт‑процессов
- Проверка существования привязанного элемента
- Получение фабрики и передача entityTypeId
- Примеры кода (PHP/D7 и REST)
- Источники
- Заключение
Краткий алгоритм
- Разобрать строку привязки: выделить префикс и ID элемента.
- Если префикс начинается с “T” — выделить hex‑часть перед подчёркиванием, выполнить hexdec() → получаем numeric entityTypeId для смарт‑процесса.
- Если префикс — буквы (L, C, CO, D и т.д.) — сопоставить с константами CCrmOwnerType (лид, контакт, компания, сделка) → получить entityTypeId.
- Проверить существование элемента: для стандартных сущностей — через соответствующий ORM (LeadTable, DealTable и т.д.) или REST; для смарт‑процессов — проверить TypeTable и получить Item через фабрику.
- Передать entityTypeId в фабрику / автоматизацию (или использовать в REST).
Коротко — именно так: parse → map/hexdec → verify → factory/use. Ниже — детали и код.
Разбор формата значений (L_, T…)
Типичные строки из поля «Привязка к элементам CRM» выглядят как:
- L_281 — префикс L (lead) + id элемента (281)
- T88a_153 — префикс T + hex‑идентификатор типа (88a) + _ + id элемента (153)
Официальный helpdesk прямо указывает, что в выгрузке коды в скобках/строки содержат префиксы и что префикс T + hex обозначает элемент смарт‑процесса, записанный в шестнадцатеричной форме: см. помощь. Поэтому алгоритм парсинга — проверить наличие формата T
Простейший парсер (регулярки):
// примеры регулярок
// T88a_153 -> matches T + hex + _ + decimal id
if (preg_match('/^T([0-9a-fA-F]+)_([0-9]+)$/', $value, $m)) {
$hex = $m[1];
$elementId = (int)$m[2];
$entityTypeId = hexdec($hex); // numeric id для смарт‑процесса
}
// L_281 -> prefix L + id
if (preg_match('/^([A-Z]{1,3})_([0-9]+)$/', $value, $m)) {
$prefix = $m[1]; // L, C, CO, D и т.д.
$elementId = (int)$m[2];
}
Определение entityTypeId для стандартных сущностей
Для стандартных сущностей (лид, сделка, контакт, компания и т.д.) префикс в строке позволяет сопоставить сущность с константой CCrmOwnerType. Примеры отображений:
- L → CCrmOwnerType::Lead
- D → CCrmOwnerType::Deal
- C → CCrmOwnerType::Contact
- CO → CCrmOwnerType::Company
- Q → CCrmOwnerType::Quote
- I → CCrmOwnerType::Invoice
Реализация (фрагмент):
$map = [
'L' => CCrmOwnerType::Lead,
'D' => CCrmOwnerType::Deal,
'C' => CCrmOwnerType::Contact,
'CO' => CCrmOwnerType::Company,
];
if (isset($map[$prefix])) {
$entityTypeId = $map[$prefix];
// $elementId уже извлечён
}
Для проверки существования используйте D7 ORM (рекомендуется) или старые классы CCrm*. Примеры D7:
use Bitrix\Crm\LeadTable;
$row = LeadTable::getById($elementId)->fetch();
if ($row) { /* элемент существует */ }
Для справки о кодах подстановки и префиксах — официальная документация/учебник Bitrix: Коды подстановки сущностей и примеры использования CCrmOwnerType в автоматизации dev.1c-bitrix.ru.
Если вы не уверены в классе таблицы, можно проверять через REST (см. ниже).
Определение entityTypeId для смарт‑процессов
Смарт‑процессы (динамические сущности) кодируются как T
- Извлекаете hex (например “88a”) и делаете numericEntityTypeId = hexdec(‘88a’).
- Проверяете, что такой type существует в списке динамических типов через TypeTable. На практике удобно использовать D7: TypeTable::getByEntityTypeId / getList. Пример использования TypeTable и фабрики — см. разбор на Habr (пример с TypeTable и фабрикой): Habr: Factory, TypeTable.
- Получив entityTypeId, используете фабрику для работы с элементом.
Пример проверки типа и получения фабрики:
use Bitrix\Crm\Model\Dynamic\TypeTable;
use Bitrix\Crm\Service\Container;
$type = TypeTable::getList(['filter' => ['=ENTITY_TYPE_ID' => $entityTypeId]])->fetch();
if (!$type) {
// тип не найден — строка некорректна или тип удалён
}
$factory = Container::getInstance()->getFactory($entityTypeId);
if (!$factory) {
// фабрика не найдена — возможно недостаточно прав или нестандартный тип
}
Важное замечание: numeric entityTypeId для смарт‑процессов — не те же константы CCrmOwnerType, это отдельные ID динамических типов (как показано выше в примерах и в блогах/руководствах).
Проверка существования привязанного элемента
Варианты проверки:
- D7 ORM (локально на сервере):
- Для стандартных: LeadTable::getById, DealTable::getById и т.д.
- Для динамических: через фабрику(id)) или через ORM модели динамического типа (TypeTable + соответствующие классы фабрики).
- REST:
- Для лида: вызов метода crm.lead.get (или через webhook):
crm.lead.get?id=281. - Для смарт‑процесса: использовать
crm.item.get?entityTypeId=<число>&id=<id>(метод REST для динамических сущностей). Практика работы с полями и PARENT_ID_описана в блогах и практических примерах, например в статье о связях смарт‑процессов: Wersis — smart-process connections.
REST‑пример (через webhook):
https://your-domain.bitrix24.ru/rest/1/WEBHOOK_TOKEN/crm.item.get?entityTypeId=2186&id=153
Ответ покажет, существует ли элемент.
Если нужно — сначала получить список динамических типов (TypeTable), чтобы убедиться в корректности entityTypeId.
Получение фабрики и передача entityTypeId
После того как вы получили numeric entityTypeId (либо по сопоставлению префикса, либо через hexdec для T…), фабрика нужна для дальнейшей работы (получение Item, обновление, запуск BP/роботов).
Ключевые шаги:
- Получить имя/тип:
$entityTypeName = CCrmOwnerType::ResolveName($entityTypeId);— полезно при формировании данных для бизнес‑процессов/роботов (пример использования CCrmOwnerType::ResolveName есть в практических путях по автоматизации). - Получить фабрику:
$factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($entityTypeId); - Вызвать методы фабрики:
$item = $factory->getItem($elementId);/$factory->getList([...])— дальше работаете с объектом.
Пример подготовки данных для запуска процесса/робота:
$entityTypeName = CCrmOwnerType::ResolveName($entityTypeId);
$triggerData = [
'ENTITY_TYPE_ID' => $entityTypeId,
'ENTITY_TYPE_NAME' => $entityTypeName,
'ID' => $elementId,
];
// далее вызываете старт BP/робота с этими данными
(См. пример создания триггера и передачи ENTITY_TYPE_ID в сообществе/статьях по автоматизации.)
Примеры кода (PHP/D7 и REST)
Полный пример функции, которая парсит значение, возвращает entityTypeId и проверяет существование:
use Bitrix\Main\Loader;
use Bitrix\Crm\Model\Dynamic\TypeTable;
use Bitrix\Crm\Service\Container;
Loader::includeModule('crm');
function resolveBindingAndCheck(string $value): ?array {
// T<hex>_<id>
if (preg_match('/^T([0-9a-fA-F]+)_([0-9]+)$/', $value, $m)) {
$entityTypeId = (int) hexdec($m[1]);
$elementId = (int) $m[2];
$type = TypeTable::getList(['filter' => ['=ENTITY_TYPE_ID' => $entityTypeId]])->fetch();
if (!$type) return null; // тип не найден
$factory = Container::getInstance()->getFactory($entityTypeId);
if (!$factory) return null;
$item = $factory->getItem($elementId);
return $item ? ['entityTypeId' => $entityTypeId, 'id' => $elementId] : null;
}
// стандарт: PREFIX_ID
if (preg_match('/^([A-Z]{1,3})_([0-9]+)$/', $value, $m)) {
$prefix = $m[1];
$id = (int) $m[2];
$map = [
'L' => CCrmOwnerType::Lead,
'D' => CCrmOwnerType::Deal,
'C' => CCrmOwnerType::Contact,
'CO' => CCrmOwnerType::Company,
];
if (!isset($map[$prefix])) return null;
$entityTypeId = $map[$prefix];
// Пример проверки для лида:
if ($entityTypeId === CCrmOwnerType::Lead) {
$row = \Bitrix\Crm\LeadTable::getById($id)->fetch();
return $row ? ['entityTypeId'=>$entityTypeId, 'id'=>$id] : null;
}
// Добавьте проверки для других типов по аналогии
}
return null;
}
REST‑проверка (пример curl/wget через webhook):
# Для лида
https://your.bitrix24.ru/rest/1/WEBHOOK_TOKEN/crm.lead.get?id=281
# Для смарт-процесса
https://your.bitrix24.ru/rest/1/WEBHOOK_TOKEN/crm.item.get?entityTypeId=2186&id=153
Источники
- Описания кодов привязки и форматов в helpdesk Bitrix24: https://helpdesk.bitrix24.ru/open/25817644/
- Коды подстановки сущностей (официальный учебный курс): https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=57&LESSON_ID=13640
- Пример использования CCrmOwnerType в автоматизации (официальный): https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=57&LESSON_ID=20686
- Работа с TypeTable и фабриками (пример / разбор): https://habr.com/ru/articles/942338/
- Примеры полей PARENT_ID_
и связи смарт‑процессов: https://wersis.ru/bitrix24/smart-process-connections/ - Пользовательские поля и XML_ID (официальный справочник): https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=3496
- Описание полей/параметров привязки в helpdesk: https://helpdesk.bitrix24.ru/open/22048980/
Заключение
Ключевая идея: парсить строку по префиксу — L_ → стандартная сущность, T