При переходе с современных версий платформы 1С:Предприятие 8.3 на старые конфигурации под управлением 1С 8.1 разработчики часто сталкиваются с тем, что привычный объект HTTPЗапрос отсутствует. Этот конструктор появился только в более поздних релизах платформы и служил для гибкого формирования тела запроса, адреса и заголовков непосредственно в памяти.
В платформе 1С 8.1 механизм взаимодействия по HTTP имеет свои особенности и архитектурные ограничения. Разберем по шагам доступные способы реализации HTTP-запросов, проанализируем синтаксис штатных объектов, а также рассмотрим альтернативные варианты через COM-соединения и внешние утилиты.
В платформе 8.1 объект HTTPСоединение уже существует, однако логика его работы существенно отличается от современных версий. Главная особенность заключается в том, что платформа не умеет принимать или возвращать тело запроса строкой напрямую — все операции выполняются исключительно через физические файлы на диске.
Рассмотрим основные правила работы с HTTPСоединение в 8.1:
ПолучитьИмяВременногоФайла(). Ответ сервера также всегда сохраняется во временный файл.Соответствие, а единой текстовой строкой, где каждая пара отделяется двоеточием, а строки разделяются комбинацией символов возврата каретки и перевода строки: Символы.ВК + Символы.ПС.Разберем пример отправки 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Соединение:
Получить(АдресРесурса, ИмяФайлаОтвета, Заголовки) — выполняет GET-запрос.Записать(ИмяФайлаОтправки, АдресРесурса, Заголовки) — выполняет PUT-запрос.Удалить(АдресРесурса, ИмяФайлаОтвета, Заголовки) — выполняет DELETE-запрос.Важное ограничение: штатный механизм 1С 8.1 не поддерживает современные протоколы шифрования HTTPS (TLS 1.2 и TLS 1.3), так как в платформе отсутствует объект ЗащищенноеСоединениеOpenSSL. Попытка обратиться к защищенному веб-серверу через HTTPСоединение вызовет ошибку соединения.
Если требуется работать без создания временных файлов на диске, отправлять данные в памяти или выполнять 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:
WinHttp.Open() чаще всего вызвано некорректным URL (например, отсутствует префикс http:// или https://) либо передачей третьего параметра числом вместо булева значения Ложь.WinHttp.Option(9, 2048).Если возможности WinHttpRequest ограничены политиками безопасности или спецификой сети, можно применить следующие варианты:
WinHttp, стабилен в серверном окружении и позволяет настраивать таймауты и передачу данных в различных кодировках.ЗапуститьПриложение() или КомандаСистемы() с сохранением ответа в файл.Таким образом, отсутствие объекта HTTPЗапрос в 1С 8.1 успешно компенсируется правильным использованием методов HTTPСоединение через временные файлы или обращением к системному объекту WinHttp.WinHttpRequest.5.1.