При работе со старыми конфигурациями 1С (например, Управление торговлей 10.3 на платформе 8.2) часто возникает проблема взаимодействия с современными веб-сервисами по протоколу HTTPS. Стандартные механизмы платформы 8.2 не всегда корректно поддерживают современные протоколы шифрования (TLS 1.2+), что делает невозможным прямое использование объекта HTTPСоединение. В такой ситуации на помощь приходит использование внешнего COM-объекта WinHttp.WinHttpRequest.5.1.
В данной статье мы подробно разберем, как реализовать авторизацию на портале Контур.EDI, как правильно передавать заголовки, обрабатывать Cookies и решать типичные проблемы, такие как "кракозябры" в ответе сервера или ошибки безопасности.
Первое, с чем мы сталкиваемся при попытке подключения к edi.kontur.ru или auth.kontur.ru — это требование серверов использовать протокол безопасности TLS 1.2. Библиотека WinHttp по умолчанию в старых операционных системах может пытаться использовать устаревший SSL 3.0. Чтобы это исправить, нам необходимо принудительно установить параметры безопасности сразу после инициализации объекта.
Разберем базовую настройку объекта:
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Устанавливаем опцию 9 (WinHttpOption_SecureProtocols) в значение 2048 (TLS 1.2)
WinHttp.SetOption(9, 2048);
Без этой настройки вы, скорее всего, получите ошибку "Соединение принудительно разорвано удаленным узлом".
Авторизация в сервисах Контура (Контур.Паспорт) проходит в несколько этапов. Сначала нам нужно обратиться к странице авторизации, чтобы сервер выдал нам необходимые технические Cookies: Sticky, AntiForgery и ngtoken. Без них последующий POST-запрос с логином и паролем будет отклонен.
Рассмотрим код для получения первичных данных:
СерверАвторизации = "https://auth.kontur.ru/login?back=https%3A%2F%2Fedi.kontur.ru%2F";
WinHttp.Open("GET", СерверАвторизации, Ложь);
WinHttp.Send();
// Получаем все заголовки ответа, чтобы вытащить Cookies
ВсеЗаголовки = WinHttp.GetAllResponseHeaders();
// Извлекаем токены (в реальном коде стоит использовать функции поиска подстроки)
// Пример получения AntiForgery:
ПозТокена = СтрНайти(ВсеЗаголовки, "AntiForgery=");
Если ПозТокена > 0 Тогда
ТокенАнтифоржери = Сред(ВсеЗаголовки, ПозТокена + 12, 36);
КонецЕсли;
Важный нюанс: Обратите внимание на параметр back в URL. Он указывает серверу, куда перенаправить пользователя после успешного входа. Если его не указать, авторизация может пройти успешно для "Паспорта", но сессия для EDI не будет активирована.
Теперь, когда у нас есть первичные Cookies, мы должны отправить данные пользователя (логин и пароль) в формате JSON. На этом этапе критически важно правильно заполнить заголовки (Headers), имитируя работу реального браузера. Рассмотрим, какие заголовки являются обязательными.
// Настраиваем POST запрос
WinHttp.Open("POST", "https://auth.kontur.ru/api/authentication/password/auth-by-password", Ложь);
// Устанавливаем обязательные заголовки
WinHttp.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
WinHttp.SetRequestHeader("X-CSRF-Token", ТокенАнтифоржери);
WinHttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
// Формируем тело запроса в формате JSON
ТелоЗапроса = "{""Login"":""ВашЛогин"",""Password"":""ВашПароль"",""Remember"":false}";
WinHttp.Send(ТелоЗапроса);
// Проверяем результат
Если WinHttp.Status = 200 Тогда
Сообщить("Авторизация прошла успешно!");
// Теперь нужно сохранить полученные новые Cookies (auth.sid и token)
НовыеКуки = WinHttp.GetAllResponseHeaders();
КонецЕсли;
Часто программисты 1С сталкиваются с тем, что WinHttp.ResponseText возвращает нечитаемые символы. Проанализируем причину: современные серверы часто отправляют данные в сжатом виде (gzip). Объект WinHttpRequest не умеет автоматически распаковывать GZIP.
Чтобы решить эту проблему, проанализируем два подхода:
Accept-Encoding: gzip. Или принудительно установите WinHttp.SetRequestHeader("Accept-Encoding", "identity");. В этом случае сервер пришлет обычный текст.WinHttp.ResponseBody. Это массив байтов, который можно сохранить в файл или преобразовать в строку через ADODB.Stream.После успешной авторизации мы можем обращаться непосредственно к API EDI. Выясним причину, почему автору темы не удавалось найти данные о количестве товара в заказе. В структуре EDI Контура информация о заказах обычно хранится в сообщениях типа ORDERS.
Посмотрим на пример запроса списка сообщений:
WinHttp.Open("POST", "https://edi.kontur.ru/api/messages/list", Ложь);
// Не забываем передать накопленные Cookies
WinHttp.SetRequestHeader("Cookie", ВсеНакопленныеКуки);
// Формируем фильтр (например, за последние 20 сообщений)
ФильтрJSON = "{""query"":{""skip"":0,""take"":20}}";
WinHttp.Send(ФильтрJSON);
Результат = WinHttp.ResponseText;
Совет: Если вам нужно получить конкретные данные о количестве товара ("заказанное количество"), не пытайтесь парсить HTML-страницу сайта. Это крайне нестабильно. Используйте официальную документацию API Контура. Данные о количестве содержатся в теле сообщения в формате XML (узел ORDER-LINE, атрибут Quantity). Получив XML через WinHttp, используйте объект 1С ЧтениеXML для комфортной работы с данными.
Рассмотрим несколько практических советов, которые помогут вам сэкономить время:
WinHttp.SetRequestHeader("X-Requested-With", "XMLHttpRequest");. Если его нет, сервер может посчитать запрос "не от скрипта" и заблокировать его.WinHttp.SetTimeouts(5000, 5000, 10000, 15000);.Таким образом, использование WinHttp позволяет полноценно интегрировать старые версии 1С с современными защищенными сервисами. Несмотря на кажущуюся сложность работы с Cookies вручную, этот метод является наиболее гибким и не требует обновления платформы 1С до версии 8.3.