Не могу понять, почему код не работает, хотя статусы у меня совпадают. Можете ли помочь? Вот код: <br/> <br/> <pre><code>AddEventHandler("tasks", "OnTaskUpdate", "OnTaskUpdateHandler"); function OnTaskUpdateHandler($taskId, $arFields) { $taskData = CTaskItem::getInstance($taskId, 1); $taskStatus = $taskData->data["STATUS"]; if ($taskStatus == 5) { // Проверяем, что статус задачи равен "Закрыто" $taskCreatedBy = $taskData->data["CREATED_BY"]; // Получаем ID постановщика задачи $notificationParams = array( "TO_USER_ID" => $taskCreatedBy, // Постановщик задачи "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "tasks", "NOTIFY_EVENT" => "task_update", "NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.", ); CIMNotify::Add($notificationParams); // Отправляем уведомление } }</code></pre>
Давайте посмотрим на ваш код и попробуем понять, почему он может не работать. 1. **Проверка статуса**: Вы проверяете, равен ли статус задачи `5`, что, как вы отметили, соответствует статусу "Закрыто". Убедитесь, что действительно статус "Закрыто" имеет значение `5`. Иногда статусы могут быть определены через константы или перечисления. 2. **Правильность обработки события**: Убедитесь, что ваше событие `OnTaskUpdate` обрабатывается корректно и вызывается. Возможно, стоит добавить логирование в начале вашей функции, чтобы убедиться, что она срабатывает. 3. **Получение данных о задаче**: Убедитесь, что вы получаете корректные данные о задаче через `CTaskItem::getInstance($taskId, 1)`. Возможно, у вас нет нужных прав доступа или задача была удалена/изменена между обработкой события. 4. **Параметры уведомления**: Убедитесь, что параметры уведомления передаются правильно. Используйте `CIMNotify::Add($notificationParams)` только если у вас есть такой метод и он доступен. 5. **Отсутствие ошибок**: Проверьте, нет ли ошибок в журнале или консоли (если у вас есть доступ к ней). Иногда ошибки могут давать подсказки, что идет не так. Попробуйте следующий улучшенный код с добавлением логирования: ```php AddEventHandler("tasks", "OnTaskUpdate", "OnTaskUpdateHandler"); function OnTaskUpdateHandler($taskId, $arFields) { $taskData = CTaskItem::getInstance($taskId, 1); if (!$taskData) { // Логируем, если задача не найдена error_log("Задача с ID $taskId не найдена."); return; } $taskStatus = $taskData->data["STATUS"]; // Логируем статус задачи error_log("Статус задачи $taskId: $taskStatus"); if ($taskStatus == 5) { // Проверяем, что статус задачи равен "Закрыто" $taskCreatedBy = $taskData->data["CREATED_BY"]; // Получаем ID постановщика задачи // Логируем ID создателя задачи error_log("Постановщик задачи $taskId: $taskCreatedBy"); $notificationParams = array( "TO_USER_ID" => $taskCreatedBy, // Постановщик задачи "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "tasks", "NOTIFY_EVENT" => "task_update", "NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.", ); if (CIMNotify::Add($notificationParams)) { error_log("Уведомление отправлено для задачи $taskId."); } else { error_log("Не удалось отправить уведомление для задачи $taskId."); } } } ``` Этот код добавляет несколько логов, которые могут помочь вам понять, на каком этапе происходит проблема. Вы можете проверить вывод логов, чтобы увидеть, работает ли ваш обработчик событий и какие значения он получает.
Без лишних слов, вот так:
// Подписываемся на событие через современный механизм $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); }