Заметки
Как обновить 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.