Документация для разработчиков
Темная тема

Работа с элементами

Работа с элементами

Создание элемента

$entityTypeId = \CCrmOwnerType::Deal;

$factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($entityTypeId);
if (!$factory)
{
	echo 'factory not found';
	return;
}

// пустой элемент, у которого заполнены значения полей по умолчанию. В том числе направление, стадия, кем создан и т.д.
$item = $factory->createItem();

// метод вернет данные об элементе в виде массива, идентичного по структуре "старому" API 
// $item->getCompatibleData();

// теперь надо записать новые значения полей
$item
	->setAssignedById($newAssigned)
	->setMycompanyId($newMycompanyId)
;

// можно данные записать массивом, аналогичным по структуре "старому" API

$item->setFromCompatibleData([
	\Bitrix\Crm\Item::FIELD_NAME_ASSIGNED => $newAssigned,
	\Bitrix\Crm\Item::FIELD_NAME_MYCOMPANY_ID => $newMycompanyId,
])

// данные нигде не сохранены, они только хранятся внутри $item 
// чтобы сохранить изменения в БД без выполнения всех связанных действий, достаточно вызвать
// $item->save();
// НО ДЕЛАТЬ ТАК НЕ РЕКОМЕНДУЕТСЯ.
// Все связанные действия, часто обеспечивающие работоспособность функционала crm будут пропущены (обновления счетчиков,
// прав доступа, поисковых индексов, т.д.)

// если необходимо переопределить контекст выполнения, это надо сделать в явном виде
$context = new \Bitrix\Crm\Service\Context();
$context->setUserId($userId);

// операция производится от пользователя $userId с выполнением всех проверок
$operation = $factory->getAddOperation($item, $context);
$result = $operation->launch();

Изменение элемента

Например, мы хотим изменить состав связанных с элементом контактов, без учёта всех проверок.

$entityTypeId = \CCrmOwnerType::Deal;
$entityId = 261;

$factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($entityTypeId);
// нет смысла выполнять код дальше, если у сущности нет поля "Клиент"
if (!$factory || !$factory->isClientEnabled())
{
	echo 'factory not found';
	return;
}

$item = $factory->getItem($entityId);
if (!$item)
{
	echo 'item not found';
	return;
}

// $item->getContacts() вернет массив orm-объектов из таблицы b_crm_contact, привязанных к этому элементу
// он может быть полезен, когда необходимо прочитать данные привязанных контактов.

// здесь хранится простой массив с данными о привязках к контактам
//$existingBindings = $item->getContactBindings();

// добавить связь с контактом с ид = 4
$item->bindContacts(\Bitrix\Crm\Binding\EntityBinding::prepareEntityBindings(\CCrmOwnerType::Contact, [4]));
// удалить связь с контактом с ид = 3
$item->unBindContacts(\Bitrix\Crm\Binding\EntityBinding::prepareEntityBindings(\CCrmOwnerType::Contact, [3]));

// данные о новых привязках ещё нигде не сохранены, они только хранятся внутри $item 
// чтобы сохранить изменения в БД без выполнения всех связанных действий, достаточно вызвать
// $item->save();
// НО ДЕЛАТЬ ТАК НЕ РЕКОМЕНДУЕТСЯ.
// Все связанные действия, часто обеспечивающие работоспособность функционала crm будут пропущены (обновления счетчиков,
// прав доступа, поисковых индексов, т.д.)

// если необходимо переопределить контекст выполнения, это надо сделать в явном виде
// $context = new \Bitrix\Crm\Service\Context();
// $context->setUserId($userId);

$operation = $factory->getUpdateOperation($item);
$operation->disableAllChecks();

$result = $operation->launch();

Удаление элемента

$entityTypeId = \CCrmOwnerType::Deal;
$entityId = 260;

$factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($entityTypeId);
if (!$factory)
{
	echo 'factory not found';
	return;
}

$item = $factory->getItem($entityId);
if (!$item)
{
	echo 'item not found';
	return;
}

// удалить элемент без выполнения дополнительных проверок и действий можно через
// $item->delete();
// НО ТАК ДЕЛАТЬ НЕ РЕКОМЕНДУЕТСЯ!
// В таблицах останутся лишние записи (индексы, связи и т.д.)

$result = $factory->getDeleteOperation($item)->launch();


© «Битрикс», 2001-2024, «1С-Битрикс», 2024