К статье
Практический материал

Автоматизация · 12 мин

Как отправить сообщение из 1С в Telegram

Как отправить сообщение из 1С в Telegram через HTTP-запрос к Bot API: создание бота, получение chat_id, готовый код на встроенном языке и разбор ошибок.

Отправка сообщений из 1С в Telegram решается через официальный Bot API: конфигурация выполняет HTTPS-запрос к серверу Telegram, передавая токен бота, идентификатор чата и текст. Для этого не нужны внешние компоненты и платные сервисы — достаточно стандартных объектов встроенного языка 1С:Предприятие. Решение работает как в клиент-серверном, так и в файловом варианте, на тонком, толстом и веб-клиенте.

Типовые сценарии, где это применяется: уведомление менеджера о новом заказе, оповещение руководителя о крупной оплате, сигнал администратору об ошибке обмена, напоминание о задачах по срокам. Вместо почты и SMS Telegram выбирают из-за скорости доставки, бесплатности и удобной группировки сообщений в чаты.

Ниже — полный цикл настройки: от создания бота до готовой процедуры отправки, обработки ошибок и организации очереди сообщений. Код приведён для управляемых форм на платформе 8.3, но легко адаптируется под любую конфигурацию.

Создание бота и получение токена

Первый шаг выполняется в самом Telegram. Откройте диалог с официальным ботом @BotFather и отправьте команду /newbot. Сервис попросит придумать отображаемое имя и уникальное имя пользователя, заканчивающееся на «bot» (например, my1c_notify_bot). После регистрации BotFather выдаст токен — строку вида 123456789:AAEhBOweik6ad9r_QXMENQjcrGbqCr4K-4c.

Токен — это полный ключ доступа к боту. Любой, кто его знает, может отправлять сообщения от имени бота и читать его переписку. Поэтому токен нельзя вставлять прямо в код общих модулей, публиковать в репозиториях и пересылать в открытых чатах. Безопасное место хранения — константа с ограничением прав, защищённый регистр сведений или безопасное хранилище (в 1С:Fresh).

Если токен скомпрометирован, откройте @BotFather и выполните /revoke для нужного бота — старый токен будет отозван, а новый сгенерирован автоматически. После этого обновите значение в хранилище 1С.

Как узнать chat_id получателя

Сообщение отправляется не по номеру телефона и не по имени пользователя, а по числовому идентификатору чата — chat_id. Для личной переписки это идентификатор пользователя, для группы — отрицательное число. Бот не может написать пользователю первым: сначала получатель должен найти бота в Telegram и нажать «Старт» (отправить /start).

Самый простой способ узнать chat_id — попросить пользователя написать боту любое сообщение, а затем открыть в браузере URL вида https://api.telegram.org/bot<ТОКЕН>/getUpdates. В ответе JSON найдите блок "chat":{"id":... — это и есть нужное число. Для группы добавьте бота в группу, отправьте там сообщение и повторите запрос getUpdates.

Для массового сценария храните соответствие «пользователь 1С — chat_id» в регистре сведений. Заполнение можно автоматизировать: пользователь отправляет боту свой табельный номер или код из личного кабинета, а регламентное задание читает getUpdates и сопоставляет идентификаторы.

Порядок действий
  1. 1
    Создайте бота через @BotFather и сохраните токен в защищённое хранилище
  2. 2
    Попросите получателя написать боту /start
  3. 3
    Получите chat_id через метод getUpdates
  4. 4
    Добавьте в конфигурацию процедуру отправки через HTTPСоединение
  5. 5
    Вызовите процедуру из нужного места: при записи документа, в регламентном задании
  6. 6
    Проверьте доставку и обработайте коды ошибок API

Код отправки сообщения на встроенном языке

Базовая процедура состоит из трёх частей: формирование JSON-тела запроса, установка HTTPS-соединения с сервером api.telegram.org и выполнение POST-запроса к методу sendMessage. Ниже пример для общего модуля с признаком «Сервер».

Функция ОтправитьСообщениеTelegram(ChatID, ТекстСообщения) Экспорт

Токен = Константы.ТокенTelegramБота.Получить();

Данные = Новый Структура;

Данные.Вставить("chat_id", ChatID);

Данные.Вставить("text", ТекстСообщения);

Данные.Вставить("parse_mode", "HTML");

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписатьJSON(ЗаписьJSON, Данные);

ТелоЗапроса = ЗаписьJSON.Закрыть();

Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , 30,

Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage");

Запрос.Заголовки.Вставить("Content-Type", "application/json");

Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда

Возврат Истина;

Иначе

ЗаписьЖурналаРегистрации("Telegram",

УровеньЖурналаРегистрации.Ошибка, , ,

"Код " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку());

Возврат Ложь;

КонецЕсли;

КонецФункции

Обратите внимание на детали. Порт 443 и объект ЗащищенноеСоединениеOpenSSL обязательны — Bot API работает только по HTTPS. Таймаут 30 секунд защищает от зависания сеанса при сетевых проблемах. Тело запроса формируется через ЗаписьJSON, а не конкатенацией строк: так исключаются ошибки экранирования кавычек и спецсимволов в тексте сообщения.

Вызов из бизнес-логики выглядит просто: ОтправитьСообщениеTelegram(123456789, "Новый заказ № " + НомерДокумента). В обработчике ПриЗаписи документа такой вызов лучше делать после успешной записи, а не в транзакции — иначе сетевой сбой откатит проведение документа.

bsl
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);

Форматирование текста и дополнительные возможности

Параметр parse_mode со значением HTML позволяет выделять текст: теги <b> — жирный, <i> — курсив, <code> — моноширинный, <a href> — ссылка. Это удобно для уведомлений: номер документа выделяется жирным, а ссылка ведёт на веб-интерфейс базы. Помните, что символы <, > и & в самом тексте нужно экранировать HTML-сущностями.

Помимо текста Bot API умеет отправлять документы (метод sendDocument — например, сформированную печатную форму в PDF), фотографии и клавиатуры с кнопками. Для файлов запрос формируется как multipart/form-data, что в 1С реализуется вручную через границы разделителей — это сложнее, но не требует сторонних библиотек.

Ограничения, о которых стоит знать: длина одного текстового сообщения — до 4096 символов, длинный текст нужно разбивать на части. Также Telegram ограничивает частоту запросов: при массовой рассылке десяткам получателей добавляйте паузы между отправками, иначе API начнёт возвращать ошибку 429.

Обработка ошибок и очередь сообщений

Прямой вызов отправки из транзакции записи документа — распространённая ошибка. Если сервер Telegram недоступен или истёк таймаут, пользователь получит сбой при проведении документа, хотя сама отправка — второстепенная операция. Правильный подход — отделить постановку сообщения от его доставки.

Классическая схема: при наступлении события запись добавляется в регистр сведений «ОчередьСообщенийTelegram» (получатель, текст, статус, число попыток). Регламентное задание раз в минуту выбирает неотправленные записи пачкой, вызывает процедуру отправки и проставляет статус. При ошибке увеличивается счётчик попыток; после нескольких неудач запись помечается как проблемная и попадает в журнал для администратора.

Такой подход даёт три преимущества: документы проводятся мгновенно независимо от сети, сообщения не теряются при временном сбое, а историю отправки можно проанализировать. Для небольших баз с редкими уведомлениями допустим и прямой вызов, но с обязательной обёрткой в Попытка...Исключение, чтобы сбой сети не прерывал основной процесс.

Типичные ошибки
01
Вызов отправки внутри транзакции записи документа — сбой сети откатывает проведение
02
Токен, зашитый прямо в текст модуля — утечка при выгрузке конфигурации или публикации кода
03
Отправка без обработки кода ответа — ошибки 400/403/429 остаются незамеченными, сообщения молча теряются
04
Формирование JSON конкатенацией строк — текст с кавычками ломает структуру запроса
05
Отсутствие таймаута у HTTPСоединения — сеанс пользователя зависает при недоступности API

Диагностика: почему сообщение не доходит

Если сообщение не пришло, диагностику ведите от кода ответа API. Код 200 означает, что Telegram принял сообщение — если его нет в чате, проверьте, тот ли chat_id используется и не заблокировал ли пользователь бота. Код 400 указывает на ошибку в параметрах: неверный chat_id, пустой текст или битая HTML-разметка. Код 401 — неверный токен, 403 — бот заблокирован пользователем или удалён из группы, 429 — превышен лимит частоты запросов.

