Как отправлять HTTP-запросы в 1С 8.1 при отсутствии объекта HTTPЗапрос?

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

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

В платформе 1С 8.1 механизм взаимодействия по HTTP имеет свои особенности и архитектурные ограничения. Разберем по шагам доступные способы реализации HTTP-запросов, проанализируем синтаксис штатных объектов, а также рассмотрим альтернативные варианты через COM-соединения и внешние утилиты.

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

В платформе 8.1 объект HTTPСоединение уже существует, однако логика его работы существенно отличается от современных версий. Главная особенность заключается в том, что платформа не умеет принимать или возвращать тело запроса строкой напрямую — все операции выполняются исключительно через физические файлы на диске.

Рассмотрим основные правила работы с HTTPСоединение в 8.1:

  1. Работа через временные файлы: перед отправкой тело запроса (например, JSON, XML или форму параметров) необходимо записать во временный файл на диске с помощью ПолучитьИмяВременногоФайла(). Ответ сервера также всегда сохраняется во временный файл.
  2. Форматирование заголовков: заголовки HTTP передаются не объектом Соответствие, а единой текстовой строкой, где каждая пара отделяется двоеточием, а строки разделяются комбинацией символов возврата каретки и перевода строки: Символы.ВК + Символы.ПС.

Разберем пример отправки POST-запроса штатным методом ОтправитьДляОбработки():


// 1. Формируем тело запроса и сохраняем во временный файл
ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("txt");
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку("{""param"": ""value""}");
ЗаписьТекста.Закрыть();

// 2. Готовим имя файла для приема ответа от веб-сервера
ИмяФайлаОтвета = ПолучитьИмяВременногоФайла("txt");

// 3. Формируем строку HTTP-заголовков
Заголовки = "Content-Type: application/json; charset=utf-8" + Символы.ВК + Символы.ПС;
Заголовки = Заголовки + "Accept: application/json" + Символы.ВК + Символы.ПС;

// 4. Инициализируем соединение (указываем только имя хоста/сервера и порт)
Сервер = "api.example.com";
Порт = 80;
Соединение = Новый HTTPСоединение(Сервер, Порт, "ЛогинПользователя", "ПарольПользователя");

// 5. Выполняем отправку запроса
Попытка
    АдресРесурса = "/v1/data/upload";
    Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресРесурса, ИмяФайлаОтвета, Заголовки);
    
    // Читаем полученный ответ
    ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаОтвета, КодировкаТекста.UTF8);
    СтрокаОтвета = ЧтениеТекста.Прочитать();
    ЧтениеТекста.Закрыть();
    
    Сообщить("Ответ сервера: " + СтрокаОтвета);
Исключение
    Сообщить("Ошибка при отправке HTTP-запроса: " + ОписаниеОшибки());
КонецПопытки;

// 6. Обязательно удаляем временные файлы после завершения работы
УдалитьФайлы(ИмяФайлаОтправки);
УдалитьФайлы(ИмяФайлаОтвета);

Для выполнения других методов используются соответствующие функции объекта HTTPСоединение:

  1. Получить(АдресРесурса, ИмяФайлаОтвета, Заголовки) — выполняет GET-запрос.
  2. Записать(ИмяФайлаОтправки, АдресРесурса, Заголовки) — выполняет PUT-запрос.
  3. Удалить(АдресРесурса, ИмяФайлаОтвета, Заголовки) — выполняет DELETE-запрос.

Важное ограничение: штатный механизм 1С 8.1 не поддерживает современные протоколы шифрования HTTPS (TLS 1.2 и TLS 1.3), так как в платформе отсутствует объект ЗащищенноеСоединениеOpenSSL. Попытка обратиться к защищенному веб-серверу через HTTPСоединение вызовет ошибку соединения.

Способ 2. Использование COM-объекта WinHttp.WinHttpRequest.5.1

Если требуется работать без создания временных файлов на диске, отправлять данные в памяти или выполнять HTTPS-запросы к современным веб-серверам, отличным решением является системный COM-объект Windows WinHttp.WinHttpRequest.5.1.

Посмотрим на пример правильной инициализации и отправки POST-запроса:


Попытка
    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    
    // Адрес обязательно должен содержать схему протокола (http:// или https://) и полный путь
    АдресСтраницы = "https://api.example.com/v1/service";
    
    // Метод Open: первый параметр - метод (POST/GET/PUT/DELETE), второй - URL, третий - асинхронность (Ложь - синхронно)
    WinHttp.Open("POST", АдресСтраницы, Ложь);
    
    // Установка параметров безопасности (включение поддержки TLS 1.2 при необходимости)
    // Опция 9 отвечает за SecureProtocols: 2048 соответствует флагу TLS 1.2
    WinHttp.Option(9, 2048);
    
    // Игнорирование ошибок SSL-сертификатов (если сервер использует самоподписанный сертификат)
    WinHttp.Option(4, 256 + 512 + 4096 + 8192);
    
    // Задаем необходимые HTTP-заголовки
    WinHttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=windows-1251");
    WinHttp.SetRequestHeader("Accept-Language", "ru");
    WinHttp.SetRequestHeader("Accept-Charset", "Windows-1251");
    
    // Отправляем тело запроса
    ТелоЗапроса = "param1=value1¶m2=value2";
    WinHttp.Send(ТелоЗапроса);
    
    // Проверяем статус ответа и читаем результат
    КодСтатуса = WinHttp.Status;
    ТекстОтвета = WinHttp.ResponseText;
    
    Если КодСтатуса = 200 Тогда
        Сообщить("Успешный ответ: " + ТекстОтвета);
    Иначе
        Сообщить("Сервер вернул код: " + Строка(КодСтатуса) + ", Описание: " + WinHttp.StatusText);
    КонецЕсли;
Исключение
    Сообщить("Ошибка вызова WinHttp: " + ОписаниеОшибки());
КонецПопытки;

Разберем типичные ошибки при работе с WinHttpRequest:

  1. Ошибка в методе Open: падение на строке вызова WinHttp.Open() чаще всего вызвано некорректным URL (например, отсутствует префикс http:// или https://) либо передачей третьего параметра числом вместо булева значения Ложь.
  2. Ошибки SSL/TLS: по умолчанию старые библиотеки Windows могут пытаться использовать SSLv3 или TLS 1.0. Для обращения к современным API обязательно передавайте опцию поддержки TLS 1.2 через WinHttp.Option(9, 2048).

Способ 3. Альтернативные инструменты (MSXML2 и внешняя утилита cURL)

Если возможности WinHttpRequest ограничены политиками безопасности или спецификой сети, можно применить следующие варианты:

  1. COM-объект MSXML2.ServerXMLHTTP.6.0: работает аналогично WinHttp, стабилен в серверном окружении и позволяет настраивать таймауты и передачу данных в различных кодировках.
  2. Консольная утилита cURL: наиболее универсальный способ для 8.1 при работе со сложными протоколами авторизации (OAuth 2.0, Bearer-токены, NTLM), нестандартными методами (PATCH, OPTIONS) или составными запросами (multipart/form-data). Запуск утилиты выполняется через метод платформы ЗапуститьПриложение() или КомандаСистемы() с сохранением ответа в файл.

Таким образом, отсутствие объекта HTTPЗапрос в 1С 8.1 успешно компенсируется правильным использованием методов HTTPСоединение через временные файлы или обращением к системному объекту WinHttp.WinHttpRequest.5.1.

← На главную