Работа с веб-сервисами и сайтами в современных конфигурациях на платформе 8.3 кажется естественной благодаря объекту HTTPЗапрос. Однако разработчики, поддерживающие системы на базе 1С:Предприятие 8.2 (например, УТ 10.3 или УПП 1.3), часто сталкиваются с серьезными ограничениями. Встроенные механизмы старой платформы плохо справляются с современными протоколами безопасности (TLS 1.2+), некорректно обрабатывают автоматические перенаправления (редиректы) и не всегда позволяют гибко настроить заголовки запроса.
В данной статье мы разберем, как обойти эти ограничения, почему стандартное HTTPСоединение может выдавать фатальные ошибки, и как правильно использовать внешние компоненты для стабильного обмена данными.
Начнем с того, почему классический подход через Новый HTTPСоединение часто терпит неудачу на платформе 8.2. Проанализируем основные факторы:
ЗащищенноеСоединениеSSL. Вместо него в конструкторе HTTPСоединение шестым параметром передается простое логическое значение Истина, что ограничивает возможности тонкой настройки сертификатов.http://, а сервер требует https://, встроенный объект 1С может не отработать редирект автоматически, вернув пустой файл или ошибку разбора XML.Рассмотрим, как выглядел стандартный вызов в старых версиях:
// Пример для платформы 8.2.19 и выше
Соединение = Новый HTTPСоединение("edi.kontur.ru", , Логин, Пароль, , Истина);
// В более ранних версиях шестой параметр (Истина) отвечал за использование HTTPS
Если при выполнении этого кода 1С завершается с ошибкой или возвращает некорректный ответ, необходимо переходить на использование COM-объекта.
Для надежной работы с HTTPS и сложной авторизацией рекомендуется использовать системный COM-объект WinHttp.WinHttpRequest.5.1. Он позволяет напрямую управлять параметрами сессии, заголовками и методами запроса.
Разберем процесс реализации GET-запроса по шагам:
// Создаем объект
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Инициализируем запрос (Метод, URL, Асинхронно = Ложь)
URL = "https://edi.kontur.ru/api/v1/messages";
WinHttp.Open("GET", URL, Ложь);
// Установка таймаутов (в миллисекундах: разрешение, соединение, отправка, получение)
WinHttp.SetTimeouts(5000, 10000, 10000, 30000);
// Если требуется авторизация (0 - для сервера, 1 - для прокси)
WinHttp.SetCredentials(Логин, Пароль, 0);
// Отправка запроса
WinHttp.Send();
// Проверка статуса
Если WinHttp.Status = 200 Тогда
ТекстОтвета = WinHttp.ResponseText;
Сообщить("Данные получены успешно!");
Иначе
Сообщить("Ошибка запроса! Статус: " + WinHttp.Status);
КонецЕсли;
Часто даже WinHttpRequest может выдавать ошибку "SSL connect error". Это происходит из-за того, что объект пытается использовать протоколы безопасности, которые сервер считает небезопасными. Выясним, как принудительно включить поддержку TLS 1.2.
Для этого используется метод Option. Значение 2048 соответствует флагу SecureProtocol_TLS1_2. Добавьте эту строку сразу после создания объекта:
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Принудительно устанавливаем TLS 1.2
WinHttp.Option(9) = 2048;
Также важно правильно обрабатывать редиректы. За это отвечает опция №6 (EnableRedirects). По умолчанию она включена, но в некоторых случаях ее полезно переопределить:
WinHttp.Option(6) = Истина; // Разрешить автоматический редирект
Если после выполнения запроса вы получаете HTML-код страницы входа (логина), значит, простая передача логина и пароля через SetCredentials не сработала. Рассмотрим ситуацию на примере сервисов Контур.EDI.
Современные системы используют либо Bearer-токены в заголовках, либо Cookies. Чтобы получить данные, нам нужно сначала "залогиниться" POST-запросом, получить куки из ответа и передать их в следующем запросе за данными.
Проанализируем пример получения заголовков ответа:
ВсеЗаголовки = WinHttp.GetAllResponseHeaders();
// Здесь можно найти строку "Set-Cookie: ..."
// Для последующих запросов используем:
WinHttp.SetRequestHeader("Cookie", ЗначениеПолученныхКуки);
Когда данные получены в ResponseText, их нужно обработать. Если сервер вернул XML, мы сохраняем его во временный файл и используем встроенные средства 1С.
Рассмотрим правильный алгоритм обработки, чтобы избежать ошибок разбора (например, Opening and ending tag mismatch):
.xml.ЧтениеXML.ПостроительDOM.
ПутьКФайлу = ПолучитьИмяВременногоФайла("xml");
ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
ЗаписьТекста.Записать(WinHttp.ResponseText);
ЗаписьТекста.Закрыть();
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеXML);
// Далее работаем с узлами DOM
Исключение
Сообщить("Ошибка парсинга: " + ОписаниеОшибки());
КонецПопытки;
Важный совет: Если вы работаете с EDI-системами, помните, что исходные заказы (ORDER) обычно приходят в формате XML. Если ваша типовая обработка их не видит, проверьте, не фильтруются ли данные по статусам. Прямое обращение к API через WinHttpRequest позволяет забирать "сырые" данные напрямую с сервера, игнорируя ограничения интерфейса типовых модулей.
Мы выяснили, что для успешного получения данных с сайта в среде 1С 8.2 необходимо:
HTTPСоединение в пользу WinHttpRequest.5.1 для работы с HTTPS.Option(9).Cookie и Content-Type.DOM для парсинга сложных ответов.Этот подход превращает старую платформу в мощный инструмент интеграции, способный взаимодействовать с любыми современными веб-ресурсами.