Задать вопрос

Как возобновить закрытую задачу через БП активити PHP код?

Коллеги, добрый день!

Подскажите пожалуйста как возобновить завершенную задачу в БП используя активити PHP код
ID задачи заранее известен

Следующий код почему то не отрабатывает:
$rootActivity = $this->GetRootActivity();
\CModule::IncludeModule('tasks');  
// подключаем модуль задач

$taskId = intval({=A51937_98794_83473_67621:TaskId}); 
// Ид нашей задачи

$userId = substr('{{Ответственный}}', 5); 
// $id юзера, от которого возобновляем задачу

if ($taskId > 0)
{
 $oTaskItem = CTaskItem::getInstance($taskId, $userId);
 $oTaskItem->startExecution(); 
// возобновляем задачу

}
else
{
 $taskInfo['STATUS'] = 'error';
}
$rootActivity->SetVariable('TaskStatus', $taskInfo['STATUS']);


Ответственный имеет права администратора, по этому проблем с возобновлением быть не должно
  • Вопрос задан
  • 509 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Я набросал фрагмент кода, который поможет в подобной модификации.
Кстати, в $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
	);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы