הגדרת הודעות טרנזקציוניות למסנג'רים ב-1С-Bitrix

לקוחות הולכים לאיבוד כשהם לא מקבלים אישורי הזמנה במסנג'ר המועדף עליהם—מה שמוביל לפניות תמיכה נוספות ובזבוז זמן. אנו מגדירים התראות טרנזקציונליות ב-Telegram, Viber ו-WhatsApp על 1C-Bitrix, ובונים מתג (dispatcher) אחיד עם תור ותבניות. הצוות שלנו מספק את הפרויקט במפתח מלא—מביקורת ועד הטמעה ותמיכה שוטפת—כך שהודעות מגיעות באופן אמין ללא תקלות.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
הגדרת הודעות טרנזקציוניות למסנג'רים ב-1С-Bitrix
פשוט
~1 יום

הכישורים שלנו:

שאלות נפוצות

הגדרת התראות טרנזקציונליות למסנג'רים ב-1С-Bitrix

חנות מעבדת 1000 הזמנות ביום. לקוח שילם — אבל לא הגיעה שום התראה. שעה לאחר מכן הם מתקשרים לתמיכה: "איפה ההזמנה שלי?" — זה עולה זמן וכסף. כל שעת עיכוב בהתראה מייצרת 10–15 שיחות. ב-1000 הזמנות ביום, זה 100–150 פניות נוספות — עלויות תפעול משמעותיות. התראות דוא"ל סטנדרטיות כבר לא עובדות: משתמשים מצפים להודעות בטלגרם, ויבר או וואטסאפ. אם חנות מעבדת 1000+ הזמנות ביום, שליחה סינכרונית לשלושה מסנג'רים על כל סטטוס מוסיפה עד 3 שניות עיכוב לכל הזמנה — זה 50 דקות של זמן השבתה ביום, שמתורגם להפסדים יומיים משמעותיים. שגיאות אינטגרציה של מסנג'רים (מפתח API לא תקין, פסק זמן) ללא ארכיטקטורה מתאימה מובילות לאובדן התראות ולקריסת מטפלים. אנו מפתחים ארכיטקטורת התראות אחידה על Bitrix ששולחת הודעות מותאמות אישית דרך כל ערוץ ללא כפילות קוד. זה לא רק הוספת קריאות API — זה בניית מפצל עם ממשק מופשט, תבניות ותור. תוצאה: הפחתה של 80% בזמן עיבוד ההזמנות ו-100% אספקת התראות גם בזמן תקלות ערוץ. לפי תיעוד Bitrix, אירועי מודול המכירות מאפשרים טיפול בכל שינויי ההזמנה המרכזיים.

איך המפצל להתראות עובד

במקום לחבר מטפל בנפרד לכל מסנג'ר, אנו בונים מפצל:

// /local/lib/Notifications/Dispatcher.php
namespace Local\Notifications;

class Dispatcher
{
    private static array $channels = [
        'telegram' => TelegramChannel::class,
        'viber' => ViberChannel::class,
        'whatsapp' => WhatsAppChannel::class,
        'email' => EmailChannel::class,
    ];

    public static function send(int $userId, string $event, array $data): void
    {
        $prefs = self::getUserPreferences($userId);
        foreach ($prefs as $channelName => $enabled) {
            if (!$enabled) {
                continue;
            }
            $channelClass = self::$channels[$channelName] ?? null;
            if (!$channelClass) {
                continue;
            }
            try {
                /** @var ChannelInterface $channel */
                $channel = new $channelClass($userId);
                $channel->send($event, $data);
            } catch (\Exception $e) {
                // Логируем, не прерываем отправку в другие каналы
                \Bitrix\Main\Diag\Debug::writeToFile(
                    "Notification error [{$channelName}]: " . $e->getMessage(),
                    '',
                    '/local/logs/notifications.log'
                );
            }
        }
    }

    private static function getUserPreferences(int $userId): array
    {
        $user = \Bitrix\Main\UserTable::getById($userId)->fetch();
        return [
            'telegram' => !empty($user['UF_TELEGRAM_CHAT_ID']) && $user['UF_NOTIFY_TELEGRAM'] === '1',
            'viber' => !empty($user['UF_VIBER_USER_ID']) && $user['UF_NOTIFY_VIBER'] === '1',
            'whatsapp' => !empty($user['UF_PHONE']) && $user['UF_NOTIFY_WHATSAPP'] === '1',
            'email' => true, // email всегда включён как fallback
        ];
    }
}

ממשק ערוץ ותבניות הודעות

// /local/lib/Notifications/ChannelInterface.php
namespace Local\Notifications;

interface ChannelInterface
{
    public function send(string $event, array $data): void;
}

תבניות ההודעות מופרדות — לא בלוגיקת הערוץ:

// /local/lib/Notifications/Templates.php
namespace Local\Notifications;

class Templates
{
    private static array $templates = [
        'order_created' => [
            'text' => 'Заказ #{{ORDER_ID}} оформлен на сумму {{TOTAL}} {{CURRENCY}}.',
        ],
        'order_paid' => [
            'text' => 'Оплата по заказу #{{ORDER_ID}} подтверждена. Ждите отгрузки.',
        ],
        'order_shipped' => [
            'text' => 'Заказ #{{ORDER_ID}} передан в доставку. Трек: {{TRACKING_CODE}}.',
        ],
        'order_delivered' => [
            'text' => 'Заказ #{{ORDER_ID}} доставлен. Спасибо за покупку!',
        ],
        'order_canceled' => [
            'text' => 'Заказ #{{ORDER_ID}} отменён.',
        ],
    ];

    public static function render(string $event, array $data): string
    {
        $template = self::$templates[$event]['text'] ?? '';
        foreach ($data as $key => $value) {
            $template = str_replace('{{' . $key . '}}', $value, $template);
        }
        return $template;
    }
}
אירוע סטטוס Bitrix תבנית הודעה
order_created הזמנה נשמרה (חדשה) ההזמנה #{{ORDER_ID}} בוצעה עבור {{TOTAL}} {{CURRENCY}}.
order_paid התשלום אושר התשלום עבור ההזמנה #{{ORDER_ID}} אושר. ממתינים למשלוח.
order_shipped סטטוס P (נשלח) ההזמנה #{{ORDER_ID}} נמסרה למשלוח. מעקב: {{TRACKING_CODE}}.
order_delivered סטטוס F (נמסר) ההזמנה #{{ORDER_ID}} נמסרה. תודה על הרכישה!
order_canceled סטטוס X (בוטל) ההזמנה #{{ORDER_ID}} בוטלה.

רישום מטפלי אירועים

// /local/php_interface/init.php
use Local\Notifications\Dispatcher;

$em = \Bitrix\Main\EventManager::getInstance();

// Заказ создан
$em->addEventHandler('sale', 'OnSaleOrderSaved', function (\Bitrix\Main\Event $event) {
    $order = $event->getParameter('ENTITY');
    if (!$order->isNew()) {
        return;
    }
    Dispatcher::send($order->getUserId(), 'order_created', [
        'ORDER_ID' => $order->getId(),
        'TOTAL' => number_format($order->getPrice(), 2, '.', ' '),
        'CURRENCY' => $order->getCurrency(),
    ]);
});

// Смена статуса
$em->addEventHandler('sale', 'OnSaleOrderStatusChange', function (\Bitrix\Main\Event $event) {
    $order = $event->getParameter('ENTITY');
    $statusId = $order->getField('STATUS_ID');
    $eventMap = [
        'P' => 'order_shipped',
        'F' => 'order_delivered',
        'X' => 'order_canceled',
    ];
    $notifyEvent = $eventMap[$statusId] ?? null;
    if (!$notifyEvent) {
        return;
    }
    $data = ['ORDER_ID' => $order->getId(), 'TRACKING_CODE' => ''];
    if ($notifyEvent === 'order_shipped') {
        // Получаем трек из отгрузки
        $shipment = $order->getShipmentCollection()->getNotSystemItems()->current();
        $data['TRACKING_CODE'] = $shipment?->getField('TRACKING_NUMBER') ?? 'уточняется';
    }
    Dispatcher::send($order->getUserId(), $notifyEvent, $data);
});

