Настройка интеграции 1С с Telegram Bot API: отправка уведомлений и опрос
При взаимодействии 1С с Telegram Bot API возникают проблемы:
- Ошибка
HTTP 400 Bad Request: can't parse entitiesпри использовании Markdown/HTML форматирования. - Ошибка
HTTP 429 Too Many Requests: retry after Xпри массовой рассылке уведомлений сотрудникам. - Сложности с отправкой бинарных файлов (PDF-счетов, Excel-отчетов) методом
sendDocument. - Задержки обработки входящих сообщений при использовании режима Long Polling в однопоточном задании.
1. Методы получения обновлений: Webhook vs Long Polling
Для production-систем с белым IP предпочтительнее Webhook (Telegram сам отправляет запросы на HTTP-сервис 1С). Если сервер 1С находится за NAT без внешнего адреса, используется регламентное задание с методом Long Polling (getUpdates).
2. Отправка форматированного текстового сообщения с кнопками
&НаСервере
Процедура ОтправитьСообщениеВTelegram(ТокенБота, ChatID, ТекстСообщения)
ПараметрыTLS = Новый ПараметрыЗащищенногоСоединенияOpenSSL();
HTTPСоединение = Новый HTTPСоединение("api.telegram.org", 443,,,, 15, Новый ЗащищенноеСоединениеOpenSSL(ПараметрыTLS));
Путь = "/bot" + ТокенБота + "/sendMessage";
HTTPЗапрос = Новый HTTPЗапрос(Путь);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
// Формирование структуры Inline-клавиатуры
Кнопка = Новый Структура("text, callback_data", "Согласовать", "approve_doc_123");
СтрокаКнопок = Новый Массив;
СтрокаКнопок.Добавить(Кнопка);
Клавиатура = Новый Структура("inline_keyboard", Новый Массив);
Клавиатура.inline_keyboard.Добавить(СтрокаКнопок);
ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("chat_id", ChatID);
ТелоЗапроса.Вставить("text", ТекстСообщения);
ТелоЗапроса.Вставить("parse_mode", "HTML");
ТелоЗапроса.Вставить("reply_markup", Клавиатура);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
HTTPЗапрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
Если HTTPОтвет.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Telegram", УровеньЖурналаРегистрации.Ошибка,,,
HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
КонецПроцедуры3. Отправка печатной формы (PDF) через multipart/form-data
&НаСервере
Процедура ОтправитьСчетВTelegram(ТокенБота, ChatID, ДвоичныеДанныеPDF, ИмяФайла)
Разделитель = "----Boundary" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
ПараметрыTLS = Новый ПараметрыЗащищенногоСоединенияOpenSSL();
HTTPСоединение = Новый HTTPСоединение("api.telegram.org", 443,,,, 30, Новый ЗащищенноеСоединениеOpenSSL(ПараметрыTLS));
HTTPЗапрос = Новый HTTPЗапрос("/bot" + ТокенБота + "/sendDocument");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
// Сборка multipart тела
Поток = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8);
// Поле chat_id
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(Строка(ChatID));
// Поле document
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=""document""; filename=""%1""", ИмяФайла));
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.Закрыть();
// Объединение заголовков с двоичными данными файла
ИтоговыеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
ИтоговыеДанные = СоединитьДвоичныеДанные(ИтоговыеДанные, ДвоичныеДанныеPDF);
ПотокОкончания = Новый ПотокВПамяти;
ЗаписьКонца = Новый ЗаписьДанных(ПотокОкончания, КодировкаТекста.UTF8);
ЗаписьКонца.ЗаписатьСтроку("");
ЗаписьКонца.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьКонца.Закрыть();
ИтоговыеДанные = СоединитьДвоичныеДанные(ИтоговыеДанные, ПотокОкончания.ЗакрытьИПолучитьДвоичныеДанные());
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ИтоговыеДанные);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
КонецПроцедуры Частые вопросы (FAQ)
Как избежать ошибки HTTP 429 Too Many Requests?
Telegram API ограничивает отправку сообщений до 30 сообщений в секунду суммарно и не более 1 сообщения в секунду в один чат. Добавляйте паузы (ПриостановитьРаботу) в циклах массовой рассылки.
Почему спецсимволы в HTML/Markdown вызывают ошибку 400 Bad Request?
В режиме HTML символы '<', '>' и '&' должны экранироваться как <, > и &. В MarkdownV2 требуется экранировать слэшем все знаки пунктуации: '_', '*', '[', ']', '(', ')' и т.д.
Как сохранять состояние диалога (FSM) пользователя в 1С?
Используйте регистр сведений 'СостоянияДиалоговTelegram' с измерением ChatID и ресурсами 'ТекущийШаг', 'КонтекстныеДанныеJSON'.
Как безопасно регистрировать Webhook для Telegram?
При вызове метода setWebhook обязательно передавайте параметр secret_token и сверяйте его значение из заголовка X-Telegram-Bot-Api-Secret-Token во входящем HTTP-сервисе 1С.