Без лишних слов, вот так:
// Подписываемся на событие через современный механизм
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandlerCompatible("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");
function OnTaskUpdateHandler($taskId, $editedFields, $originalFields)
{
// Если статус не меняется, ничего делать не нужно
if ( !array_key_exists('STATUS', $editedFields) )
{
return true;
}
// Если статус меняется НЕ в состояние completed - ничего делать не нужно
if ( intval($editedFields["STATUS"]) != \Bitrix\Tasks\Internals\Task\Status::COMPLETED )
{
return true;
}
// Если вы меняете что-то другое, например название завершенной задачи, а статус просто летит за компанию, то делать ничего не нужно
if ( $editedFields["STATUS"] == $editedFields["originalFields"] )
{
return true;
}
// Наш обработчик не имеет смысла, если модуль "Веб-мессенджер" не подключен
if (!\Bitrix\Main\Loader::includeModule('im'))
{
return true;
}
/**
* Посмотреть поля можно через этот метод.
* Они будут в той же директории где и текущий файл, в файле log.log
*/
//\Bitrix\Main\Diag\Debug::dumpToFile(
// [
// '$taskId' => $taskId,
// '$arFields' => $arFields,
// '$eventTaskData' => $eventTaskData
// ],
// date('d.m.Y H:i:s'),
// str_replace($_SERVER['DOCUMENT_ROOT'], '', __DIR__.'/log.log')
//);
$notificationParams = [
"TO_USER_ID" => $originalFields["CREATED_BY"],
"FROM_USER_ID" => $originalFields["CREATED_BY"],
"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
"NOTIFY_MODULE" => 'tasks',
"NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.",
];
\CIMNotify::Add($notificationParams);
}