Как отправить текстовый запрос в Telegram из 1С:Предприятие 8.1?

Программист IT и автоматизация бизнеса
← На главную

Реализация взаимодействия с внешними API, такими как Telegram Bot API, на платформе 1С 8.1 представляет собой определенную сложность по сравнению с современными версиями 8.3. Это связано с тем, что в версии 8.1 отсутствуют некоторые удобные объекты (например, HTTPЗапрос), а поддержка современных протоколов шифрования TLS встроена не так глубоко. В этой статье мы разберем, как решить задачу отправки сообщения боту, используя доступные инструменты платформы и системные компоненты.

Использование встроенного объекта HTTPСоединение

Первым делом проанализируем возможности встроенного объекта HTTPСоединение, который уже доступен в 1С 8.1. В отличие от версии 8.3, здесь работа строится напрямую через методы соединения, без создания отдельного объекта запроса. Рассмотрим пример кода, который позволяет инициировать соединение с сервером Telegram:


Токен = "900213010:AAHqpSWyD5S3WndtKIEfVcxOQtPSkbM9N2k";
Сервер = "api.telegram.org";
ТекстСообщения = "Здравствуйте!";
IDЧата = "846106675";

// Формируем ресурсную строку для GET-запроса
Ресурс = "bot" + Токен + "/sendMessage?chat_id=" + IDЧата + "&text=" + ТекстСообщения;

// В 8.1 параметры прокси и защищенного соединения передаются в конструкторе
// Обратите внимание: поддержка SSL в 8.1 ограничена системными возможностями
Соединение = Новый HTTPСоединение(Сервер, 443, , , , Ложь); 

// Ответ в 8.1 обязательно должен быть записан в файл
ИмяФайлаОтвета = ПолучитьИмяВременногоФайла("txt");
Попытка
    Соединение.Получить(Ресурс, ИмяФайлаОтвета);
    Сообщить("Запрос успешно отправлен");
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;

Проблема 302 Found и как с ней бороться

Часто при использовании метода Получить() разработчики сталкиваются с кодом ответа 302 Found. Выясним причину: это означает, что запрашиваемый ресурс временно перемещен на другой адрес (URI). В случае с Telegram это часто происходит при попытке обращения через незащищенный протокол или при специфических настройках серверов API.

Разберем по шагам, что делать в этой ситуации:

  1. Проверка протокола: Убедитесь, что вы используете порт 443. Однако встроенный объект HTTPСоединение в 8.1 не всегда корректно обрабатывает современные сертификаты TLS 1.2/1.3, которые требует Telegram.
  2. Обработка заголовков: Если пришел ответ 302, необходимо прочитать заголовок Location из ответа сервера и выполнить повторный запрос по новому адресу. К сожалению, в 8.1 стандартными средствами прочитать заголовки ответа через HTTPСоединение затруднительно.
  3. Использование прокси: Если доступ заблокирован, необходимо настроить объект Прокси и передать его в HTTPСоединение.

Альтернативное решение: Использование COM-объекта WinHttp

Если встроенный объект HTTPСоединение выдает ошибки дескриптора или не справляется с шифрованием, наиболее надежным способом для 1С 8.1 является использование системного COM-объекта WinHttp.WinHttpRequest.5.1. Этот метод позволяет гибко настраивать заголовки, работать с SSL и автоматически обрабатывать редиректы.

Проанализируем пример реализации через WinHttp:


// Создаем объект запроса
HTTP = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

// Настраиваем автоматическую обработку редиректов (Option 6)
HTTP.Option(6, 0); // 0 - разрешить редиректы

Токен = "900213010:AAHqpSWyD5S3WndtKIEfVcxOQtPSkbM9N2k";
URL = "https://api.telegram.org/bot" + Токен + "/sendMessage";

// Параметры запроса
Параметры = "chat_id=846106675&text=" + "Привет из 1С 8.1";

Попытка
    HTTP.Open("POST", URL, Ложь);
    HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    HTTP.Send(Параметры);
    
    Статус = HTTP.Status;
    ТекстОтвета = HTTP.ResponseText;
    
    Если Статус = 200 Тогда
        Сообщить("Сообщение отправлено!");
    Иначе
        Сообщить("Ошибка сервера: " + Статус + " " + ТекстОтвета);
    КонецЕсли;
Исключение
    Сообщить("Ошибка COM-объекта: " + ОписаниеОшибки());
КонецПопытки;

Решение проблемы кодировки (UTF-8)

Важный нюанс: 1С 8.1 работает во внутренней кодировке (ANSI/Windows-1251), а Telegram API принимает только UTF-8. Если отправить кириллицу напрямую, адресат получит нечитаемые символы ("кракозябры").

Посмотрим на способы конвертации строки в UTF-8. В 8.1 нет встроенной функции КодироватьСтроку, поэтому мы можем воспользоваться объектом ADODB.Stream:


Функция ПреобразоватьВ_UTF8(Текст)
    Stream = Новый COMОбъект("ADODB.Stream");
    Stream.Type = 2; // Text
    Stream.Charset = "windows-1251";
    Stream.Open();
    Stream.WriteText(Текст);
    Stream.Position = 0;
    Stream.Charset = "utf-8";
    Результат = Stream.ReadText();
    Stream.Close();
    Возврат Результат;
КонецФункции

Важно: При передаче текста через URL (GET-запрос) также необходимо выполнять Percent-encoding (замену спецсимволов на %xx), иначе пробелы и знаки препинания приведут к ошибке запроса.

Использование утилиты Curl как универсальный выход

Если системные библиотеки Windows устарели и не поддерживают нужные алгоритмы шифрования для прямого соединения с api.telegram.org, рассмотрим вариант использования внешней утилиты curl.exe. Это решение часто оказывается самым жизнеспособным для старых систем.

Разберем пример вызова:


Текст = "Проверка доставки";
Токен = "ВАШ_ТОКЕН";
ЧатИД = "ID_ЧАТА";

Команда = "curl -X POST https://api.telegram.org/bot" + Токен + 
          "/sendMessage -d chat_id=" + ЧатИД + 
          " -d text=""" + Текст + """";

// Выполняем команду скрыто
ЗапуститьПриложение(Команда, , Истина);

Подведем итог: для работы с Telegram в 1С 8.1 лучше всего использовать WinHttp.WinHttpRequest.5.1 из-за его гибкости. Если же возникают проблемы с SSL-сертификатами на уровне операционной системы, наиболее надежным "костылем" станет вызов curl или создание промежуточного HTTP-прокси на PHP/Python, который будет принимать простые запросы от 1С и пересылать их в Telegram по защищенному каналу.

← На главную