Настройка браузерных уведомлений 1С-Битрикс
Push-уведомления в браузере перестают работать в трёх типичных сценариях: сервер не отдаёт VAPID-ключи, воркер регистрируется с неверным scope, или подписка молча теряется при смене HTTPS-сертификата. В каждом из этих случаев пользователь просто не получает уведомления — без ошибок на фронте.
Как устроена подписка в Битриксе
Модуль push.sender реализует Web Push через стандарт VAPID. При первом заходе на сайт браузер регистрирует Service Worker из файла /bitrix/js/push-sender/sw/push-worker.js. Этот воркер подписывается на push-endpoint браузера (Google FCM, Mozilla Autopush или собственный для Safari). Полученный объект подписки (PushSubscription) сохраняется через AJAX-вызов к BX.PushServer.subscribe(), который записывает данные в таблицу b_push_sender_subscription.
Серверная часть хранит ключи VAPID в настройках модуля — таблица b_option, параметры push_server_public_key и push_server_private_key. При отправке уведомления используется метод \Bitrix\PushSender\Model\Subscription::send(), который обращается к классу \Bitrix\Main\Web\HttpClient для POST-запроса к push-endpoint.
Проблема со scope и путём воркера
Самая частая ошибка — Service Worker регистрируется с неправильным scope. Это происходит когда Битрикс установлен в подпапку, или когда в nginx стоит нестандартный alias. Воркер из /bitrix/js/... не может управлять страницами на /shop/, потому что scope по умолчанию равен директории, из которой загружен файл воркера.
Решение — явная передача параметра scope при регистрации. В файле /bitrix/js/push-sender/push-sender.js вызов navigator.serviceWorker.register() должен содержать:
navigator.serviceWorker.register('/bitrix/js/push-sender/sw/push-worker.js', {
scope: '/'
});
Если файл воркера находится в /bitrix/, а scope нужен на /, сервер обязан отдавать заголовок Service-Worker-Allowed: / для этого JS-файла. В nginx это добавляется через add_header для location с путём к воркеру.
VAPID-ключи и их пересоздание
При смене домена или перемиграции сайта старые VAPID-ключи в b_option остаются, но все существующие подписки в b_push_sender_subscription становятся невалидными — браузер их отклоняет с 410 Gone. Битрикс не очищает таблицу автоматически.
Правильная процедура пересоздания ключей:
// Генерация новой пары VAPID
$keys = \Bitrix\PushSender\Security\VapidKey::generateKeyPair();
\Bitrix\Main\Config\Option::set('push.sender', 'push_server_public_key', $keys['publicKey']);
\Bitrix\Main\Config\Option::set('push.sender', 'push_server_private_key', $keys['privateKey']);
// Очистка устаревших подписок
\Bitrix\PushSender\Model\SubscriptionTable::deleteByFilter([]);
После этого все активные пользователи при следующем визите автоматически переподпишутся — браузер получит новый публичный ключ и создаст новую подписку.
Сегментация и отправка
Модуль поддерживает отправку по пользователям (USER_ID), по сессиям и широковещательно. Для программной отправки используется:
\Bitrix\PushSender\MessageSender::send(
\Bitrix\PushSender\MessageSender::TYPE_PUSH,
[
'USER_ID' => [15, 42],
'MESSAGE' => 'Ваш заказ отправлен',
'TITLE' => 'Обновление заказа',
'URL' => '/personal/orders/123/',
]
);
Метод send() итерирует подписки из b_push_sender_subscription по переданным USER_ID и ставит задачи в очередь агентов — таблица b_agent, агент \Bitrix\PushSender\Agent\SendMessageAgent.
Диагностика через логи
Для отладки включается лог в настройках модуля push.sender: параметр log_level в b_option. При значении debug все запросы к push-endpoints пишутся в /bitrix/modules/push.sender/logs/. Типичные коды ответов: 201 — доставлено, 404 — endpoint не существует, 410 — подписка удалена пользователем, 429 — rate limit на стороне FCM.
При массовых 410 нужно чистить b_push_sender_subscription через фильтр по дате последнего неудачного ответа — иначе агент будет вхолостую гонять устаревшие записи при каждом запуске.







