Розробка модуля сповіщень 1С-Бітрікс
Стандартний механізм \Bitrix\Main\Mail\Event::send() покриває базові сценарії: лист після реєстрації, підтвердження замовлення. Але як тільки бізнес хоче push-сповіщення, Telegram, WhatsApp, SMS — і все це з єдиним журналом доставки, статусами та retry — штатний інструмент закінчується. Кожен новий канал підключається по-різному, логи розкидані, тестувати складно.
Архітектура модуля
Модуль 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.
Асинхронна відправка та retry
Негайна відправка в момент події — погана практика: 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 день |
| Диспетчер, черга, агент retry | 2 дні |
| Управління підписками користувача | 1 день |
| Шаблонізатор (Twig + Emogrifier) | 1 день |
| Адміністративний інтерфейс + журнал | 2 дні |
| Тестування | 1 день |
Разом: 14 робочих днів. Підключення додаткових каналів (Viber, VK, WhatsApp Business API) — по 1–2 дні на канал.







