Здравствуйте, коллеги.
Проблема из шапки. При редактировании сущностей тоже тишина.
При создании/редактировании из интерфейса Б24 все нормально. Всем все приходит сразу.
Везде в начале подключаются модули соцсети, задач, crm, im:
Создаю сущности так:
либо так:
Задачи создаются, в интерфейсе отображаются нормально, но ни одного уведомления никому из участников нет.
Сделки:
Также создается нормально и без уведомлений.
Ядро не правилось, bitrixVM 7.5.2, модуль push-pull работает нормально, проверка системы ошибок не показывает. В логах ничего необычного.
Кто сталкивался? Подскажите, куда копать?
UPD
Низкоуровневый метод CTaskNotifications::sendMessageEx из ядра, который отвечает непосредственно за отправку и вызывается в методах выше, возвращает true, при программном вызове.
Однако, это true может быть возвращено в том числе при постановке в очередь фоновых заданий на отправку с помощью Bitrix\Tasks\Internals\Notification\Event\EventHandler::addEvent когда нет параметра IS_ON_BACKGROUND_JOB. В цепочке используемых вызовов обновления/создания сущностей этот параметр не задается.
В итоге, если задать параметр IS_ON_BACKGROUND_JOB при вызове CTaskNotifications::sendMessageEx, то уведомления таки приходят.
Что не так с отправкой через Bitrix\Tasks\Internals\Notification\Event\EventHandler::addEvent?
Ведь при редактировании сущностей из интерфейса, этот метод вызывается так же без параметра IS_ON_BACKGROUND_JOB и уведомление уходит таким же путем, но доставляется...
Проблема из шапки. При редактировании сущностей тоже тишина.
При создании/редактировании из интерфейса Б24 все нормально. Всем все приходит сразу.
Везде в начале подключаются модули соцсети, задач, crm, im:
| Код |
|---|
\Bitrix\Main\Loader::includeModule('crm');
\Bitrix\Main\Loader::includeModule('tasks');
\Bitrix\Main\Loader::includeModule('socialnetwork');
\Bitrix\Main\Loader::includeModule('im');
$taskFields = [
'TITLE' => "Тестирование уведомлений",
'CREATED_BY' => 1,
'RESPONSIBLE_ID' => 19,
'GROUP_ID' => 21,
];
|
Создаю сущности так:
| Код |
|---|
$obTask = new CTasks; $task_ID = $obTask->Add($taskFields); |
либо так:
| Код |
|---|
$task = CTaskItem::add($taskFields, 1); |
Задачи создаются, в интерфейсе отображаются нормально, но ни одного уведомления никому из участников нет.
Сделки:
| Код |
|---|
$arFields = [ 'STAGE_ID' => 'NEW', 'CATEGORY_ID' => 1, 'OPENED' => 'Y', 'TYPE_ID' => 'SALE', 'ASSIGNED_BY_ID' => 1, 'COMPANY_ID' => 177, ]; $newDeal = new CCrmDeal(false); $newDealId = $newDeal->Add($arFields, true, ['REGISTER_SONET_EVENT' => 'Y', 'CURRENT_USER' => 1]); |
Также создается нормально и без уведомлений.
Ядро не правилось, bitrixVM 7.5.2, модуль push-pull работает нормально, проверка системы ошибок не показывает. В логах ничего необычного.
Кто сталкивался? Подскажите, куда копать?
UPD
Низкоуровневый метод CTaskNotifications::sendMessageEx из ядра, который отвечает непосредственно за отправку и вызывается в методах выше, возвращает true, при программном вызове.
Однако, это true может быть возвращено в том числе при постановке в очередь фоновых заданий на отправку с помощью Bitrix\Tasks\Internals\Notification\Event\EventHandler::addEvent когда нет параметра IS_ON_BACKGROUND_JOB. В цепочке используемых вызовов обновления/создания сущностей этот параметр не задается.
| Код |
|---|
public static function sendMessageEx( $taskId,
$fromUser,
array $toUsers,
array $messages = [],
array $parameters = []
): bool
{
if (!isset($parameters['IS_ON_BACKGROUND_JOB']) || $parameters['IS_ON_BACKGROUND_JOB'] === 'Y')
{
Bitrix\Tasks\Internals\Notification\Event\EventHandler::addEvent(
'message',
[
'TASK_ID' => $taskId,
'FROM_USER' => $fromUser,
'TO_USERS' => $toUsers,
'MESSAGES' => $messages,
'PARAMETERS' => $parameters,
]
);
return true;
}
if (!IsModuleInstalled('im') || !CModule::IncludeModule('im'))
{
return false;
}
if (!$fromUser || (string)$messages['INSTANT'] === '')
{
return false;
}
if (
!isset($parameters['EXCLUDE_USERS_WITH_MUTE'])
|| (isset($parameters['EXCLUDE_USERS_WITH_MUTE']) && $parameters['EXCLUDE_USERS_WITH_MUTE'] === 'Y')
)
{
$toUsers = static::excludeUsersWithMute($toUsers, $taskId);
}
unset($parameters['EXCLUDE_USERS_WITH_MUTE']);
if (empty($toUsers))
{
return false;
}
$entityCode = 'TASK';
if ((string)$parameters['ENTITY_CODE'] !== '')
{
$entityCode = $parameters['ENTITY_CODE'];
unset($parameters['ENTITY_CODE']);
}
// $allowNotCommentNotifications = false;
// if (
// isset($parameters['ENTITY_OPERATION']) &&
// $parameters['ENTITY_OPERATION'] == 'ADD' &&
// $entityCode == 'TASK'
// )
// {
// $allowNotCommentNotifications = true;
// }
//
// // disable all non comments notifications
// if (!$allowNotCommentNotifications && $entityCode !== 'COMMENT')
// {
// return false;
// }
if (!isset($messages['EMAIL']))
{
$messages['EMAIL'] = $messages['INSTANT'];
}
$eventData = $parameters['EVENT_DATA'];
$notifyEvent = $parameters['NOTIFY_EVENT'];
$callbacks = $parameters['CALLBACK'];
unset($parameters['EVENT_DATA'], $parameters['NOTIFY_EVENT'], $parameters['CALLBACK']);
$notifyType = null;
if (array_key_exists('NOTIFY_TYPE', $parameters))
{
$notifyType = $parameters['NOTIFY_TYPE'];
unset($parameters['NOTIFY_TYPE']);
}
$pushParams = null;
if (array_key_exists('PUSH_PARAMS', $parameters))
{
$pushParams = $parameters['PUSH_PARAMS'];
unset($parameters['PUSH_PARAMS']);
}
$entityOperation = 'ADD';
if ((string)$parameters['ENTITY_OPERATION'] !== '')
{
$entityOperation = $parameters['ENTITY_OPERATION'];
unset($parameters['ENTITY_OPERATION']);
}
$params = [
'FROM_USER_ID' => $fromUser,
'TO_USER_IDS' => $toUsers,
'TASK_ID' => (int)$taskId,
'MESSAGE' => $messages,
'EVENT_DATA' => $eventData,
'NOTIFY_EVENT' => $notifyEvent,
'ENTITY_CODE' => $entityCode,
'ENTITY_OPERATION' => $entityOperation,
'CALLBACK' => $callbacks,
'ADDITIONAL_DATA' => $parameters,
];
if ($notifyType)
{
$params['NOTIFY_TYPE'] = $notifyType;
}
if ($pushParams)
{
$params['PUSH_PARAMS'] = $pushParams;
}
self::addToNotificationBuffer($params);
if (!self::$bufferize)
{
self::flushNotificationBuffer(false);
}
return true;
} |
В итоге, если задать параметр IS_ON_BACKGROUND_JOB при вызове CTaskNotifications::sendMessageEx, то уведомления таки приходят.
Что не так с отправкой через Bitrix\Tasks\Internals\Notification\Event\EventHandler::addEvent?
Ведь при редактировании сущностей из интерфейса, этот метод вызывается так же без параметра IS_ON_BACKGROUND_JOB и уведомление уходит таким же путем, но доставляется...