Имя: Пароль:
1C
1C 7.7
v7: Чтение XML POST - запросы
0 DeMi4
 
28.03.17
17:13
Есть вот такой запрос.

GetTask = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""; xmlns:ser=""http://serviceinterface_v1.b2b.audatex.com"">;
|   <soapenv:Header/>
|   <soapenv:Body>
|      <ser:getTaskRequest>
|         <!--Zero or more repetitions:-->
|         <ser:parameter xsltParameter=""?"">
|            <ser:name>loginId</ser:name>
|            <ser:value>VALUE_LOGINID</ser:value>
|         </ser:parameter>
|         <ser:parameter xsltParameter=""?"">
|            <ser:name>password</ser:name>
|            <ser:value>VALUE_PASSWORD</ser:value>
|         </ser:parameter>
|         <ser:parameter xsltParameter=""?"">
|            <ser:name>taskId</ser:name>
|            <ser:value>VALUE_TASKID</ser:value>
|         </ser:parameter>
|           <ser:parameter xsltParameter=""?"">
|            <ser:name>noAttachmentContents</ser:name>
|            <ser:value>true</ser:value>
|         </ser:parameter>
|          <ser:parameter xsltParameter=""?"">
|            <ser:name>nocalculation</ser:name>
|            <ser:value>false</ser:value>
|         </ser:parameter>
|      </ser:getTaskRequest>
|   </soapenv:Body>
|</soapenv:Envelope>";

Который отправляется на сервер вот таким образом

    МакетRequest = GetTask;
    Сообщить(МакетRequest);
    wsdlRequest = МакетRequest;
    wsdlRequest = СтрЗаменить(wsdlRequest, "VALUE_LOGINID", ЛОГИН);
    wsdlRequest = СтрЗаменить(wsdlRequest, "VALUE_PASSWORD", ПАРОЛЬ);
    wsdlRequest = СтрЗаменить(wsdlRequest, "VALUE_TASKID", TaskId);
    
    WinHTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.Option(2,"Windows-1251");
    
    WinHTTP.Open("POST", "https://www.audatex.ru/b2b/services/TaskService_v1?wsdl";, 0);
        
    WinHttp.SetRequestHeader("Accept-Language", "ru");
    WinHttp.SetRequestHeader("Accept-Charset","Windows-1251");
    WinHttp.setRequestHeader("Content-Language", "ru");
    WinHttp.setRequestHeader("Content-Charset", "Windows-1251");
    WinHTTP.setRequestHeader("Content-Type","text/xml;charset=utf-8");
    WinHTTP.setRequestHeader("Content-Length", СтрДлина(wsdlRequest));
    WinHTTP.setRequestHeader("SOAPAction", "'url'");
    
    WinHTTP.send(глПреобразоватьСтрокуВUTF8(wsdlRequest));
    Если (WinHTTP.Status = 200) Тогда
        Ответ = WinHTTP.ResponseText;
    Иначе
        Сообщить("Статус ответа WinHttpRequest " + Строка(WinHTTP.Status) + ", произошла ошибка!");
        Ответ = "";
    КонецЕсли;

    Возврат Ответ;

В ответе приходит XML, далее я пытаюсь обработать используя
        
ДОМ = CreateObject("Msxml2.DOMDocument");

        ДОМ.loadXML(ОТВЕТ);
        ДОМ.setProperty("SelectionLanguage", "XPath");

После чего 1С просто падает. Ответ прилетает большой, проблемы нет когда ответ не слишком большой.
1 Злопчинский
 
28.03.17
17:14
попробуй охрани ответ как файл
и уже потом файл курочь
??
2 Serginio1
 
28.03.17
17:20
Проще использовать Вэб сервис напрямую
Здесь есть примеры
Использование классов .Net в 1С для новичков

Кроме того можно использовать
Xdocument
Как указать Namespace при выборе тегов в хмл
3 DeMi4
 
28.03.17
19:45
нашел место где происходит затык и полное зависание при выполнении
ВыражениеXPath = ДОМ.SelectNodes("//*[local-name() = 'payload']");
причем с какими то ответами прилетающими с сервака все гуд а с какими то нет. Сохранял все в файлы разницы не обнаружил.
Может кто сталкивался?
4 DrShad
 
28.03.17
19:49
С чем сталкивался? Одному богу известно что тебе приходит и почему валится на простой выборке
5 DrShad
 
