Я набросал фрагмент кода, который поможет в подобной модификации.
Кстати, в $updateData есть и другие ключи помимо ERRORS которые могут заполнить необходимые доп.объекты.
use \Bitrix\Main,
\Bitrix\Tasks
;
/**
* Оборачиваем наш код в try-catch потому что мы не хотим
* чтобы упавшее действие подвесело нам ход бизнес-процесса.
*
* Обращаю внимание: в catch блоке ловим именно Throwable, а не Exception.
*/
try
{
/**
* Подключаем модуль Задачи (tasks) через requireModule
* он в случае отсутствия модуля выкинет нам Exception
*/
Main\Loader::requireModule('tasks');
/**
* Лучше избегать магических подстановок в c использованием фигурных скобок
* Если там по какой-то причине будет экранирующий символ это больно ударит по системе
*
* Для этого используем 2 хака:
* 1. Используем ParseValue метод, который из подобного синтаксиса достанет значение
* 2. Чтобы мы сами не попали в автозамену регулярок разделим выражение так, чтобы мы
* не прошли по маске
*
* Ну и само-собой выражения на русском не парсятся, поэтому придется использовать
* старые выражения из технических полей.
*/
$actionUserId = (int) mb_substr(
$this->ParseValue("{"."=Document:AssigneById}"),
5
);
if ( empty($actionUserId) )
{
throw new \Exception("Employee identifier is empty!");
}
$taskId = (int) $this->ParseValue("{"."=Template:TaskId}");
if ( empty($taskId) )
{
throw new \Exception("Task identifier is empty!");
}
/**
* Воспользуемся недокументированной функцией по обновлению задачи
* В целом она дает то же самое - т.е. меняет статус, но дополнительно
* метод вызывает необходимые push-уведомления, записи в логи, очистки
* кешей и т.п.
*/
$updateData = Tasks\Manager\Task::update(
$actionUserId,
$taskId,
[
'STATUS' => \CTasks::STATE_PENDING
]
);
if ( $updateData['ERRORS']->checkHasErrors() )
{
throw new \Exception( $updateData['ERRORS']->getMessages() );
}
/* Сигнализируем что все ок */
$this->WriteToTrackingService(
"Task renewed",
0,
\CBPTrackingType::Custom
);
}
catch( \Throwable $e )
{
/* Если что-то поймали - запишем в лог */
$this->WriteToTrackingService(
sprintf(
"Error '%s' in file %s on line %i",
$e->getMessage(),
$e->getFile(),
$e->getLine(),
),
0,
\CBPTrackingType::Error
);
}