Как в 1С 8.2 получить данные с сайта через HTTP и решить проблему с SSL-соединением?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Работа с веб-сервисами и сайтами в современных конфигурациях на платформе 8.3 кажется естественной благодаря объекту HTTPЗапрос. Однако разработчики, поддерживающие системы на базе 1С:Предприятие 8.2 (например, УТ 10.3 или УПП 1.3), часто сталкиваются с серьезными ограничениями. Встроенные механизмы старой платформы плохо справляются с современными протоколами безопасности (TLS 1.2+), некорректно обрабатывают автоматические перенаправления (редиректы) и не всегда позволяют гибко настроить заголовки запроса.

В данной статье мы разберем, как обойти эти ограничения, почему стандартное HTTPСоединение может выдавать фатальные ошибки, и как правильно использовать внешние компоненты для стабильного обмена данными.

Причины проблем при использовании стандартного HTTPСоединение

Начнем с того, почему классический подход через Новый HTTPСоединение часто терпит неудачу на платформе 8.2. Проанализируем основные факторы:

  1. Отсутствие поддержки современных протоколов TLS: Старые версии платформы (до 8.2.19) используют системные библиотеки Windows, которые по умолчанию могут быть настроены на устаревшие протоколы SSL 3.0 или TLS 1.0. Большинство современных сайтов (включая API Контур.EDI, Яндекс и др.) требуют минимум TLS 1.2.
  2. Синтаксические различия: В платформе 8.2 отсутствует объект ЗащищенноеСоединениеSSL. Вместо него в конструкторе HTTPСоединение шестым параметром передается простое логическое значение Истина, что ограничивает возможности тонкой настройки сертификатов.
  3. Ошибка 301 (Moved Permanently): Если вы обращаетесь по адресу http://, а сервер требует https://, встроенный объект 1С может не отработать редирект автоматически, вернув пустой файл или ошибку разбора XML.

Рассмотрим, как выглядел стандартный вызов в старых версиях:


// Пример для платформы 8.2.19 и выше
Соединение = Новый HTTPСоединение("edi.kontur.ru", , Логин, Пароль, , Истина);
// В более ранних версиях шестой параметр (Истина) отвечал за использование HTTPS

Если при выполнении этого кода 1С завершается с ошибкой или возвращает некорректный ответ, необходимо переходить на использование COM-объекта.

Использование WinHttpRequest как универсальное решение

Для надежной работы с 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);
КонецЕсли;

Решение проблемы с SSL и TLS 1.2

Часто даже 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) = Истина; // Разрешить автоматический редирект

Авторизация и Cookies

Если после выполнения запроса вы получаете HTML-код страницы входа (логина), значит, простая передача логина и пароля через SetCredentials не сработала. Рассмотрим ситуацию на примере сервисов Контур.EDI.

Современные системы используют либо Bearer-токены в заголовках, либо Cookies. Чтобы получить данные, нам нужно сначала "залогиниться" POST-запросом, получить куки из ответа и передать их в следующем запросе за данными.

Проанализируем пример получения заголовков ответа:


ВсеЗаголовки = WinHttp.GetAllResponseHeaders();
// Здесь можно найти строку "Set-Cookie: ..."
// Для последующих запросов используем:
WinHttp.SetRequestHeader("Cookie", ЗначениеПолученныхКуки);

Парсинг полученных данных (XML и HTML)

Когда данные получены в ResponseText, их нужно обработать. Если сервер вернул XML, мы сохраняем его во временный файл и используем встроенные средства 1С.

Рассмотрим правильный алгоритм обработки, чтобы избежать ошибок разбора (например, Opening and ending tag mismatch):

  1. Сохраняем ответ во временный файл с расширением .xml.
  2. Используем объект ЧтениеXML.
  3. Если XML содержит ошибки в структуре (часто бывает при парсинге "грязного" HTML), используем ПостроительDOM.

ПутьКФайлу = ПолучитьИмяВременногоФайла("xml");
ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
ЗаписьТекста.Записать(WinHttp.ResponseText);
ЗаписьТекста.Закрыть();

ЧтениеXML = Новый ЧтениеXML;
Попытка
    ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
    ПостроительDOM = Новый ПостроительDOM;
    ДокументHTML = ПостроительDOM.Прочитать(ЧтениеXML);
    // Далее работаем с узлами DOM
Исключение
    Сообщить("Ошибка парсинга: " + ОписаниеОшибки());
КонецПопытки;

Важный совет: Если вы работаете с EDI-системами, помните, что исходные заказы (ORDER) обычно приходят в формате XML. Если ваша типовая обработка их не видит, проверьте, не фильтруются ли данные по статусам. Прямое обращение к API через WinHttpRequest позволяет забирать "сырые" данные напрямую с сервера, игнорируя ограничения интерфейса типовых модулей.

Заключение

Мы выяснили, что для успешного получения данных с сайта в среде 1С 8.2 необходимо:

Этот подход превращает старую платформу в мощный инструмент интеграции, способный взаимодействовать с любыми современными веб-ресурсами.

← На главную