Розробка модуля повідомлень 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка модуля повідомлень 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка модуля сповіщень 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 дні на канал.