Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
02 окт 2022, 13:52

Запрос к сайту с SSL соединением на версии 8.1

Автор PavelVaskan, 18 авг 2022, 09:29

0 Пользователей и 1 гость просматривают эту тему.

PavelVaskan

По условиям задачи надо сделать запрос (VIES) по регистрационному номеру Контрагента (аналог российского ИНН) к сайту ec.europa.eu на платформе 8.1. Беда в том, что сайт работает только с SSL соединением, которое не поддерживается версией 8.1 (SSL поддерживается только начиная с версии 8.3.5.1119). В прошлый раз аналогичную проблему (к другому сайту) удалось решить с помощью COMОбъект("WinHttp.WinHttpRequest.5.1"), в этот раз пока не удаётся - при попытке запроса выдаёт ошибку:

ЦитироватьОшибка при вызове метода контекста (Open): Произошла исключительная ситуация (WinHttp.WinHttpRequest): The URL does not use a recognized protocol

Задачу сначала решил коллега для 8.3 . Начальство сказало - сделать на 8.1 "как там, как он". Его код на 8.3 выглядит так
(где strCountry - код страны ("RU", "LV" и т.д.), strReg - регистрационный номер - он же ИНН):


Function ExecHTTP()

strReg = TrimAll(РегНом);
strCountry = TrimAll(КодСтраны);

If Upper(Left(strReg, 2)) = Upper(strCountry) Then
strReg = TrimAll(Mid(strReg, 3));
EndIf;

Stru = RestoreValue("InternetSettings");

If TypeOf(Stru) = Type("Structure") And Stru.UseProxy Then
Proxy = New InternetProxy();
Try
Proxy.Set("https", Stru.Server, Stru.Port,,, False);
Except
Proxy.Set("https", Stru.Server, Stru.Port);
EndTry;
Proxy.Password = Stru.Password;
Proxy.User = Stru.User;
  Proxy.BypassProxyOnLocal = True;

HTTP = CreateConnectHTTPS(Proxy);
Else
HTTP = CreateConnectHTTPS();
EndIf;

Headers = New Map;
Headers.Insert("Host",    "ec.europa.eu");
Headers.Insert("Accept", "*/*");
Headers.Insert("Accept-Encoding", "utf-8");
Headers.Insert("Connection", "keep-alive");

strURL = ФункцииПрочее.FormatMSG("/taxation_customs/vies/rest-api/ms/%1/vat/%2", strCountry, strReg);
Request = New HTTPRequest(strURL, Headers);
Try
Response = HTTP.CallHTTPMethod("GET", Request);
Except
Message(NStr("lv='Savienojuma kļūda ar serveri [';ru='Ошибка соединения с сервером ['")+ErrorDescription()+"]", MessageStatus.Important);
Return Undefined;                                         
EndTry;

strJSON = Response.GetBodyAsString("UTF-8");

JReader = New JSONReader;
Try
JReader.SetString(strJSON);
Except
Message(NStr("lv='Savienojuma kļūda ar serveri [';ru='Ошибка соединения с сервером ['")+ErrorDescription()+"]", MessageStatus.Important);
Return Undefined;                                         
EndTry;

JRez = ReadJSON(JReader);

Return JRez;

EndFunction

Function CreateConnectHTTPS(Proxy = Undefined)

Try
_ssl = New OpenSSLSecureConnection;
HTTP = New HTTPConnection("ec.europa.eu",,,, Proxy,, _ssl);
Except
HTTP = New HTTPConnection("ec.europa.eu",,,, Proxy, True);
EndTry;

Return HTTP;

EndFunction

......

Function FormatMSG(Val strMSG, strP1 = Undefined,
strP2 = Undefined,
strP3 = Undefined,
strP4 = Undefined,
strP5 = Undefined,
strP6 = Undefined,
strP7 = Undefined,
strP8 = Undefined,
strP9 = Undefined,
strP10 = Undefined) Export

For a = 1 To 10 Do
strNr = 11 - a; // 10, 9, 8, 7, .. 1 (по убыванию)
    strPar = "%"+strNr;
strVal = Eval("strP"+strNr);
If Not strVal = Undefined Then
strMSG = StrReplace(strMSG, strPar, strVal);
EndIf;
EndDo;

Return strMSG;

EndFunction


Функция ExecHTTP() выдаёт в результате структуру (JRez), содержащую элементы "name" и "address" (название и адрес контрагента), взяв их с сайта...

У меня на 8.1 пока результаты:

1. HTTPСоединение без ssl выдаёт ошибку SSL

ЦитироватьОшибка при вызове метода контекста (Получить): Ошибка работы с Интернет:  SSL connect error

2. Варианты кода с WinHttp.WinHttpRequest.5.1

    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", "ec.europa.eu", Ложь);
WinHttp.Option(2, "UTF-8");
If TypeOf(Stru) = Type("Structure") And Stru.UseProxy Then
WinHttp.SetProxy(2, СокрЛП(Stru.Server)+":"+Формат(Stru.Port, "ЧГ=0"));
WinHttp.SetCredentials(Stru.User, Stru.Password, 1);
EndIf;



WinHttp.SetRequestHeader ("Host", "ec.europa.eu");
WinHttp.SetRequestHeader ("Accept", "*/*");
WinHttp.SetRequestHeader ("Accept-Encoding", "utf-8");
WinHttp.SetRequestHeader ("Connection", "keep-alive");

strURL = FormatMSG("/taxation_customs/vies/rest-api/ms/%1/vat/%2", strCountry, strReg);

Try

