Почему не работает отправка сообщений в Telegram из 1С в режиме совместимости 8.2.16?

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

При попытке интеграции 1С с внешними API, такими как Telegram, разработчики часто сталкиваются с ограничениями старых версий платформы. В данной статье мы разберем, почему код, работающий в режиме совместимости 8.3.16, выдает ошибку 400 Bad Request при переключении на режим 8.2.16, и как правильно реализовать обмен данными в таких условиях.

Разбор причин возникновения ошибки

Проанализируем ситуацию: при работе в режиме совместимости 8.2.16 вы получаете сообщение {"ok":false,"error_code":400,"description":"Bad Request: message text is empty"}. Основная причина кроется в двух аспектах:

  1. Отсутствие поддержки JSON в платформе 8.2. Объекты ЗаписьJSON и ЧтениеJSON, а также методы глобального контекста ЗаписатьJSON были внедрены только начиная с версии 8.3.6. В режиме совместимости с 8.2 эти механизмы недоступны, поэтому попытка их вызова приведет к ошибке выполнения.
  2. Использование метода GET для передачи тела запроса. В коде используется метод HTTPСоединение.Получить(). Согласно спецификации HTTP, метод GET не предполагает наличия тела запроса (body). Платформа 1С в ранних версиях строго следовала этому стандарту и при вызове метода «Получить» просто игнорировала установленное тело запроса, из-за чего сервер Telegram получает пустые параметры и возвращает ошибку.

Шаг 1: Формирование JSON вручную

Поскольку встроенные инструменты сериализации нам недоступны, сформируем JSON-строку вручную. Это классический подход для старых версий 1С. Важно помнить, что при ручном формировании необходимо следить за корректностью кавычек и спецсимволов.

Рассмотрим пример формирования строки:


// Пример формирования JSON вручную
СтрокаJSON = "{""chat_id"":""" + Объект.Получатель + """, " +
             """text"":""" + СтрЗаменить(Объект.ТекстСообщения, """", "\""") + """, " +
             """parse_mode"":""Markdown""}";

Обратите внимание: мы используем двойные кавычки для экранирования внутри строкового литерала 1С. Также рекомендуется использовать функцию СтрЗаменить для того, чтобы кавычки внутри текста сообщения не «ломали» структуру вашего JSON.

Шаг 2: Правильная отправка HTTP-запроса через POST

Теперь, когда у нас есть корректная строка данных, нам необходимо отправить ее так, чтобы сервер Telegram гарантированно получил тело запроса. Для этого используем метод ОтправитьДляОбработки (аналог POST), вместо Получить (GET).

Давайте посмотрим, как должен выглядеть исправленный фрагмент кода:


// Настройка запроса
HTTPЗапрос = Новый HTTPЗапрос;
HTTPЗапрос.АдресРесурса = "/" + Token + "/sendMessage";
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json; charset=utf-8");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);

// Использование POST метода
HTTPСоединение = Новый HTTPСоединение("api.telegram.org", 443, , , , 20, Новый ЗащищенноеСоединениеOpenSSL);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

// Проверка результата
Если HTTPОтвет.КодСостояния = 200 Тогда
    // Обработка успешного ответа
Иначе
    // Анализ ошибки
    Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;

Рекомендации по реализации

При работе в режиме совместимости с устаревшими версиями платформы всегда придерживайтесь следующих правил:

Таким образом, переписав код на ручное формирование строки и сменив метод передачи на ОтправитьДляОбработки, вы решите проблему совместимости и обеспечите стабильную работу вашего функционала даже в ограниченной среде 8.2.16.

← На главную