Реализация взаимодействия с внешними API, такими как Telegram Bot API, на платформе 1С 8.1 представляет собой определенную сложность по сравнению с современными версиями 8.3. Это связано с тем, что в версии 8.1 отсутствуют некоторые удобные объекты (например, HTTPЗапрос), а поддержка современных протоколов шифрования TLS встроена не так глубоко. В этой статье мы разберем, как решить задачу отправки сообщения боту, используя доступные инструменты платформы и системные компоненты.
Первым делом проанализируем возможности встроенного объекта 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. Выясним причину: это означает, что запрашиваемый ресурс временно перемещен на другой адрес (URI). В случае с Telegram это часто происходит при попытке обращения через незащищенный протокол или при специфических настройках серверов API.
Разберем по шагам, что делать в этой ситуации:
HTTPСоединение в 8.1 не всегда корректно обрабатывает современные сертификаты TLS 1.2/1.3, которые требует Telegram.Location из ответа сервера и выполнить повторный запрос по новому адресу. К сожалению, в 8.1 стандартными средствами прочитать заголовки ответа через HTTPСоединение затруднительно.Прокси и передать его в HTTPСоединение.Если встроенный объект 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-объекта: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: 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), иначе пробелы и знаки препинания приведут к ошибке запроса.
Если системные библиотеки 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 по защищенному каналу.