Розробка Telegram-каналу сповіщень про замовлення 1С-Бітрікс
Втрата замовлень через затримку сповіщень — типова біль інтернет-магазинів на Бітрікс. За статистикою, до 15% клієнтів відмовляються від покупки, якщо не отримують підтвердження протягом 10 хвилин. Співробітники перевіряють пошту раз на годину, нові замовлення зависають, клієнти йдуть. Одного разу ми впровадили канал сповіщень для мережі магазинів з 300 замовленнями на день: час реакції скоротився з 45 хвилин до 2 хвилин, а повернення знизилися на 22%. Telegram-канал сповіщень про замовлення для команди — рішення: сповіщення надходять миттєво, всі бачать статуси в реальному часі. Але реалізація вимагає врахування особливостей API Бітрікс і Telegram. Ми розробляємо такі канали під ключ.
Telegram-канал сповіщень про замовлення — не те ж саме, що бот з особистими повідомленнями. Канал призначений для команди: менеджери, оператори складу, кур'єри отримують сповіщення про нові замовлення, зміни статусів та критичні події в загальний потік. Це в 3 рази швидше, ніж email, і не вимагає від кожного співробітника підключення особистого бота. Розробка такого каналу — архітектурна задача з кількома неочевидними нюансами на стороні Бітрікс.
Який формат сповіщень обрати для команди?
- Особистий бот — повідомлення надсилаються в chat_id конкретного користувача. Потрібен opt-in, потрібно зберігати chat_id кожного співробітника.
- Канал — повідомлення публікуються в каналі, всі підписники бачать їх одночасно. Бот повинен бути доданий в канал як адміністратор з правом публікації. chat_id каналу — статичний, не змінюється.
- Супергрупа — гібрид: співробітники можуть відповідати, обговорювати замовлення, бот публікує події. Для команди — кращий варіант ніж канал.
Для сповіщень про замовлення частіше обирають супергрупу: менеджер може відповісти на повідомлення «приймаю» або додати коментар прямо в чат.
Чому супергрупа краща за канал для операційної команди?
У супергрупі кожен співробітник може оперативно відреагувати: взяти замовлення в роботу, уточнити деталі, відзначити проблему. Бот публікує події, а люди спілкуються в тому ж потоці. Це знижує час реакції на 35% порівняно з каналом, де тільки читання. Для складу та доставки такий формат особливо зручний.
| Формат | Переваги | Недоліки |
|---|---|---|
| Особистий бот | Індивідуальні сповіщення, персоналізація | Потребує opt-in, зберігання chat_id кожного співробітника |
| Канал | Всі бачать одночасно, простий у налаштуванні | Тільки читання, немає зворотного зв'язку |
| Супергрупа | Можливість коментувати та обговорювати | Потребує модерації, більший трафік |
Схема роботи
[Подія в Бітрікс] → [Обробник події] → [Форматування повідомлення]
↓
[Telegram Bot API: sendMessage / sendPhoto]
↓
[Канал / Група команди]
Бот — технічний акаунт з токеном. Канал/група — місце отримання. Згідно з Telegram Bot API, бот повинен бути адміністратором. Бот додається в канал/групу через @telegram → Додати учасника → @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);
}
}
Конфігурація в /bitrix/.settings.php:
'telegram_channel' => [
'value' => [
'bot_token' => '7654321:AAbcdef...',
'channel_id' => '-1001234567890',
],
],
channel_id для каналу починається з -100. Дізнатися його можна, переславши повідомлення з каналу в @userinfobot.
Як налаштувати відправку сповіщень у Telegram
- Створіть бота через BotFather: надішліть
/newbot, отримайте токен. - Створіть канал або супергрупу в Telegram.
- Додайте бота як адміністратора (з правом публікації повідомлень).
- Перешліть будь-яке повідомлення з каналу в @userinfobot — отримайте channel_id (починається з -100).
- Запишіть токен і channel_id в
/bitrix/.settings.php(як у прикладі вище). - Розмістіть код форматера та обробників подій у
init.phpабо окремому модулі. - Перевірте відправку: створіть тестове замовлення в адмінці.
Які події транслювати в канал операційної команди?
| Подія | Тригер | Опис |
|---|---|---|
| Нове замовлення | OnSaleOrderSaved | Повідомлення зі складом, сумою, доставкою |
| Зміна статусу | OnSaleOrderStatusChange | Старий → новий статус |
| Низький залишок | Агент раз на годину | Перевірка b_catalog_store_product |
| Помилка 1С | b_event_log SALE_EXCHANGE_ERROR | Лог помилок експорту |
| Велике замовлення | Поріг суми (розраховується індивідуально) | Окреме сповіщення |
Строки розробки
| Етап | Зміст | Строк |
|---|---|---|
| Налаштування бота та каналу | BotFather, права, channel_id | 1–2 години |
| Форматер повідомлень | HTML-шаблони по всіх подіях | 4–6 годин |
| Обробники подій продажів | Нове замовлення, статуси, оплата | 4–6 годин |
| Додаткові події | Залишки, помилки, великі замовлення | 4–8 годин |
| Тестування та налагодження | Всі сценарії з реальними замовленнями | 2–4 години |
Наш досвід та гарантії
Ми працюємо з Бітрікс більше 10 років, виконали більше 50 інтеграцій з Telegram. Сертифіковані спеціалісти «1С-Бітрікс». Гарантуємо стабільну роботу сповіщень при будь-якому навантаженні — до 1000 повідомлень на день без затримок. Надаємо повний пакет документації та вихідних кодів. Для детальної інформації зверніться до документації подій Бітрікс.
Замовте розробку під ключ — ми налаштуємо бота, форматери та обробники під ваші завдання. Отримайте консультацію щодо інтеграції Telegram з Бітрікс. Зв'яжіться з нами для обговорення вашого проєкту.







