Как реализовать Telegram-бота в 1С 8.3 в режиме совместимости с 8.2

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Реализация современного API, такого как Telegram Bot API, на устаревших версиях платформы 1С или в режиме совместимости с 8.2 представляет собой серьезный технический вызов. Основная сложность заключается в том, что стандартный объект HTTPСоединение в этих версиях не поддерживает протокол HTTPS (SSL/TLS) в той мере, в какой этого требует Telegram. Кроме того, в платформе 8.2 отсутствуют встроенные средства для работы с форматом JSON.

В этой статье мы подробно разберем, как обойти эти ограничения, используя системные компоненты Windows, и создадим работающий механизм взаимодействия с мессенджером.

Решение проблемы защищенного соединения через WinHttp

Поскольку штатные средства 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 выполняет фактическую отправку запроса.

Настройка протоколов TLS

Если ваша база работает на старых операционных системах (например, 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) позволяет объекту использовать защищенные протоколы, даже если они не выбраны в системе по умолчанию. Это критически важный момент для стабильной работы бота.

Парсинг JSON в условиях отсутствия встроенных средств

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.

Реализация получения сообщений (Polling)

Так как организовать 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); 
КонецЦикла;

Отправка файлов через ADODB.Stream

Если ваша задача включает отправку счетов или отчетов в формате PDF/Excel, стандартный метод WinHttp.Send(Текст) не подойдет, так как файл нужно передавать в двоичном виде с использованием multipart/form-data. Выясним, как сформировать тело запроса с помощью объекта ADODB.Stream.

Нам необходимо вручную собрать «пакет», состоящий из заголовков, границ (boundary) и бинарных данных файла. Это позволяет Telegram корректно интерпретировать присланный поток байтов как файл.

  1. Создаем объект ADODB.Stream для работы с бинарными данными.
  2. Записываем текстовую границу начала блока.
  3. Считываем файл в поток.
  4. Записываем завершающую границу.
  5. Передаем весь поток в метод WinHttp.Send().

Этот метод является наиболее надежным способом передачи документов в Telegram из старых версий 1С без использования сторонних «костылей» или внешних программ-посредников.

Альтернативный подход: Использование прослойки (Bridge)

Если работа с COM-объектами кажется слишком громоздкой или нестабильной, рассмотрим вариант с использованием «прослойки». Вы можете написать простейший скрипт на Python или PHP, который будет принимать обычные HTTP-запросы от 1С (через стандартное HTTPСоединение по порту 80) и пересылать их в Telegram по HTTPS.

Преимущества этого метода:

В завершение подчеркнем, что несмотря на ограничения режима совместимости 8.2, использование WinHttp.WinHttpRequest.5.1 в сочетании с ADODB.Stream предоставляет программисту полный контроль над сетевым взаимодействием и позволяет создавать полнофункциональных ботов для автоматизации бизнеса.

← На главную