Если запрос вообще не доходит до API (исключение при вызове метода соединения), проблема на стороне инфраструктуры: на сервере 1С закрыт исходящий HTTPS-трафик, прокси требует авторизации или антивирус перехватывает TLS. Проверьте доступность api.telegram.org с того же сервера через браузер или curl. При работе через прокси его параметры передаются в конструктор HTTPСоединение объектом ИнтернетПрокси.

Отдельный случай — файловая база на компьютере пользователя без постоянного интернет-доступа. Здесь поможет только очередь с повторными попытками: сообщения будут доставлены, когда сеть появится.

Контрольные точки

Как проверить результат

Код ответа API
Норма

200, в теле ответа ok: true

Тревожный признак

400, 401, 403 или 429 — читать описание ошибки в ответе

Доставка в чат
Норма

Сообщение появилось у получателя в течение секунд

Тревожный признак

Код 200, но в чате пусто — неверный chat_id

Журнал регистрации
Норма

Нет записей об ошибках отправки

Тревожный признак

Повторяющиеся ошибки таймаута или TLS — проблема сети сервера

Альтернативные варианты реализации

Помимо прямого обращения к Bot API существуют обходные пути. Готовые расширения и подсистемы из публичных библиотек (например, решения на базе БСП) дают уже написанные очереди, настройки получателей и журналы — это сокращает разработку, но требует проверки совместимости с вашей конфигурацией. Внешние HTTP-сервисы-прокладки удобны, если с сервера 1С закрыт доступ в интернет: 1С обращается к внутреннему сервису, а тот уже отправляет в Telegram.

Для типовых конфигураций часть задач закрывается штатной подсистемой «Обсуждения» и интеграцией с мессенджерами через сервис 1С:Диалог, но это отдельный механизм со своей моделью лицензирования, а не прямая отправка в произвольный чат Telegram.

Сравнение вариантов

Прямой вызов Bot API

Максимум контроля и ноль зависимостей; требует написания кода и обработки ошибок

Готовая подсистема/расширение

Быстрый старт с очередью и настройками; нужна проверка совместимости и доверие к чужому коду

Внутренний сервис-прокладка

Подходит при закрытом интернете на сервере 1С; добавляет компонент, который нужно поддерживать

Итог

Что важно запомнить

Отправка из 1С в Telegram — это один HTTPS-запрос к Bot API с токеном, chat_id и текстом. Храните токен в защищённом месте, выносите отправку из транзакций в очередь с регламентным заданием и всегда анализируйте код ответа API.

Частые вопросы

Можно ли отправлять сообщения в Telegram из 1С без программирования?

Полностью без кода — только через готовые расширения и подсистемы, которые уже содержат механизм отправки и требуют лишь указать токен и получателей в настройках. Если такое расширение не подходит, минимальный код отправки занимает около 30 строк и пишется один раз.

Работает ли отправка в файловой базе на обычном компьютере?

Да, HTTPСоединение доступно и на клиенте, и на сервере. Ограничение одно: компьютер, с которого выполняется код, должен иметь доступ в интернет к api.telegram.org. Для файловой базы отправка чаще выполняется с клиентского сеанса, поэтому сбой сети у пользователя прервёт доставку — отсюда польза очереди сообщений.

Как отправить сообщение в групповой чат?

Добавьте бота в группу, отправьте в ней любое сообщение и получите chat_id через метод getUpdates — идентификатор группы будет отрицательным числом. Дальше отправка ничем не отличается от личной: тот же метод sendMessage с этим chat_id. У бота должны быть права на отправку сообщений в группе.

Почему API возвращает ошибку 403, хотя токен верный?

Код 403 означает, что бот не может написать получателю: пользователь заблокировал бота, никогда не нажимал «Старт» или бот был удалён из группы. Проверьте статус диалога у получателя и при необходимости попросите его заново запустить бота.

Есть ли ограничения на количество сообщений?

Telegram ограничивает частоту запросов к Bot API: при массовой рассылке возможны ответы с кодом 429. На практике для уведомлений из учётной системы лимиты редко достигаются, но при рассылке десяткам получателей добавляйте паузу между отправками и обрабатывайте 429 повторной попыткой через некоторое время.

Как отправить из 1С файл, например PDF-счёт?

Используйте метод sendDocument: запрос формируется как multipart/form-data с границами разделителей, двоичные данные файла читаются через ДвоичныеДанные и вставляются в тело запроса. Это сложнее текстовой отправки, но реализуется штатными средствами без внешних компонент.