28.03.17
19:50
Сохрани ответ в файл и открой каким-то вьюером, увидишь ошибку
6 DeMi4
 
28.03.17
19:56
В том то и дело что файлы открываются нормальные, без каких либо нареканий,все нормально отображаются
7 trad
 
28.03.17
21:08
Не используй ResponseText. Смотри в сторону ResponseXML.
8 MWWRuza
 
гуру
30.03.17
08:35
Проблема известная.
Если файлы больше 570КБ, используйте альтернативные методы. Например:
Размер = Скрипт.Eval("LenB(WinHttp.responseBody)");
    Если (Размер > 570*1024) ИЛИ (Константа.ВсегдаИспользоватьCurl = 1) Тогда    // 1С падает, если размер файла больше 570 Кб
        WShell = СоздатьОбъект("WScript.Shell");
        ВременнаяПапка = WShell.ExpandEnvironmentStrings("%TEMP%") + "\";
        ПутьВременногоФайла = ПолучитьИмяВременногоФайла(ВременнаяПапка);
        Команда = "curl " + URL + " > " + ПутьВременногоФайла;
        КодВозврата = WShell.Run("%COMSPEC% /C "+Команда, 0, 1);
        Если КодВозврата <> 0 Тогда
            Предупреждение("Невозможно получить XML-файл. Возможно не установлен cUrl.");
            Сообщить("Пожалуйста, проверьте что УТМ запущен, а файл curl.exe (http://curl.haxx.se/download.html)
            | скопирован в папку Windows.");
            Возврат "";
        КонецЕсли;
        
        XML_DOM.Load(ПутьВременногоФайла);
        ФС.УдалитьФайл(ПутьВременногоФайла);
    Иначе
        Скрипт.Eval("Stream.Write(WinHttp.responseBody)");
        Стрим.Position = 0;
        Стрим.Type = 2;
        Стрим.Charset = "utf-8";
        Ответ = Стрим.ReadText();
        Стрим.Close();
        XML_DOM.LoadXML(Ответ);
    КонецЕсли;
9 MWWRuza
 
гуру
30.03.17
08:42
Код не мой, но я активно использую в своих разработках.
Смысл в том, что мелкие файлы, размером менее 570Кб, получаю напрямую, а если больше - то через утилиту curl. Все работает нормально. И для отправки аналогично.
10 Адинэснег
 
30.03.17
09:11
нафига внешние компоненты? средствами языка нельзя?
11 Адинэснег
 
30.03.17
09:12
а все, вижу, клюшки
12 DeMi4
 
30.03.17
12:06
спасибо буду пробовать
13 DeMi4
 
30.03.17
12:12
(8) А что за переменные такие скрипт и стрим?
14 trad
 
30.03.17
13:02
вместо этого:
WinHTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
WinHTTP.Open()
WinHTTP.send()
Ответ = WinHTTP.ResponseText;
ДОМ = CreateObject("Msxml2.DOMDocument");
ДОМ.loadXML(ОТВЕТ);

используй это:
XMLHTTP = СоздатьОбъект("Msxml2.ServerXMLHTTP");
XMLHTTP.open("GET", url, 0);
XMLHTTP.send();
ДОМ = XMLHTTP.responseXML;

- и не нужно никаких промежуточных строк, файлов и прочих обкладок
15 MWWRuza
 
гуру
30.03.17
20:38
(13)
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Стрим = СоздатьОбъект("ADODB.Stream");
16 DeMi4
 
31.03.17
13:45
Ну собственно в продлжение темы. Замучал меня этот ХМЛ. Решил опробовать и опкатать XMLHTTP = СоздатьОбъект("Msxml2.ServerXMLHTTP"); Запросы идут все прилетает. но возникла проблема с попыткой отпарсить
ВыражениеXPath = ДОМ.SelectNodes("//*[local-name() = 'payload']");

    сзВложенныеXML = СоздатьОбъект("СписокЗначений");
    Для Н = 1 ПО ВыражениеXPath.Length Цикл
        Узел = ВыражениеXPath.item(Н - 1);
        сзВложенныеXML.ДобавитьЗначение(Узел);
    КонецЦикла;
    //глПоказатьТЗ(ТаблицаСпискаДел);
    глПоказатьТЗ(сзВложенныеXML);
    //Возврат;
    Для ХМЛ = 1 По сзВложенныеXML.РазмерСписка() Цикл
        ХМЛЛУзелДОМ = сзВложенныеXML.ПолучитьЗначение(ХМЛ);
        ХМЛЛУзелДОМ - это IXMLDOMElement
Искомые мною ноды все есть но почему то я их не могу получить.
        Узел = ХМЛЛУзелДОМ.firstChild;
        //Сообщить(ХМЛЛУзелДОМ.nodeName);
        //Продолжить;
    //    РезультатVehicleIdentification = ХМЛЛУзелДОМ.SelectNodes("//*[local-name() = 'Task']/*[local-name() = 'BasicClaimData']/*[local-name() = 'Vehicle']/*[local-name() = 'VehicleIdentification']");
        РезультатVehicleIdentification = Узел.SelectNodes("//*[local-name() = 'Task']");
        Сообщить(РезультатVehicleIdentification.Length);
        Для х=1 По РезультатVehicleIdentification.Length Цикл
            УзелVehicleIdentification = РезультатVehicleIdentification.Item(х-1);
            //Сообщить(РезультатVehicleIdentification);
            Для хх=1 По УзелVehicleIdentification.childNodes.Length Цикл
                ЭлементDOM = УзелVehicleIdentification.ChildNodes.Item(хх-1);
                ИмяКолонки = ЭлементDOM.NodeName;
                //Попытка
                //    Если ТаблицаВозврата.ПолучитьПараметрыКолонки(ИмяКолонки) = 0 Тогда
                //        ТаблицаВозврата.НоваяКолонка(ИмяКолонки,,,,,25);
                //    КонецЕсли;
                //Исключение
                //    ТаблицаВозврата.НоваяКолонка(ИмяКолонки,,,,,25);
                //КонецПопытки;
                //
                //ТаблицаВозврата.УстановитьЗначение(СтрокаТаблицы, ИмяКолонки, ЭлементDOM.text);
                
                Если ИмяКолонки = "ManufacturerCodeAX" Тогда
                    ManufacturerCodeAX = СокрЛП(ЭлементDOM.ТекстовоеСодержимое);
                ИначеЕсли ИмяКолонки = "ModelCodeAX" Тогда
                    ModelCodeAX = СокрЛП(ЭлементDOM.ТекстовоеСодержимое);
                ИначеЕсли ИмяКолонки = "ManufacturerName" Тогда
                    ManufacturerName = СокрЛП(ЭлементDOM.ТекстовоеСодержимое);
                ИначеЕсли ИмяКолонки = "ModelName" Тогда
                    ModelName = СокрЛП(ЭлементDOM.ТекстовоеСодержимое);    
                ИначеЕсли ИмяКолонки = "VIN" Тогда
                    VIN = СокрЛП(ЭлементDOM.ТекстовоеСодержимое);    
                КонецЕсли;
            
            Сообщить("ManufacturerCodeAX - " + ManufacturerCodeAX + " ModelCodeAX - " + ModelCodeAX + " ManufacturerName - " + ManufacturerName + " ModelName - " + ModelName + " VIN - " + VIN);
                
                
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
17 trad
 
31.03.17
14:10
"Искомые мною ноды все есть но почему то я их не могу получить. "
какая конкретно строка кода не работает
18 totparen
 
31.03.17
14:18
19 DeMi4
 
31.03.17
14:26
(17) SelectNodes("//*[local-name() = 'Task']/*[local-name() = 'BasicClaimData']/*[local-name() = 'Vehicle']/*[local-name() = 'VehicleIdentification']");
20 trad
 
31.03.17
14:34
(19) если xpath не работает, то вероятно выражение неверно написано
тут надо смотреть сам xml и то что хочешь выбрать
21 DeMi4
 
31.03.17
14:40
(20) когда делаю сзВложенныеXML.ДобавитьЗначение(Узел.text); а потом засовываю в объект дом то все гуд, значит там все есть. Но если Узел.text получается очень большим то 1с валится(, вот я пробую передавать объекты которые содержат этот текст, но либо сам что то не так делаю либо вообще это не возможно.
22 trad
 
31.03.17
15:08
(21) хм.
в общем случае:
Узел1 = Узел
и
Узел2 = дом.load(Узел.text)
- не одно и тоже, хотя бы из-за используемых NS

Не исключено, что из-за этого разное поведение.
23 DeMi4
 
31.03.17
17:47
(8) а URL? я понимаю что ссылка, но на что?