|
Получить заголовки разделов сущностей (Сделки, Лиды и т.д.)
|
|---|
$descriptions = \CCrmOwnerType::GetAllDescriptions(); // вернет "Контакт" $contactDescription = $descriptions[\CCrmOwnerType::Contact]; // то же самое //$contactDescription = \CCrmOwnerType::GetDescription(\CCrmOwnerType::Contact); $categoryDescriptions = \CCrmOwnerType::GetAllCategoryCaptions(); // вернет "Контакты" $contactCategoryDescription = $categoryDescriptions[\CCrmOwnerType::Contact]; // то же самое //$contactCategoryDescription = \CCrmOwnerType::GetCategoryCaption(\CCrmOwnerType::Contact); |
Чтение данных из сущностей разных типов
Довольно типовой случай, когда надо прочитать данные о сущностях разных типов. Задача распространённая, но в каждый раз есть какие-то свои особенности. На стороне CRM нет такого "волшебного" способа, который учтет все варианты. Для каждого случая надо писать свою обвязку.
|
Получить ссылку на список / элемент
|
|---|
| Необходимо воспользоваться Service\Router. |
|
Получить заголовок элемента произвольного типа
|
|---|
Метод сформирует заголовок элемента из нескольких полей, в зависимости от типа сущности. Не используйте этот метод внутри цикла. $dealTitle = \CCrmOwnerType::GetCaption(\CCrmOwnerType::Deal, 11); // title is not escaped! |
|
Получить базовые данные об элементе произвольного типа
|
|---|
$data = [];
$isCheckAccess = true;
$isLoaded = \CCrmOwnerType::TryGetEntityInfo(\CCrmOwnerType::Order, 22, $data, $isCheckAccess);
if ($isLoaded)
{
print_r($data);
}
|
|
Получить базовые данные о списке элементов одного типа
|
|---|
// ключ - идентификатор элемента $data = [ 11 => [], 13 => [], 222 => [], ]; $isCheckAccess = true; \CCrmOwnerType::PrepareEntityInfoBatch(\CCrmOwnerType::Lead, $data, $isCheckAccess); print_r($data); |
|
Узнать ответственного за элемент
|
|---|
$isCheckAccess = true; // загружает актуального ответственного $responsibleId = \CCrmOwnerType::loadResponsibleId(\CCrmOwnerType::Lead, 11, $isCheckAccess); // GetResponsibleID - то же самое, но данные кешируются |
|
Чтение произвольных данных
|
|---|
Рассмотрим пример, в котором на входе есть набор идентификаторов элементов разных типов. Необходимо получить о них информацию, включая контактные данные (мультиполя). use Bitrix\Main\Loader;
use Bitrix\Crm\Service;
use Bitrix\Crm\Item;
Loader::includeModule('crm');
$elements = [
[
'ENTITY_TYPE_ID' => 1,
'ENTITY_ID' => 1,
],
[
'ENTITY_TYPE_ID' => 2,
'ENTITY_ID' => 3,
],
[
'ENTITY_TYPE_ID' => 2,
'ENTITY_ID' => 5,
],
[
'ENTITY_TYPE_ID' => 3,
'ENTITY_ID' => 10,
],
[
'ENTITY_TYPE_ID' => 4,
'ENTITY_ID' => 33,
],
[
'ENTITY_TYPE_ID' => 130,
'ENTITY_ID' => 10,
]
];
// исходные даннные, сгруппированные по типу сущности
$typed = [];
foreach ($elements as $element)
{
$typed[$element['ENTITY_TYPE_ID']][$element['ENTITY_ID']] = $element['ENTITY_ID'];
}
// ид всех контактов
$contactIds = $typed[\CCrmOwnerType::Contact] ?? [];
// ид всех компаний
$companyIds = $typed[\CCrmOwnerType::Company] ?? [];
// данные о всех контактах
$contacts = [];
// данные о всех компаниях
$companies = [];
// связи
$relations = [];
// все сущности с мульти-полями
$multiFields = [];
$result = [];
foreach ($typed as $entityTypeId => $entityIds)
{
// first load all types but contacts and companies
if (
$entityTypeId === \CCrmOwnerType::Contact
|| $entityTypeId === \CCrmOwnerType::Company
)
{
continue;
}
$factory = Service\Container::getInstance()->getFactory($entityTypeId);
if (!$factory)
{
continue;
}
// если нужно с проверкой прав доступа
// $items = $factory->getItemsFilteredByPermissions([
$items = $factory->getItems([
'select' => ['*', Item::FIELD_NAME_CONTACT_BINDINGS],
'filter' => [
'@ID' => $entityIds,
],
]);
foreach ($items as $item)
{
$identifier = \Bitrix\Crm\ItemIdentifier::createByItem($item);
$compatibleData = $item->getCompatibleData();
$result[$item->getEntityTypeId()][$item->getId()] = $compatibleData;
foreach ($compatibleData['CONTACT_BINDINGS'] as $contactBinding)
{
// дозапишем идентификаторы связанных контактов
$contactIds[] = $contactBinding['CONTACT_ID'];
$relations[\CCrmOwnerType::Contact][$contactBinding['CONTACT_ID']][] = $identifier;
}
if ($item->hasField(Item::FIELD_NAME_COMPANY_ID))
{
// дозапишем ид связанной компании
$companyId = (int)$item->getCompanyId();
if ($companyId > 0)
{
$companyIds[] = $companyId;
$relations[\CCrmOwnerType::Company][$companyId][] = $identifier;
}
}
if ($item->getEntityTypeId() === \CCrmOwnerType::Lead)
{
$multiFields[] = [
'NAME' => \CCrmOwnerType::LeadName,
'ID' => $item->getId(),
];
}
}
}
\Bitrix\Main\Type\Collection::normalizeArrayValuesByInt($contactIds);
\Bitrix\Main\Type\Collection::normalizeArrayValuesByInt($companyIds);
// загрузим все контакты
if (!empty($contactIds))
{
$factory = Service\Container::getInstance()->getFactory(\CCrmOwnerType::Contact);
if (!$factory)
{
// no factory sorry
throw new Exception('factory for ' . \CCrmOwnerType::Contact . ' not found');
}
// если нужно с проверкой прав доступа
// $items = $factory->getItemsFilteredByPermissions([
$items = $factory->getItems([
'filter' => [
'@ID' => $contactIds,
],
]);
foreach ($items as $item)
{
$compatibleData = $item->getCompatibleData();
$contacts[$item->getId()] = $compatibleData;
if (isset($typed[$item->getEntityTypeId()][$item->getId()]))
{
$result[$item->getEntityTypeId()][$item->getId()] = $compatibleData;
}
$multiFields[] = [
'NAME' => \CCrmOwnerType::ContactName,
'ID' => $item->getId(),
];
}
}
// загрузим все компании
if (!empty($companyIds))
{
$factory = Service\Container::getInstance()->getFactory(\CCrmOwnerType::Company);
if (!$factory)
{
// no factory sorry
throw new Exception('factory for ' . \CCrmOwnerType::Company . ' not found');
}
// если нужно с проверкой прав доступа
// $items = $factory->getItemsFilteredByPermissions([
$items = $factory->getItems([
'filter' => [
'@ID' => $companyIds,
],
]);
foreach ($items as $item)
{
$compatibleData = $item->getCompatibleData();
$companies[$item->getId()] = $compatibleData;
if (isset($typed[$item->getEntityTypeId()][$item->getId()]))
{
$result[$item->getEntityTypeId()][$item->getId()] = $compatibleData;
}
$multiFields[] = [
'NAME' => \CCrmOwnerType::CompanyName,
'ID' => $item->getId(),
];
}
}
// загрузим все контактные данные и примешаем их к результату с учетом связей
$filter = \Bitrix\Crm\FieldMultiTable::prepareFilter($multiFields);
$multiFields = \Bitrix\Crm\FieldMultiTable::getList([
'filter' => $filter,
]);
while ($fieldItem = $multiFields->fetch())
{
$entityTypeId = \CCrmOwnerType::ResolveID($fieldItem['ENTITY_ID']);
$itemId = (int)$fieldItem['ELEMENT_ID'];
if (isset($result[$entityTypeId][$itemId]))
{
$result[$entityTypeId][$itemId]['FM'][] = $fieldItem;
}
if (isset($relations[$entityTypeId][$itemId]))
{
foreach ($relations[$entityTypeId][$itemId] as $identifier)
{
$result[$identifier->getEntityTypeId()][$identifier->getEntityId()]['FM'][] = $fieldItem;
}
}
}
print_r($result);
Код в этом примере можно улучшить, оставлен в таком виде для наглядости. Желательно обернуть в какой-то класс на своей стороне. |
|
Получить первую стадию (без учета прав доступа)
|
|---|
Если не передать направление, и направления поддерживаются, то будет использовано направление по умолчанию.
$getFirstStageId = function(int $entityTypeId, int $categoryId = null): ?string
{
$factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($entityTypeId);
if (!$factory || !$factory->isStagesSupported())
{
return null;
}
$firstStage = $factory->getStages((int)$categoryId)->getAll()[0];
return $firstStage ? $firstStage->getStatusId() : null;
};
|
|
Получить первую стадию с учетом прав доступа
|
|---|
Надо воспользоваться методом \Bitrix\Crm\Service\UserPermissions::getStartStageId
$getFirstStageIdWithPermissions = function(
int $entityTypeId,
int $userId = null,
int $categoryId = null,
string $operation = \Bitrix\Crm\Service\UserPermissions::OPERATION_READ
): ?string
{
$factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($entityTypeId);
if (!$factory || !$factory->isStagesSupported())
{
return null;
}
$stages = $factory->getStages((int)$categoryId);
return \Bitrix\Crm\Service\Container::getInstance()->getUserPermissions($userId)->getStartStageId(
$entityTypeId,
$stages,
(int)$categoryId,
$operation
);
};
|
© «Битрикс», 2001-2025, «1С-Битрикс», 2025