WinHttp.Open("GET", strURL, Ложь);
//WinHttp.Open("GET", "ec.europa.eu" + strURL, Ложь);
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
JRez = WinHttp.ResponseText;
Иначе
Сообщить("HTTP " + WinHttp.Status + " " + WinHttp.StatusText);
Message(NStr("lv='Savienojuma kļūda ar serveri [';ru='Ошибка соединения с сервером ['")+ErrorDescription()+"]", MessageStatus.Important);
Возврат Undefined;
КонецЕсли;

Except
Message(NStr("lv='Savienojuma kļūda ar serveri [';ru='Ошибка соединения с сервером ['")+ErrorDescription()+"]", MessageStatus.Important);
Возврат Undefined;
EndTry;           

и


    Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"utf-8");
WinHttp.Open("POST","ec.europa.eu",0);
WinHttp.SetRequestHeader ("Host", "ec.europa.eu");
WinHttp.SetRequestHeader ("Accept", "*/*");
WinHttp.SetRequestHeader ("Accept-Encoding", "utf-8");
WinHttp.SetRequestHeader ("Connection", "keep-alive");

//ПараметрыПОСТ = "rwID=" + СокрЛП(НомерНакладной);
ПараметрыПОСТ = FormatMSG("/taxation_customs/vies/rest-api/ms/%1/vat/%2", strCountry, strReg);

WinHttp.Send(ПараметрыПОСТ);
ТекстОтвета = WinHttp.ResponseText();
Исключение
//Сообщить("HTTP " + WinHttp.Status + " " + WinHttp.StatusText);
Сообщить(ОписаниеОшибки());
КонецПопытки;



выдают ошибку:

ЦитироватьПроизошла исключительная ситуация (WinHttp.WinHttpRequest): The URL does not use a recognized protocol
:(.

НУЖНА ПОМОЩЬ ВЭБ-СПЕЦИАЛИСТОВ В ОБЛАСТИ COMОбъект("WinHttp.WinHttpRequest.5.1") для 1С 8.1 ! B)

Кто-то может помочь, чтобы заработало? Спасибо за любую помощь!..

Насчёт погуглить - гугл уже весь с яндексом перерыл... Решения не нашёл пока...

PavelVaskan

Настройки сайта (версия протокола SSL и другие secure connectiom settings):

Настройки_Сайта_.jpg

PavelVaskan

РАЗГРЫЗЛИ!

 :zebzdr:  :befhbt:
Правильный код на 8.1:

Function ExecHTTP()

strReg = TrimAll(РегНом);
strCountry = TrimAll(КодСтраны);
If Upper(Left(strReg, 2)) = Upper(strCountry) Then
strReg = TrimAll(Mid(strReg, 3));
EndIf;

Stru = RestoreValue("InternetSettings");
JRez = Undefined;

strURL = FormatMSG("https://ec.europa.eu/taxation_customs/vies/rest-api/ms/%1/vat/%2", strCountry, strReg);
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", strURL, Ложь);
If TypeOf(Stru) = Type("Structure") And Stru.UseProxy Then
WinHttp.SetProxy(2, СокрЛП(Stru.Server)+":"+Формат(Stru.Port, "ЧГ=0"));
WinHttp.SetCredentials(Stru.User, Stru.Password, 1);
EndIf;

WinHttp.SetRequestHeader("Content-type", "application/json");
WinHttp.SetRequestHeader ("Host", "ec.europa.eu");
WinHttp.SetRequestHeader ("Accept", "*/*");
WinHttp.SetRequestHeader ("Accept-Encoding", "utf-8");
WinHttp.SetRequestHeader ("Connection", "keep-alive");

Try
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
JRez = WinHttp.ResponseText;
Иначе
Сообщить("HTTP " + WinHttp.Status + " " + WinHttp.StatusText);
Message(NStr("lv='Savienojuma kļūda ar serveri [';ru='Ошибка соединения с сервером ['")+ErrorDescription()+"]", MessageStatus.Important);
Возврат Undefined;
КонецЕсли;
Except
Message(NStr("lv='Savienojuma kļūda ar serveri [';ru='Ошибка соединения с сервером ['")+ErrorDescription()+"]", MessageStatus.Important);
Возврат Undefined;
EndTry;

ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(JRez); 

Попытка

Результат = Новый Структура("isValid, name, address", ЛОЖЬ, "", "");
ПозицияName = Найти(JRez, "name");
ПозицияAdr = Найти(JRez, "address");

Если ПозицияName > 0 Тогда

ТекФрагмент = СокрЛП(Сред(JRez, ПозицияName + 9));
ПозицияПС = Найти(ТекФрагмент, Символы.ПС);
ТекФрагмент = СтрЗаменить(СокрЛП(Лев(ТекФрагмент, ПозицияПС - 3)), "\", "");
Результат.name = ТекФрагмент;
Результат.isValid = ИСТИНА;

КонецЕсли;

Если ПозицияAdr > 0 Тогда

ТекФрагмент = СокрЛП(Сред(JRez, ПозицияAdr + 12));
ПозицияПС = Найти(ТекФрагмент, Символы.ПС);
ТекФрагмент = СтрЗаменить(СокрЛП(Лев(ТекФрагмент, ПозицияПС - 3)), "\", "");
Результат.address = ТекФрагмент;
//Результат.isValid = ИСТИНА;

КонецЕсли;

Если Результат.isValid Тогда

JRez = Результат;

КонецЕсли;

Исключение
КонецПопытки;

Return JRez;

EndFunction


Теги: #ssl #8.1 

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск