אובדן הזמנות עקב התראות מאוחרות הוא כאב אופייני לחנויות מקוונות על Bitrix. לפי הסטטיסטיקה, עד 15% מהלקוחות נוטשים רכישה אם הם לא מקבלים אישור תוך 10 דקות. עובדים בודקים דוא"ל פעם בשעה, הזמנות חדשות תלויות, לקוחות עוזבים. פעם יישמנו ערוץ התראות לרשת חנויות עם 300 הזמנות ביום: זמן התגובה ירד מ-45 דקות ל-2 דקות, וההחזרות ירדו ב-22%. ערוץ התראות Telegram לצוות הוא הפתרון: ההתראות מגיעות מיידית, כולם רואים סטטוסים בזמן אמת. אבל היישום דורש התחשבות במאפיינים הספציפיים של ה-API של Bitrix ושל Telegram. אנו מפתחים ערוצים כאלה במפתח מלא.
ערוץ התראות Telegram להזמנות אינו זהה לבוט עם הודעות אישיות. הערוץ מיועד לצוות: מנהלים, מפעילי מחסן, שליחים מקבלים התראות על הזמנות חדשות, שינויי סטטוס ואירועים קריטיים בזרם משותף. הוא מהיר פי 3 מדוא"ל ואינו דורש מכל עובד לחבר בוט אישי. פיתוח ערוץ כזה הוא משימה ארכיטקטונית עם כמה ניואנסים לא מובנים מאליהם בצד של Bitrix.
באיזה פורמט התראות לבחור לצוות?
- בוט אישי — הודעות נשלחות ל-chat_id של משתמש ספציפי. דורש הסכמה, צריך לאחסן את ה-chat_id של כל עובד.
- ערוץ — הודעות מתפרסמות בערוץ, כל המנויים רואים אותן בו זמנית. הבוט חייב להתווסף לערוץ כמנהל עם זכות פרסום. ה-chat_id של הערוץ הוא סטטי, אינו משתנה.
- סופרגרופ — היברידי: עובדים יכולים להגיב, לדון בהזמנות, הבוט מפרסם אירועים. מועדף על פני ערוץ לצוות.
להתראות הזמנות, לעתים קרובות בוחרים בסופרגרופ: מנהל יכול להגיב להודעה עם "לוקח" או להוסיף תגובה ישירות בצ'אט.
למה סופרגרופ עדיף על ערוץ לצוות תפעולי?
בסופרגרופ, כל עובד יכול להגיב במהירות: לקחת הזמנה לעבודה, לברר פרטים, לסמן בעיה. הבוט מפרסם אירועים, ואנשים מתקשרים באותו זרם. זה מקטין את זמן התגובה ב-35% בהשוואה לערוץ קריאה בלבד. למחסן ומשלוחים, פורמט זה נוח במיוחד.
| פורמט | יתרונות | חסרונות |
|---|---|---|
| בוט אישי | התראות אישיות, התאמה אישית | דורש הסכמה, אחסון chat_id לכל עובד |
| ערוץ | כולם רואים בו זמנית, הגדרה קלה | קריאה בלבד, אין משוב |
| סופרגרופ | יכולת להגיב ולדון | דורש ניהול, יותר תעבורה |
תהליך עבודה
[Событие в Битрикс] → [Обработчик события] → [Форматирование сообщения] ↓ [Telegram Bot API: sendMessage / sendPhoto] ↓ [Канал / Группа команды] הבוט הוא חשבון טכני עם טוקן. הערוץ/הקבוצה הם היעד. לפי Telegram Bot API, הבוט חייב להיות מנהל. הבוט מתווסף לערוץ/קבוצה דרך @Telegram → Add Member → @your_bot.
עיצוב הודעות הזמנה
Telegram תומך ב-HTML ו-Markdown. להזמנות, אנו משתמשים בהודעות HTML מובנות:
class OrderNotificationFormatter {
public static function newOrder(\Bitrix\Sale\Order $order): string {
$basket = $order->getBasket();
$props = $order->getPropertyCollection();
$name = $props->getPayerName()?->getValue() ?? 'Не указано';
$phone = $props->getPhone()?->getValue() ?? '—';
$email = $props->getUserEmail()?->getValue() ?? '—';
$itemLines = [];
foreach ($basket as $item) {
$itemLines[] = sprintf(
' • %s × %d = %s руб.',
htmlspecialchars($item->getField('NAME')),
(int)$item->getQuantity(),
number_format($item->getFinalPrice(), 0, '.', ' ')
);
}
$deliveryName = $order->getDeliverySystemName() ?? 'Не выбрана';
$paySystemName = $order->getPaySystemName() ?? 'Не выбрана';
return sprintf(
"🛒 <b>Новый заказ #%d</b>\n\n" .
"👤 %s\n" .
"📞 %s\n" .
"✉️ %s\n\n" .
"<b>Состав:</b>\n%s\n\n" .
"💰 <b>Итого: %s руб.</b>\n" .
"🚚 %s\n" .
"💳 %s\n\n" .
"<a href=\"https://%s/bitrix/admin/sale_order_detail.php?ID=%d\">Открыть в админке</a>",
$order->getId(),
htmlspecialchars($name),
htmlspecialchars($phone),
htmlspecialchars($email),
implode("\n", $itemLines),
number_format($order->getPrice(), 0, '.', ' '),
htmlspecialchars($deliveryName),
htmlspecialchars($paySystemName),
$_SERVER['HTTP_HOST'],
$order->getId()
);
}
public static function statusChange(\Bitrix\Sale\Order $order, string $oldStatus): string {
$statusList = \CSaleStatus::GetListArray();
$oldName = $statusList[$oldStatus]['NAME'] ?? $oldStatus;
$newName = $statusList[$order->getField('STATUS_ID')]['NAME'] ?? $order->getField('STATUS_ID');
return sprintf(
"🔄 <b>Заказ #%d</b>: %s → <b>%s</b>",
$order->getId(),
htmlspecialchars($oldName),
htmlspecialchars($newName)
);
}
public static function lowStock(int $productId, string $productName, float $quantity): string {
return sprintf(
"⚠️ <b>Мало товара:</b> %s\nОстаток: %s шт.\nID: %d",
htmlspecialchars($productName),
number_format($quantity, 0),
$productId
);
}
} מטפל אירועים עם שליחה לערוץ
// /local/php_interface/init.php
use Local\Telegram\ChannelBot;
use Local\Telegram\OrderNotificationFormatter;
$em = \Bitrix\Main\EventManager::getInstance();
// Новый заказ
$em->addEventHandler('sale', 'OnSaleOrderSaved', function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
if (!$order->isNew()) {
return;
}
$message = OrderNotificationFormatter::newOrder($order);
ChannelBot::post($message);
});
// Смена статуса
$em->addEventHandler('sale', 'OnSaleOrderStatusChange', function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$oldStatus = $event->getParameter('OLD_STATUS');
$message = OrderNotificationFormatter::statusChange($order, $oldStatus);
ChannelBot::post($message);
});
מחלקת ChannelBot לשליחה
// /local/lib/Telegram/ChannelBot.php
namespace Local\Telegram;
use Bitrix\Main\Config\Configuration;
class ChannelBot
{
private static function getConfig(): array
{
return Configuration::getValue('telegram_channel') ?? [];
}
public static function post(string $text, array $options = []): ?array
{
$config = self::getConfig();
$token = $config['bot_token'] ?? '';
$chatId = $config['channel_id'] ?? ''; // например: -1001234567890
if (!$token || !$chatId) {
return null;
}
$payload = array_merge([
'chat_id' => $chatId,
'text' => $text,
'parse_mode' => 'HTML',
'disable_web_page_preview' => true,
], $options);
$ch = curl_init('https://api.telegram.org/bot' . $token . '/sendMessage');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
$raw = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
\Bitrix\Main\Diag\Debug::writeToFile(
"Telegram channel error {$httpCode}: {$raw}",
'',
'/local/logs/telegram.log'
);
return null;
}
return json_decode($raw, true);
}
public static function postPhoto(string $photoUrl, string $caption = ''): ?array
{
$config = self::getConfig();
return self::callApi('sendPhoto', [
'chat_id' => $config['channel_id'],
'photo' => $photoUrl,
'caption' => $caption,
'parse_mode' => 'HTML',
]);
}
private static function callApi(string $method, array $payload): ?array
{
$config = self::getConfig();
$ch = curl_init('https://api.telegram.org/bot' . $config['bot_token'] . '/' . $method);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
$raw = curl_exec($ch);
curl_close($ch);
return json_decode($raw, true);
}
}תצורה ב-[Событие в Битрикс] → [Обработчик события] → [Форматирование сообщения] ↓ [Telegram Bot API: sendMessage / sendPhoto] ↓ [Канал / Группа команды] :
'telegram_channel' => [ 'value' => [ 'bot_token' => '7654321:AAbcdef...', 'channel_id' => '-1001234567890', ], ], channel_id לערוץ מתחיל ב--100. ניתן לקבל אותו על ידי העברת הודעה מהערוץ ל-@userinfobot.
איך להגדיר שליחת התראות ל-Telegram
- צור בוט דרך BotFather: שלח
class OrderNotificationFormatter { public static function newOrder(\Bitrix\Sale\Order $order): string { $basket = $order->getBasket(); $props = $order->getPropertyCollection(); $name = $props->getPayerName()?->getValue() ?? 'Не указано'; $phone = $props->getPhone()?->getValue() ?? '—'; $email = $props->getUserEmail()?->getValue() ?? '—'; $itemLines = []; foreach ($basket as $item) { $itemLines[] = sprintf( ' • %s × %d = %s руб.', htmlspecialchars($item->getField('NAME')), (int)$item->getQuantity(), number_format($item->getFinalPrice(), 0, '.', ' ') ); } $deliveryName = $order->getDeliverySystemName() ?? 'Не выбрана'; $paySystemName = $order->getPaySystemName() ?? 'Не выбрана'; return sprintf( "🛒 <b>Новый заказ #%d</b>\n\n" . "👤 %s\n" . "📞 %s\n" . "✉️ %s\n\n" . "<b>Состав:</b>\n%s\n\n" . "💰 <b>Итого: %s руб.</b>\n" . "🚚 %s\n" . "💳 %s\n\n" . "<a href=\"https://%s/bitrix/admin/sale_order_detail.php?ID=%d\">Открыть в админке</a>", $order->getId(), htmlspecialchars($name), htmlspecialchars($phone), htmlspecialchars($email), implode("\n", $itemLines), number_format($order->getPrice(), 0, '.', ' '), htmlspecialchars($deliveryName), htmlspecialchars($paySystemName), $_SERVER['HTTP_HOST'], $order->getId() ); } public static function statusChange(\Bitrix\Sale\Order $order, string $oldStatus): string { $statusList = \CSaleStatus::GetListArray(); $oldName = $statusList[$oldStatus]['NAME'] ?? $oldStatus; $newName = $statusList[$order->getField('STATUS_ID')]['NAME'] ?? $order->getField('STATUS_ID'); return sprintf( "🔄 <b>Заказ #%d</b>: %s → <b>%s</b>", $order->getId(), htmlspecialchars($oldName), htmlspecialchars($newName) ); } public static function lowStock(int $productId, string $productName, float $quantity): string { return sprintf( "⚠️ <b>Мало товара:</b> %s\nОстаток: %s шт.\nID: %d", htmlspecialchars($productName), number_format($quantity, 0), $productId ); } }, קבל את הטוקן. - צור ערוץ או סופרגרופ ב-Telegram.
- הוסף את הבוט כמנהל (עם זכות פרסום הודעות).
- העבר כל הודעה מהערוץ ל-@userinfobot — תקבל את ה-channel_id (מתחיל ב--100).
- כתוב את הטוקן וה-channel_id לתוך
// /local/php_interface/init.php use Local\Telegram\ChannelBot; use Local\Telegram\OrderNotificationFormatter; $em = \Bitrix\Main\EventManager::getInstance(); // Новый заказ $em->addEventHandler('sale', 'OnSaleOrderSaved', function (\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); if (!$order->isNew()) { return; } $message = OrderNotificationFormatter::newOrder($order); ChannelBot::post($message); }); // Смена статуса $em->addEventHandler('sale', 'OnSaleOrderStatusChange', function (\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); $oldStatus = $event->getParameter('OLD_STATUS'); $message = OrderNotificationFormatter::statusChange($order, $oldStatus); ChannelBot::post($message); });(כמו בדוגמה למעלה). - שים את קוד העיצוב ומטפל האירועים ב-
// /local/lib/Telegram/ChannelBot.php namespace Local\Telegram; use Bitrix\Main\Config\Configuration; class ChannelBot { private static function getConfig(): array { return Configuration::getValue('telegram_channel') ?? []; } public static function post(string $text, array $options = []): ?array { $config = self::getConfig(); $token = $config['bot_token'] ?? ''; $chatId = $config['channel_id'] ?? ''; // например: -1001234567890 if (!$token || !$chatId) { return null; } $payload = array_merge([ 'chat_id' => $chatId, 'text' => $text, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, ], $options); $ch = curl_init('https://api.telegram.org/bot' . $token . '/sendMessage'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, ]); $raw = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200) { \Bitrix\Main\Diag\Debug::writeToFile( "Telegram channel error {$httpCode}: {$raw}", '', '/local/logs/telegram.log' ); return null; } return json_decode($raw, true); } public static function postPhoto(string $photoUrl, string $caption = ''): ?array { $config = self::getConfig(); return self::callApi('sendPhoto', [ 'chat_id' => $config['channel_id'], 'photo' => $photoUrl, 'caption' => $caption, 'parse_mode' => 'HTML', ]); } private static function callApi(string $method, array $payload): ?array { $config = self::getConfig(); $ch = curl_init('https://api.telegram.org/bot' . $config['bot_token'] . '/' . $method); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, ]); $raw = curl_exec($ch); curl_close($ch); return json_decode($raw, true); } }או במודול נפרד. - בדוק שליחה: צור הזמנת בדיקה בפאנל הניהול.
אילו אירועים לשדר לערוץ הצוות התפעולי?
| אירוע | טריגר | תיאור |
|---|---|---|
| הזמנה חדשה | OnSaleOrderSaved | הודעה עם פריטים, סה"כ, משלוח |
| שינוי סטטוס | OnSaleOrderStatusChange | סטטוס ישן → חדש |
| מלאי נמוך | Agent כל שעה | בדיקת /bitrix/.settings.php |
| שגיאת 1C | b_event_log SALE_EXCHANGE_ERROR | יומן שגיאות ייצוא |
| הזמנה גדולה | סף סכום | התראה נפרדת |
לוח זמנים לפיתוח
| שלב | תוכן | משך |
|---|---|---|
| הגדרת בוט וערוץ | BotFather, הרשאות, channel_id | 1–2 שעות |
| עיצוב הודעות | תבניות HTML לכל האירועים | 4–6 שעות |
| מטפלי אירועי מכירות | הזמנה חדשה, סטטוסים, תשלום | 4–6 שעות |
| אירועים נוספים | מלאי, שגיאות, הזמנות גדולות | 4–8 שעות |
| בדיקות וניפוי שגיאות | כל התרחישים עם הזמנות אמיתיות | 2–4 שעות |
הניסיון והערבויות שלנו
אנו עובדים עם Bitrix למעלה מ-10 שנים וביצענו יותר מ-50 אינטגרציות עם Telegram. אנו מומחים מוסמכים "1C-Bitrix". אנו מבטיחים פעולה יציבה של ההתראות תחת כל עומס — עד 1000 הודעות ביום ללא עיכובים. אנו מספקים חבילת תיעוד מלאה וקוד מקור. למידע מפורט, עיין בתיעוד האירועים של Bitrix.
הזמן פיתוח במפתח מלא — אנו נגדיר את הבוט, העיצובים ומטפלי האירועים למשימות שלך. קבל ייעוץ על אינטגרציה של Telegram עם Bitrix. צור קשר כדי לדון בפרויקט שלך.

