Веб

Как получить entityTypeId из поля «Привязка к элементам CRM»

Как по L_281 и T88a_153 получить entityTypeId, проверить элемент через D7/REST и передать ID в фабрику. Поддерживаются CCrmOwnerType и динамические TypeTable.

1 ответ 1 просмотр

Как получить 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)). [См. примеры и ссылки далее.]


Содержание


Краткий алгоритм

  1. Разобрать строку привязки: выделить префикс и ID элемента.
  2. Если префикс начинается с “T” — выделить hex‑часть перед подчёркиванием, выполнить hexdec() → получаем numeric entityTypeId для смарт‑процесса.
  3. Если префикс — буквы (L, C, CO, D и т.д.) — сопоставить с константами CCrmOwnerType (лид, контакт, компания, сделка) → получить entityTypeId.
  4. Проверить существование элемента: для стандартных сущностей — через соответствующий ORM (LeadTable, DealTable и т.д.) или REST; для смарт‑процессов — проверить TypeTable и получить Item через фабрику.
  5. Передать 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_ и в этом случае получить entityTypeId = hexdec().

Простейший парсер (регулярки):

php
// примеры регулярок
// 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

Реализация (фрагмент):

php
$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:

php
use Bitrix\Crm\LeadTable;

$row = LeadTable::getById($elementId)->fetch();
if ($row) { /* элемент существует */ }

Для справки о кодах подстановки и префиксах — официальная документация/учебник Bitrix: Коды подстановки сущностей и примеры использования CCrmOwnerType в автоматизации dev.1c-bitrix.ru.

Если вы не уверены в классе таблицы, можно проверять через REST (см. ниже).


Определение entityTypeId для смарт‑процессов

Смарт‑процессы (динамические сущности) кодируются как T_. Процедура:

  1. Извлекаете hex (например “88a”) и делаете numericEntityTypeId = hexdec(‘88a’).
  2. Проверяете, что такой type существует в списке динамических типов через TypeTable. На практике удобно использовать D7: TypeTable::getByEntityTypeId / getList. Пример использования TypeTable и фабрики — см. разбор на Habr (пример с TypeTable и фабрикой): Habr: Factory, TypeTable.
  3. Получив entityTypeId, используете фабрику для работы с элементом.

Пример проверки типа и получения фабрики:

php
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 динамических типов (как показано выше в примерах и в блогах/руководствах).


Проверка существования привязанного элемента

Варианты проверки:

  1. D7 ORM (локально на сервере):
  • Для стандартных: LeadTable::getById, DealTable::getById и т.д.
  • Для динамических: через фабрику(factory>getItem(factory->getItem(id)) или через ORM модели динамического типа (TypeTable + соответствующие классы фабрики).
  1. 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([...]) — дальше работаете с объектом.

Пример подготовки данных для запуска процесса/робота:

php
$entityTypeName = CCrmOwnerType::ResolveName($entityTypeId);
$triggerData = [
 'ENTITY_TYPE_ID' => $entityTypeId,
 'ENTITY_TYPE_NAME' => $entityTypeName,
 'ID' => $elementId,
];
// далее вызываете старт BP/робота с этими данными

(См. пример создания триггера и передачи ENTITY_TYPE_ID в сообществе/статьях по автоматизации.)


Примеры кода (PHP/D7 и REST)

Полный пример функции, которая парсит значение, возвращает entityTypeId и проверяет существование:

php
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

Источники

  1. Описания кодов привязки и форматов в helpdesk Bitrix24: https://helpdesk.bitrix24.ru/open/25817644/
  2. Коды подстановки сущностей (официальный учебный курс): https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=57&LESSON_ID=13640
  3. Пример использования CCrmOwnerType в автоматизации (официальный): https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=57&LESSON_ID=20686
  4. Работа с TypeTable и фабриками (пример / разбор): https://habr.com/ru/articles/942338/
  5. Примеры полей PARENT_ID_ и связи смарт‑процессов: https://wersis.ru/bitrix24/smart-process-connections/
  6. Пользовательские поля и XML_ID (официальный справочник): https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=3496
  7. Описание полей/параметров привязки в helpdesk: https://helpdesk.bitrix24.ru/open/22048980/

Заключение

Ключевая идея: парсить строку по префиксу — L_ → стандартная сущность, T_ → смарт‑процесс; для T выполнить hexdec() и получить numeric entityTypeId, для L/C/CO/D сопоставить префикс с константами CCrmOwnerType. После этого проверяете существование через D7 ORM или REST и берёте фабрику через Container::getInstance()->getFactory($entityTypeId) для дальнейшей работы. Следуйте приведённым примерам кода и ссылкам на документацию для надёжной реализации.

Авторы
Проверено модерацией
Модерация