Разработка модуля уведомлений 1С-Битрикс
Стандартный механизм \Bitrix\Main\Mail\Event::send() покрывает базовые сценарии: письмо после регистрации, подтверждение заказа. Но как только бизнес хочет push-уведомления, Telegram, WhatsApp, SMS — и всё это с единым журналом доставки, статусами и ретраями — штатный инструмент заканчивается. Каждый новый канал подключается по-разному, логи разбросаны, тестировать сложно.
Архитектура модуля
Модуль vendor.notifications строится на концепции канала (channel) и события (event). Событие — это то, что произошло в системе. Канал — способ доставки. Одно событие может рассылаться через несколько каналов одновременно.
Таблицы ORM:
-
b_vendor_notif_event— типы событий: id, code, name, description, default_channels (JSON), is_active -
b_vendor_notif_template— шаблоны сообщений: id, event_code, channel, subject, body, body_html, lang, variables_schema -
b_vendor_notif_queue— очередь отправки: id, event_code, channel, recipient, payload (JSON), status (pending/sent/failed), attempts, created_at, sent_at, error -
b_vendor_notif_subscription— подписки пользователей: id, user_id, event_code, channel, is_active
Каналы доставки
Каждый канал реализует интерфейс ChannelInterface:
interface ChannelInterface
{
public function getName(): string;
public function send(Notification $notification): SendResult;
public function supports(string $recipient): bool;
}
Реализации:
-
EmailChannel — через
\Bitrix\Main\Mail\Mail::send()с собственными SMTP-настройками или через PHPMailer - SmsChannel — адаптеры под разных провайдеров (SMS.ru, SMSC, Twilio): унифицированный интерфейс, провайдер — параметр конфигурации
-
TelegramChannel — Telegram Bot API, метод
sendMessage, поддержка Markdown и inline-кнопок -
PushChannel — веб-push через Web Push Protocol (библиотека
web-push-php), подписки хранятся вb_vendor_notif_push_subscription -
InternalChannel — внутренние уведомления в личном кабинете, хранятся в
b_vendor_notif_inbox, отображаются на сайте через AJAX
Диспетчер событий
Отправка уведомления из кода — одна строка:
\Vendor\Notifications\Dispatcher::dispatch('order_paid', [
'user_id' => $userId,
'order_id' => $orderId,
'order_sum' => $order->getPrice(),
'order_number' => $order->getField('ACCOUNT_NUMBER'),
]);
Диспетчер сам определяет, через какие каналы отправлять (по настройкам события), формирует сообщения из шаблонов, подставляет переменные и кладёт задачи в b_vendor_notif_queue.
Асинхронная отправка и ретраи
Немедленная отправка в момент события — плохая практика: HTTP-запрос к Telegram может зависнуть, блокируя сохранение заказа. Очередь обрабатывается агентом Битрикс:
// В инсталляторе модуля
\CAgent::AddAgent(
'\Vendor\Notifications\QueueProcessor::run();',
'vendor.notifications',
'N',
60, // каждые 60 секунд
);
public static function run(): string
{
$items = NotifQueueTable::getList([
'filter' => ['STATUS' => 'pending', '<=ATTEMPTS' => 3],
'limit' => 50,
'order' => ['CREATED_AT' => 'ASC'],
])->fetchAll();
foreach ($items as $item) {
$channel = ChannelRegistry::get($item['CHANNEL']);
$result = $channel->send(Notification::fromQueue($item));
if ($result->isSuccess()) {
NotifQueueTable::update($item['ID'], ['STATUS' => 'sent', 'SENT_AT' => new DateTime()]);
} else {
NotifQueueTable::update($item['ID'], [
'ATTEMPTS' => $item['ATTEMPTS'] + 1,
'STATUS' => $item['ATTEMPTS'] >= 3 ? 'failed' : 'pending',
'ERROR' => $result->getError(),
]);
}
}
return '\Vendor\Notifications\QueueProcessor::run();';
}
После 3 неудачных попыток задача переводится в статус failed и попадает в дашборд для ручного разбора.
Управление подписками пользователя
В личном кабинете пользователь видит список доступных событий и может отключить отдельные каналы. Настройки хранятся в b_vendor_notif_subscription. Диспетчер перед постановкой в очередь проверяет, не отписан ли пользователь от данного типа уведомлений на данном канале.
Шаблонизация
Тело сообщения формируется через Twig. Переменные передаются из payload события. В шаблонах доступны фильтры: |price — форматирование суммы, |date — локализованная дата. HTML-письма поддерживают inline-стили через Emogrifier.
Административный интерфейс
- Список событий с настройкой каналов по умолчанию
- Редактор шаблонов с предпросмотром (подстановка тестовых переменных)
- Журнал отправки с фильтрацией по статусу, каналу, дате, получателю
- Статистика доставляемости по каналам
- Тестовая отправка уведомления на указанный адрес
Сроки разработки
| Этап | Срок |
|---|---|
| Архитектура, ORM-таблицы, интерфейсы каналов | 2 дня |
| Email и SMS каналы | 2 дня |
| Telegram и Push каналы | 2 дня |
| Внутренние уведомления (inbox) | 1 день |
| Диспетчер, очередь, агент ретраев | 2 дня |
| Управление подписками пользователя | 1 день |
| Шаблонизатор (Twig + Emogrifier) | 1 день |
| Административный интерфейс + журнал | 2 дня |
| Тестирование | 1 день |
Итого: 14 рабочих дней. Подключение дополнительных каналов (Viber, VK, WhatsApp Business API) — по 1–2 дня на канал.







