← К заметкам

Заметки

Как обновить CRM-элемент через D7 Operation с проверкой прав

Для изменения CRM-элемента через фабрику можно использовать getUpdateOperation(). В основном примере проверка доступа должна оставаться включённой: вызов disableCheckAccess() меняет смысл операции и не исправляет причину отказа в доступе.

Обновление из авторизованного обработчика

Фрагмент для коробки с подключённым прологом и текущим авторизованным пользователем. Проверку HTTP-метода и CSRF выполняет вызывающий контроллер; код ниже сам по себе не является публичным endpoint.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Service\Container;
use Bitrix\Crm\Service\Context;

global $USER;

if (!$USER || !$USER->IsAuthorized()) {
    throw new RuntimeException('Нужна авторизация.');
}
if (!Loader::includeModule('crm')) {
    throw new RuntimeException('Модуль crm недоступен.');
}

$entity_type_id = 179;
$item_id = 45;
$user_id = (int) $USER->GetID();
$factory = Container::getInstance()->getFactory($entity_type_id);
if (!$factory) {
    throw new RuntimeException('Фабрика этого типа CRM недоступна.');
}

$item = $factory->getItem($item_id);
if (!$item) {
    throw new RuntimeException('Элемент не найден.');
}

$item->setTitle('Новое название');
$context = new Context();
$context->setUserId($user_id);
$result = $factory->getUpdateOperation($item, $context)->launch();

if (!$result->isSuccess()) {
    throw new RuntimeException(implode('; ', $result->getErrorMessages()));
}

Если операция вернула ошибку

Разберите сообщения getErrorMessages(): причиной может быть доступ к элементу или незаполненное обязательное поле. Не отключайте проверки целиком ради успешного результата. Для агента или CLI отдельно задают доверенный контекст выполнения; ID пользователя из входящего запроса для этого не подходит.

Доступность конкретной фабрики и её действий зависит от установленной версии CRM. Справка по фабрикам CRM.

Источники