Реализация современного API, такого как Telegram Bot API, на устаревших версиях платформы 1С или в режиме совместимости с 8.2 представляет собой серьезный технический вызов. Основная сложность заключается в том, что стандартный объект HTTPСоединение в этих версиях не поддерживает протокол HTTPS (SSL/TLS) в той мере, в какой этого требует Telegram. Кроме того, в платформе 8.2 отсутствуют встроенные средства для работы с форматом JSON.
В этой статье мы подробно разберем, как обойти эти ограничения, используя системные компоненты Windows, и создадим работающий механизм взаимодействия с мессенджером.
Поскольку штатные средства 1С 8.2 не справляются с шифрованием TLS 1.2, которое является обязательным для Telegram, мы будем использовать COM-объект WinHttp.WinHttpRequest.5.1. Этот объект позволяет отправлять HTTP-запросы напрямую через системные библиотеки Windows, игнорируя внутренние ограничения платформы 1С.
Рассмотрим базовый пример создания объекта и отправки простого сообщения:
КодБот = "123456789:ABCDEFGHjklmn-opqrstuvwxyz"; // Ваш токен
ЧатID = "987654321";
ТекстСообщения = "Привет из 1С 8.2!";
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
URL = "https://api.telegram.org/bot" + КодБот + "/sendMessage?chat_id=" + ЧатID + "&text=" + ТекстСообщения;
WinHttp.Open("GET", URL, Ложь);
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
Сообщить("Сообщение успешно отправлено!");
Иначе
Сообщить("Ошибка отправки: " + WinHttp.Status + " " + WinHttp.ResponseText);
КонецЕсли;
Проанализируем этот код: метод Open инициализирует соединение, где третий параметр Ложь указывает на синхронный режим работы. Метод Send выполняет фактическую отправку запроса.
Если ваша база работает на старых операционных системах (например, Windows Server 2008 R2), WinHttp может по умолчанию пытаться использовать устаревший протокол TLS 1.0, что приведет к ошибке соединения. В таком случае нам необходимо принудительно указать использование TLS 1.2.
Разберем, как это сделать программно через установку опций объекта:
// Флаг для включения TLS 1.2 (0x00000800)
WinHttp.Option(9, 2048);
WinHttp.Option(6, Ложь); // Отключаем автоматические редиректы, если нужно
Использование Option(9, 2048) позволяет объекту использовать защищенные протоколы, даже если они не выбраны в системе по умолчанию. Это критически важный момент для стабильной работы бота.
Telegram возвращает ответы в формате JSON, который платформа 8.2 «не понимает». Для решения этой задачи у нас есть два пути: использование MSScriptControl.ScriptControl или написание собственного парсера на языке 1С.
Рассмотрим вариант с ScriptControl, который позволяет выполнять JavaScript-код внутри 1С для разбора структуры JSON:
JS = Новый COMОбъект("MSScriptControl.ScriptControl");
JS.Language = "javascript";
JS.AddCode("function getFieldValue(jsonString, field) { var obj = JSON.parse(jsonString); return obj[field]; }");
// Пример получения ID последнего сообщения
JSONОтвет = WinHttp.ResponseText;
IDСообщения = JS.Run("getFieldValue", JSONОтвет, "message_id");
Важное примечание: объект MSScriptControl доступен только в 32-битных сессиях 1С. Если ваш сервер 1С работает в 64-битном режиме, вам придется использовать строковые функции для поиска подстрок (Найти, Сред) или внешние компоненты обработки JSON.
Так как организовать Webhook на старых конфигурациях крайне сложно из-за необходимости публикации веб-сервисов с валидными SSL-сертификатами, проанализируем метод getUpdates (длинные опросы). Чтобы бот постоянно проверял наличие новых сообщений, нам потребуется создать бесконечный цикл с небольшой паузой.
Посмотрим на пример реализации цикла опроса:
ПоследнееОбновление = 0;
Пока Истина Цикл
URL = "https://api.telegram.org/bot" + КодБот + "/getUpdates?offset=" + Формат(ПоследнееОбновление + 1, "ЧГ=0");
WinHttp.Open("GET", URL, Ложь);
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
// Здесь должна быть логика разбора JSON и обработки команд
// После обработки обновляем ПоследнееОбновление на основе полученного update_id
КонецЕсли;
// Пауза, чтобы не нагружать процессор (в 8.2 можно использовать Предупреждение с таймаутом)
Предупреждение("Ожидание...", 1);
КонецЦикла;
Если ваша задача включает отправку счетов или отчетов в формате PDF/Excel, стандартный метод WinHttp.Send(Текст) не подойдет, так как файл нужно передавать в двоичном виде с использованием multipart/form-data. Выясним, как сформировать тело запроса с помощью объекта ADODB.Stream.
Нам необходимо вручную собрать «пакет», состоящий из заголовков, границ (boundary) и бинарных данных файла. Это позволяет Telegram корректно интерпретировать присланный поток байтов как файл.
ADODB.Stream для работы с бинарными данными.WinHttp.Send().Этот метод является наиболее надежным способом передачи документов в Telegram из старых версий 1С без использования сторонних «костылей» или внешних программ-посредников.
Если работа с COM-объектами кажется слишком громоздкой или нестабильной, рассмотрим вариант с использованием «прослойки». Вы можете написать простейший скрипт на Python или PHP, который будет принимать обычные HTTP-запросы от 1С (через стандартное HTTPСоединение по порту 80) и пересылать их в Telegram по HTTPS.
Преимущества этого метода:
В завершение подчеркнем, что несмотря на ограничения режима совместимости 8.2, использование WinHttp.WinHttpRequest.5.1 в сочетании с ADODB.Stream предоставляет программисту полный контроль над сетевым взаимодействием и позволяет создавать полнофункциональных ботов для автоматизации бизнеса.