Отправка сообщений из 1С в Telegram: код, chat_id и подводные камни
Для уведомлений из 1С нужны бот, токен и вызов метода sendMessage через HTTPСоединение. Главная сложность в том, чтобы привязать пользователя 1С к его chat_id, а не в самом коде отправки. Токен нельзя хранить в тексте модуля, а отправку лучше выносить в фоновое задание.
Уведомления из 1С в Telegram можно настроить без платных расширений: достаточно бота и нескольких десятков строк кода. Разберём схему, код и места, где чаще всего ошибаются.
Как это устроено
- В Telegram через @BotFather создаётся бот, вы получаете токен.
- Пользователь пишет боту, и Telegram присваивает ему chat_id.
- 1С вызывает метод sendMessage Telegram Bot API по HTTPS, передав токен и chat_id.
Сложность не в отправке, а в привязке: Telegram позволяет писать только тому, кто сам начал диалог с ботом, и только по его chat_id. Поэтому в 1С нужно хранить соответствие «пользователь или сотрудник → chat_id».
Отправка сообщения: код
Функция ОтправитьВTelegram(Токен, ИдЧата, Текст) Экспорт
Данные = Новый Структура("chat_id, text, parse_mode", ИдЧата, Текст, "HTML");
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Тело = Запись.Закрыть();
Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(Тело, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Соединение = Новый HTTPСоединение("api.telegram.org", , , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение "Telegram вернул код " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Возврат Ответ.ПолучитьТелоКакСтроку();
КонецФункции
Проверьте код на своей версии платформы: имена методов и параметры конструктора могут отличаться в старых релизах.
Как узнать chat_id пользователя
Есть два рабочих способа:
- Вручную для себя или админа: напишите боту, затем откройте в браузере
https://api.telegram.org/bot<токен>/getUpdatesи найдитеchat.idв ответе. - Для сотрудников: бот предлагает кнопку «Поделиться контактом». Telegram присылает номер телефона, а 1С находит по нему пользователя и сохраняет chat_id в регистре сведений. Обязательно проверяйте, что контакт принадлежит самому отправителю: в данных контакта
user_idдолжен совпадать сfrom.id. Иначе кто угодно сможет «подсунуть» чужой номер и получать чужие уведомления.
Подводные камни
- Токен. Не храните его в тексте модуля. Вынесите в константу с ограниченным доступом или в безопасное хранилище, чтобы он не попал в выгрузку конфигурации и в Git.
- Лимиты. По справке Telegram, бот может отправлять около 30 сообщений в секунду в целом и около одного сообщения в секунду в один чат. Для массовых рассылок делайте паузу и очередь.
- Не блокируйте проведение. Отправку выносите в фоновое задание или регламентное задание, иначе недоступный интернет замедлит документ. Ошибки пишите в журнал регистрации.
- Недоставленные сообщения. Если пользователь заблокировал бота, Telegram вернёт ошибку: помечайте такого получателя и не пытайтесь слать снова.
- Формат текста. При
parse_mode=HTMLэкранируйте символы<,>и&в данных из базы.
Входящие сообщения: webhook или опрос
Если боту нужно принимать команды (например, «Согласовать документ»), есть два способа:
- Webhook: Telegram сам присылает обновления на ваш HTTPS-адрес. Нужен доступный из интернета адрес с сертификатом, обычно это HTTP-сервис 1С или отдельный сервер.
- Опрос getUpdates регламентным заданием: проще, не требует внешнего адреса, но с задержкой.
Когда проще не писать самому
Если нужны согласования в боте, карточки документов, связка с несколькими базами или интеграция сайта и бота, удобнее вынести логику на отдельный сервис (Python или n8n), а 1С оставить источником событий и данных. Подробнее об интеграциях 1С с Telegram, сайтами и другими системами в разделе «1С и учётные системы» и в услуге «Telegram-боты и Mini App».
Частые вопросы
Можно ли отправить сообщение в группу или канал?
Да. Добавьте бота в группу или канал администратором и используйте chat_id группы (он начинается с минуса) или `@имя_канала`.
Нужен ли для отправки внешний сервер?
Нет. Для отправки достаточно, чтобы сервер 1С имел доступ в интернет к `api.telegram.org`. Внешний адрес нужен только для приёма сообщений через webhook.
Что делать, если из 1С запрос не проходит?
Проверьте доступ сервера 1С к интернету и прокси, версию платформы, корректность токена и кодировку тела (UTF-8). В тексте ошибки Telegram обычно указано, чего не хватает.
Как безопасно хранить токен?
В константе или регистре с ограничением по ролям, а не в тексте модуля. Если токен попал в выгрузку или репозиторий, перевыпустите его в @BotFather.
Версия для ИИ и чтения без оформления: Markdown.