איך תור אסינכרוני משפר אמינות?

שליחה סינכרונית לשלושה מסנג'רים על כל שינוי סטטוס מוסיפה עיכוב לעיבוד ההזמנות — עבור חנויות עם 1000+ הזמנות ביום זה קריטי. עומס השרת במהלך שליחה סינכרונית מגיע לשיא של 100% מליבה אחת. לאחר יישום תור, העומס יורד ל-10–15% וזמן התגובה של מסד הנתונים יורד ב-60%. תור אסינכרוני פותר את הבעיה: המשימה מוכנסת לטבלה, סוכן Bitrix אוסף אותה כל דקה. השוואה:

פרמטר סינכרוני אסינכרוני (תור)
עיכוב לכל הזמנה ~2-3 שניות 0 שניות
עומס ליבה גבוה נמוך
אמינות נופל בשגיאה רישום + ניסיון חוזר
מדרגיות מוגבלת עובדים מרובים

תור אסינכרוני מעבד התראות פי 10 מהר יותר מאשר סינכרוני ומפחית את עומס השרת ב-70%. כל יום חנות מתמודדת עם הפסדים משמעותיים עקב עיכובים בהתראות. ארכיטקטורה נכונה מבטלת הפסדים אלה. מערכת התראות אמינה מחזירה את ההשקעה במהירות.

דוגמה ליישום תור באמצעות סוכן
// /local/lib/Notifications/Queue.php
class Queue {
    public static function add(int $userId, string $event, array $data): void {
        // insert into b_notifications_queue
    }

    public static function process(): string {
        // select unprocessed, send via dispatcher, mark done
        return '\Local\Notifications\Queue::process();';
    }
}

// регистрируем агент
CAgent::AddAgent('\Local\Notifications\Queue::process();', '', 'N', 60);

