Традиционно многие разработчики начинают интеграцию 1С с мессенджером Telegram, используя метод getUpdates. Этот метод подразумевает периодический опрос серверов Telegram (polling), что создает лишнюю нагрузку на систему и задержки в получении сообщений. Однако более профессиональным и производительным подходом является использование технологии Webhook. В данной статье мы подробно разберем, как заставить Telegram самостоятельно отправлять данные в 1С в момент их появления.
Основная проблема при переходе с метода опроса на Webhook заключается в том, что 1С должна начать работать как веб-сервер, способный принимать входящие HTTP-запросы. Разберем ситуацию: у нас есть информационная база 1С и бот в Telegram. Нам необходимо, чтобы при отправке пользователем сообщения бот пересылал его напрямую в нашу базу. Для этого в 1С используются HTTP-сервисы.
Рассмотрим основные этапы реализации этой задачи:
HTTP-сервис в конфигурации 1С.Первым делом откроем конфигуратор и создадим новый объект метаданных в ветке Общие -> HTTP-сервисы. Назовем его, например, TelegramWebhook. В свойствах сервиса укажем корневой URL (например, /tg/).
Далее создадим Шаблон URL. В шаблоне определим путь, по которому Telegram будет обращаться к нам. Пусть это будет /v1/message. Внутри шаблона создадим Метод. Поскольку Telegram отправляет данные методом POST, выберем соответствующий тип запроса.
Проанализируем программный код обработчика. В модуле метода нам необходимо считать тело запроса, которое приходит в формате JSON. Рассмотрим пример реализации:
Функция СообщенияPOST(Запрос)
// Получаем тело запроса в виде строки
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
// Читаем данные JSON в структуру 1С
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
ДанныеУведомления = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Логика обработки сообщения
Если ДанныеУведомления.Свойство("message") Тогда
СообщениеОбъект = ДанныеУведомления.message;
ИдентификаторЧата = СообщениеОбъект.chat.id;
ТекстСообщения = СообщениеОбъект.text;
// Здесь можно вызвать процедуру обработки логики бота
ОбработатьВходящееСообщение(ИдентификаторЧата, ТекстСообщения);
КонецЕсли;
// Всегда возвращаем статус 200 (ОК), чтобы Telegram не повторял запрос
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
Выясним причину, по которой Webhook часто не работает на локальных машинах. Telegram требует, чтобы адрес вашего сервиса был доступен извне по протоколу HTTPS с валидным SSL-сертификатом. Если ваша база установлена на локальном компьютере, вам потребуется выполнить публикацию.
Для публикации используйте меню Администрирование -> Публикация на веб-сервере. В появившемся окне на вкладке "HTTP-сервисы" обязательно установите флажок напротив нашего сервиса TelegramWebhook. После публикации файл default.vrd будет содержать описание нашего сервиса, и он станет доступен по адресу вида https://ваш-домен.ru/имя-базы/hs/tg/v1/message.
Если у вас нет возможности настроить прямой доступ к серверу 1С, рассмотрим вариант с использованием Reverse Proxy, например, Nginx. Nginx может принимать зашифрованный трафик на порту 443, расшифровывать его с помощью сертификатов (например, от Let's Encrypt) и перенаправлять запрос на локальный адрес 1С по обычному HTTP. Это значительно упрощает настройку безопасности.
После того как наш адрес стал доступен из интернета, нам нужно сообщить об этом Telegram. Это делается однократным вызовом метода setWebhook. Мы можем сделать это просто через адресную строку браузера или воспользовавшись инструментом типа Postman.
Пример ссылки для регистрации:
https://api.telegram.org/bot[ВАШ_ТОКЕН]/setWebhook?url=https://ваш-домен.ru/имя-базы/hs/tg/v1/message
В ответ вы должны получить JSON с подтверждением: {"ok":true,"result":true,"description":"Webhook was set"}. С этого момента все сообщения, отправленные боту, будут мгновенно прилетать в ваш HTTP-сервис в 1С.
Разберем важный нюанс: Telegram ожидает ответа от вашего сервера в течение нескольких секунд. Если логика обработки сообщения в 1С занимает длительное время (например, поиск в большой базе или формирование отчета), Telegram разорвет соединение и будет пытаться отправить это же сообщение снова и снова.
Чтобы избежать этой проблемы, применим следующую тактику: в методе HTTP-сервиса мы только записываем входящие данные (например, в регистр сведений или справочник) и моментально возвращаем ответ 200 OK. Саму же обработку логики запускаем через ФоновыеЗадания.
ПараметрыПроцедуры = Новый Массив;
ПараметрыПроцедуры.Добавить(ДанныеУведомления);
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ОбработатьСообщениеФоново", ПараметрыПроцедуры);
Такой подход гарантирует стабильность работы и исключает зацикливание запросов от серверов мессенджера.
Поскольку URL вашего Webhook является публичным, существует риск получения ложных запросов от злоумышленников. Проанализируем способы защиты нашего сервиса:
secret_token. Telegram будет передавать его в заголовке X-Telegram-Bot-Api-Secret-Token. В 1С в начале метода проверяйте этот заголовок через Запрос.Заголовки.Получить().Использование технологии Webhook совместно с HTTP-сервисами 1С позволяет создавать по-настоящему быстрых и отзывчивых ботов, способных обрабатывать тысячи запросов в реальном времени, обеспечивая при этом тесную интеграцию с учетными данными вашей системы.