Пример использования REST в процессах

Урок 237 из 248
Автор: Марина Павлова
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
3 из 5
Просмотров: 18427
Дата изменения: 03.10.2023
Недоступно в лицензиях:
Текущую редакцию Вашего 1С-Битрикс можно просмотреть на странице Обновление платформы (Marketplace > Обновление платформы).
Старт, Стандарт, Малый бизнес

Стандартное действие Задача не позволяет нам работать с чек-листами. Однако, используя rest-методы работы с задачами, это сделать можно. К тому же в данном примере работа будет вестись не через задания бизнес-процессов, а саму задачу, что так же нельзя реализовать, используя штатное действие.

Задание. Необходимо поставить задачу юристу организации проверить данные контрагента. Задача должна содержать чек-лист со списком проверяемых данных. Если юрист утверждает какие-либо данные, то он вычеркивает этот пункт чек-листа. В противном случае – пункт остается незакрытым. После завершения задачи принимается решение относительно одобрения данного контрагента.

  Использование rest-методов

С помощью метода task.item.add задача будет создаваться. Чек-лист для задачи будет создан методом task.checklistitem.add. Этот чек-лист юристу и нужно будет выполнить.

if (!empty($_REQUEST['workflow_id']))
{
	if (empty($_REQUEST['auth']))
		die;

	$taskId = (int) callB24Method($_REQUEST['auth'], 'task.item.add', array(
		'TASKDATA' => array(
			'TITLE' => $_REQUEST['properties']['taskName'],
			'DESCRIPTION' => $_REQUEST['properties']['taskDescription'],
			'CREATED_BY' => str_replace('user_', '', $_REQUEST['properties']['taskCreator']),
			'RESPONSIBLE_ID' => str_replace('user_', '', $_REQUEST['properties']['taskUser'])
		)
	));

	$ar = array();
	foreach ($_REQUEST['properties']['checkList'] as $i => $checklist)
	{
		$ar[] = 'task.checklistitem.add?'.http_build_query(array(
			'TASKID' => $taskId,
			'FIELDS' => array(
				'TITLE' => $checklist,
				'IS_COMPLETE' => 'N',
				'SORT_INDEX' => 10*($i+1)
			)
		));
	}
	callB24Method($_REQUEST['auth'], 'batch', array('cmd' => $ar));

	$PDO->exec('INSERT INTO bp_events (WORKFLOW_ID, TASK_ID, EVENT_DATA) VALUES('
		.$PDO->quote($_REQUEST['workflow_id']).','.$taskId.' ,'.$PDO->quote(serialize($_REQUEST)).')');
	die;
} 

Очень важно также зафиксировать, каким именно процессом будет создаваться задача. Выполнение задачи будет зависеть от вызова события OnTaskUpdate, и нам нужно чтобы необходимый процесс реагировал на изменения именно той задачи, что была им создана. Для этого необходимо зарегистрировать обработчик события.

BX24.callBind('OnTaskUpdate', '<?=ВР_APP_HANDLER?>');

Задание будет выполнено, только если задача будет закрыта, поэтому другие изменения задачи будут игнорироваться. Как только задача будет закрыта, действие будет анализировать чек-лист. Если все пункты чек-листа выполнены, то принимается решение об одобрении контрагента. Если хотя бы один пункт не закрыт, то контрагент одобрен не будет.

if (!empty($_REQUEST['data']['FIELDS_BEFORE']['ID']))
{
	if (empty($_REQUEST['auth']))
		die;

	$taskId = (int) $_REQUEST['data']['FIELDS_BEFORE']['ID'];

	$workflowData = $PDO->query('SELECT * FROM bp_events WHERE TASK_ID = '.$taskId.' LIMIT 1')->fetch(PDO::FETCH_ASSOC);
	if (!$workflowData)
		die;

	$taskData = callB24Method($_REQUEST['auth'], 'task.item.getdata', array(
		'TASKID' => $taskId
	));

	if ($taskData['REAL_STATUS'] != 5)
		die;

	$checklistData = callB24Method($_REQUEST['auth'], 'task.checklistitem.getlist', array(
		'TASKID' => $taskId
	));

	$checkStatus = 'Y';

	foreach ($checklistData as $item)
	{
		if ($item['IS_COMPLETE'] == 'N')
		{
			$checkStatus = 'N';
			break;
		}
	}

	$workflowEvent = unserialize($workflowData['EVENT_DATA']);

	callB24Method($_REQUEST['auth'], 'bizproc.event.send', array(
		"EVENT_TOKEN" => $workflowEvent["event_token"],
		"RETURN_VALUES" => array(
			'checkStatus' => $checkStatus
		),
		'LOG_MESSAGE' => 'Проверка завершена. Результат: '.($checkStatus=='Y'? 'одобрено' : 'отклонено')
	));

	$PDO->query('DELETE FROM bp_events WHERE ID = '.$workflowData['ID']);
	die;
}

  Установка и применение

Во время установки приложения обязательно установите разрешение приложению на работу с задачами, иначе оно работать не будет.

После установки действие отобразится в дизайнере бизнес-процессов в разделе Действия приложений и его можно будет размещать в шаблонах.

В настройках действия отобразятся созданные нами поля.

После того, как процесс будет запущен действие создаст задачу с заданным чек-листом.

Когда юрист завершит выполнение задачи, в логе бизнес-процесса будет отображено решение относительно одобрения контрагента.

Полностью ознакомиться с действием можно здесь.



Нам жаль это слышать… Но мы постараемся быть лучше!

Мы благодарны Вам за помощь в улучшении документации.

Спасибо, мы рады что смогли помочь Вам. Ниже Вы можете оставить свой отзыв или пожелание :)
Мы стараемся сделать документацию понятнее и доступнее,
и Ваше мнение важно для нас
Курсы разработаны в компании «1С-Битрикс»