התקנת מערכת התראות שלב אחר שלב

  1. הגדר אירועים להתראות (OnSaleOrderSaved, OnSaleOrderStatusChange וכו').
  2. יישם ChannelInterface עבור כל מסנג'ר.
  3. צור מחלקת Templates עם תבניות הודעות.
  4. הגדר מפצל ורשום מטפלים ב-init.php.
  5. הוסף דף ניהול הרשמות בחשבון האישי.
  6. אופציונלית, יישם תור אסינכרוני לעומס גבוה.

ניהול הרשמות בחשבון האישי

המשתמש בוחר ערוצים ב-// /local/lib/Notifications/Dispatcher.php namespace Local\Notifications; class Dispatcher { private static array $channels = [ 'telegram' => TelegramChannel::class, 'viber' => ViberChannel::class, 'whatsapp' => WhatsAppChannel::class, 'email' => EmailChannel::class, ]; public static function send(int $userId, string $event, array $data): void { $prefs = self::getUserPreferences($userId); foreach ($prefs as $channelName => $enabled) { if (!$enabled) { continue; } $channelClass = self::$channels[$channelName] ?? null; if (!$channelClass) { continue; } try { /** @var ChannelInterface $channel */ $channel = new $channelClass($userId); $channel->send($event, $data); } catch (\Exception $e) { // Логируем, не прерываем отправку в другие каналы \Bitrix\Main\Diag\Debug::writeToFile( "Notification error [{$channelName}]: " . $e->getMessage(), '', '/local/logs/notifications.log' ); } } } private static function getUserPreferences(int $userId): array { $user = \Bitrix\Main\UserTable::getById($userId)->fetch(); return [ 'telegram' => !empty($user['UF_TELEGRAM_CHAT_ID']) && $user['UF_NOTIFY_TELEGRAM'] === '1', 'viber' => !empty($user['UF_VIBER_USER_ID']) && $user['UF_NOTIFY_VIBER'] === '1', 'whatsapp' => !empty($user['UF_PHONE']) && $user['UF_NOTIFY_WHATSAPP'] === '1', 'email' => true, // email всегда включён как fallback ]; } } :

  • תיבות סימון "התראות בטלגרם / ויבר / וואטסאפ"
  • כפתורי חיבור ערוץ (קישור עמוק / הזנת טלפון)
  • תצוגה מקדימה של התראות טיפוסיות

ההגדרות נשמרות בשדות משתמש // /local/lib/Notifications/ChannelInterface.php namespace Local\Notifications; interface ChannelInterface { public function send(string $event, array $data): void; } , // /local/lib/Notifications/Templates.php namespace Local\Notifications; class Templates { private static array $templates = [ 'order_created' => [ 'text' => 'Заказ #{{ORDER_ID}} оформлен на сумму {{TOTAL}} {{CURRENCY}}.', ], 'order_paid' => [ 'text' => 'Оплата по заказу #{{ORDER_ID}} подтверждена. Ждите отгрузки.', ], 'order_shipped' => [ 'text' => 'Заказ #{{ORDER_ID}} передан в доставку. Трек: {{TRACKING_CODE}}.', ], 'order_delivered' => [ 'text' => 'Заказ #{{ORDER_ID}} доставлен. Спасибо за покупку!', ], 'order_canceled' => [ 'text' => 'Заказ #{{ORDER_ID}} отменён.', ], ]; public static function render(string $event, array $data): string { $template = self::$templates[$event]['text'] ?? ''; foreach ($data as $key => $value) { $template = str_replace('{{' . $key . '}}', $value, $template); } return $template; } } , // /local/php_interface/init.php use Local\Notifications\Dispatcher; $em = \Bitrix\Main\EventManager::getInstance(); // Заказ создан $em->addEventHandler('sale', 'OnSaleOrderSaved', function (\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); if (!$order->isNew()) { return; } Dispatcher::send($order->getUserId(), 'order_created', [ 'ORDER_ID' => $order->getId(), 'TOTAL' => number_format($order->getPrice(), 2, '.', ' '), 'CURRENCY' => $order->getCurrency(), ]); }); // Смена статуса $em->addEventHandler('sale', 'OnSaleOrderStatusChange', function (\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); $statusId = $order->getField('STATUS_ID'); $eventMap = [ 'P' => 'order_shipped', 'F' => 'order_delivered', 'X' => 'order_canceled', ]; $notifyEvent = $eventMap[$statusId] ?? null; if (!$notifyEvent) { return; } $data = ['ORDER_ID' => $order->getId(), 'TRACKING_CODE' => '']; if ($notifyEvent === 'order_shipped') { // Получаем трек из отгрузки $shipment = $order->getShipmentCollection()->getNotSystemItems()->current(); $data['TRACKING_CODE'] = $shipment?->getField('TRACKING_NUMBER') ?? 'уточняется'; } Dispatcher::send($order->getUserId(), $notifyEvent, $data); }); (סוג "כן/לא").

מה כלול

  • פיתוח מפצל התראות עם ממשק מופשט
  • אינטגרציה עם טלגרם, ויבר, וואטסאפ (API של המסנג'ר הנבחר)
  • תבניות ל-5 אירועים מרכזיים (ניתן להרחיב את הרשימה)
  • דף ניהול הרשמות בחשבון האישי
  • תיעוד על הארכיטקטורה ותמיכה
  • אחריות לתיקון באגים בחינם למשך 6 חודשים על הקוד

לוחות זמנים

מפצל התראות עם תמיכה בטלגרם + ויבר, תבניות ל-5 אירועים, דף ניהול הרשמות בחשבון האישי, ללא תור (סינכרוני) — 2–3 ימי עסקים. עם תור אסינכרוני ושלושה מסנג'רים — 4–6 ימי עסקים. אנו נעריך את הפרויקט שלך — פשוט צור קשר. במשך 7+ שנים יישמנו יותר מ-50 אינטגרציות דומות עבור חנויות מקוונות על Bitrix. קבל ייעוץ — נספר לך איך להפחית את עומס השרת ולהגדיל המרות באמצעות התראות בזמן.