Как отследить событие добавления комментария в чат задачи в Bitrix24?

Не могу поймать событие добавления комментария в чате задачи — ни один из обработчиков не срабатывает. Использую такой код: <pre><code>$eventManager-&gt;addEventHandler('tasks', 'OnAfterCommentAdd', function($eventType, $eventId, $arFields) {
  • 30 марта 2026 г. 13:01
Ответы на вопрос 3
Коротко — причина в том, что «комментарии в чате задачи» могут храниться и обрабатываться разными модулями/механизмами в Bitrix(24): forum, socialnetwork (лента/соц. лог), im (новый чат в задачах) или старый tasks-комментарий. Поэтому обработчик OnAfterCommentAdd из модуля tasks может просто не срабатывать — потому что комментарий пришёл не через модуль tasks.

Что сделать — порядок действий и варианты решений.

1) Уточните тип установки
- Bitrix24 Cloud (saas) — PHP-обработчики нельзя вешать, нужно использовать REST-уведомления/webhooks/placement или события IM через REST.
- Самостоятельный (on‑premise) — можно вешать PHP-обработчики в init.php / через EventManager.

2) Выясните, в каком модуле сохраняется комментарий
Добавьте тест‑комментарий и посмотрите, куда пошли строки в БД: проверьте последние записи в таблицах
- b_tasks_comment,
- b_forum_message,
- b_sonet_log_comment / b_sonet_log,
- b_im_message

Это однозначно покажет, откуда нужно ловить событие.

3) Варианты обработчиков (самостоятельный сервер)

a) Если комментарии через социальную ленту (socialnetwork)
(самый частый случай для «комментариев в задаче» — запись в лог соцсети)
Пример в init.php:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('socialnetwork', 'OnAfterSocNetLogCommentAdd', 'MyOnAfterSocNetLogCommentAdd');

function MyOnAfterSocNetLogCommentAdd($commentId, $arFields)
{
    // Получаем комментарий
    $comment = CSocNetLogComments::GetByID($commentId);
    if (!$comment) return;

    // Получаем запись ленты
    $log = CSocNetLog::GetByID($comment['LOG_ID']);
    if (!$log) return;

    // Фильтруем по сущности — задача
    if (strtoupper($log['ENTITY_TYPE']) === 'TASK' || $log['ENTITY_TYPE'] === 'tasks')
    {
        $taskId = (int)$log['ENTITY_ID'];
        // Делаем нужную логику
    }
}

b) Если комментарии через форум (forum)
Обработчик для форума сообщений (названия событий различаются по версии, но общий пример):

$eventManager->addEventHandler('forum', 'onAfterMessageAdd', 'OnAfterForumMessageAdd');

function OnAfterForumMessageAdd($messageId, $arFields)
{
    // Проверить, что сообщение связано с задачей (например, $arFields['PARAMS'] или ENTITY_TYPE)
    // и выполнить логику
}

c) Если это новый «чат» (IM) внутри задачи
Тогда комментарий — это сообщение IM (таблица b_im_message). Для on‑prem можно ловить события модуля im (название события зависит от версии, в документации ищите события модуля im). В cloud такое можно ловить через REST событие im.message.add (webhook / app).

4) Если вы используете Bitrix24 Cloud
Вы не можете вешать PHP‑обработчики. Решения:
- Используйте REST‑событие/вебхук (например, события IM или socialnetwork через REST if available).
- Сделайте приложение (Webhook/REST subscription) и подпишитесь на нужное событие (im.message.add, tasks.comment.add — смотрите список REST-событий в вашей версии).

5) Диагностика, если текущий код не срабатывает
- Проверьте, что init.php действительно подключается и код выполняется (вставьте простую запись в лог/file).
- Убедитесь, что вы вешаете обработчик на правильный модуль и событие (см. выше).
- Посмотрите, где данные реально сохраняются (DB) и в ответе REST/JS смотрите payload.

Если хотите, помогу точнее — скажите:
- Bitrix24 Cloud или On‑Premise?
- Какая запись появляется в БД при добавлении комментария (в какую таблицу)?
- Приведите пример того, как вы добавляете комментарий (через UI, REST, API?). Тогда дам конкретный код обработчика.
После выхода "Задач 2.0" комментарии были упразднены в пользу чата, поэтому отдельного события на добавление комментария к задаче больше нет и вместо этого следует подписываться на события чата и определять к какому чату идет сообщение. <br/> <br/> <pre><code class="php">$eventManager-&gt;addEventHandlerCompatible(
	"im",
	"OnAfterMessagesAdd",
	function($messageId, $messageFields) {
		if (
			!array_key_exists("CHAT_ENTITY_TYPE", $messageFields)
			|| $messageFields["CHAT_ENTITY_TYPE"] != "TASKS_TASK"
		) {
			return;
		}

		// Task id = $messageFields['CHAT_ENTITY_ID']

		return;
	}
);</code></pre>
Судя по комментариям в коде модулей, есть вариант, что оно попросту не вызывается: <br/> <pre><code class="php">if (
    !$aux // create task from livefeed
    || $auxData &lt;&gt; '' // tasks commentposter, add to livefeed
)
{
    $event = new Event("forum", "OnAfterCommentAdd", array(
            $this-&gt;getEntity()-&gt;getType(),
            $this-&gt;getEntity()-&gt;getId(),
            array(
                "TOPIC_ID" =&gt; $this-&gt;topic["ID"],
                "MESSAGE_ID" =&gt; $mid,
                "PARAMS" =&gt; $params,
                "MESSAGE" =&gt; $this-&gt;getComment(),
                "AUX_DATA" =&gt; $auxData
            ))
    );
    $event-&gt;send();
}</code></pre> <br/> Вроде как в Живую ленту прикрутили свой, новый API форума. Есть грубый метод: прикрутить отладочный лог в функцию GetModuleEvents() и в метод send() класса Event. И посмотреть
Похожие вопросы