Имя: Пароль:
1C
1C 7.7
v7: Отправка xml в УТМ при помощи MSXML2.ServerXMLHTTP
0 Pedroshitel
 
19.10.16
17:29
Собственно целью является отправка xml на сервер УТМ ЕГАИС. На примере запроса номенклатуры по коду ЕГАИС. Использую для этого MSXML2.ServerXMLHTTP, а для формирования файла Msxml2.DOMDocument

Сам код:
    Попытка
        HTTPxml = CreateObject("MSXML2.ServerXMLHTTP."+"6"+".0");    
    Исключение  
        Сообщить(ОписаниеОшибки(),"!");
        Возврат;
    КонецПопытки;
    
    Попытка
        Http = CreateObject("Msxml2.DOMDocument");    
    Исключение  
        Сообщить(ОписаниеОшибки(),"!");
        Возврат;
    КонецПопытки;
    
    Http.appendChild(Http.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"));
    Documents         = Http.appendChild(Http.createElement("ns:Documents"));
    Documents.setAttribute("Version","1.0");
    Documents.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance";);
    Documents.setAttribute("xmlns:ns","http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01";);
    Documents.setAttribute("xmlns:qp","http://fsrar.ru/WEGAIS/QueryParameters";);
    Owner             = Documents.appendChild(Http.createElement("ns:Owner"));
    FSRAR_ID         = Owner.appendChild(Http.createElement("ns:FSRAR_ID"));  
    FSRAR_ID.text     = "НАШ_ИД";
    Document         = Documents.appendChild(Http.createElement("ns:Document"));  
    QueryAP         = Document.appendChild(Http.createElement("ns:QueryAP"));  
    Parameters         = QueryAP.appendChild(Http.createElement("qp:Parameters"));
    Parameter         = Parameters.appendChild(Http.createElement("qp:Parameter"));  
    Name             = Parameter.appendChild(Http.createElement("qp:Name"));  
    Name.text         = "КОД";
    Value             = Parameter.appendChild(Http.createElement("qp:Value"));  
    Value.text         = "0150117000002012280";
        
    Http.Save("F:\"+"post.txt");
    ИмяФайлаОтправки = "F:\"+"post.txt";
    
    Boundary = "934726d4c90f47449f0423353e74f586";
    ТекстОбраб.ВставитьСтроку(1,"--"+Boundary);
    ТекстОбраб.ВставитьСтроку(2,"Content-Disposition: form-data; name=""xml_file""; filename=""" + "file.xml" + """");
    ТекстОбраб.ВставитьСтроку(3,"Content-Type: text/xml; charset=utf-8");
    ТекстОбраб.ВставитьСтроку(4,"");
        
    КолТекстСтрок = ТекстОбраб.КоличествоСтрок();
    ПоследняяСтрока = ТекстОбраб.ПолучитьСтроку(КолТекстСтрок-1);
    ТекстОбраб.ЗаменитьСтроку(КолТекстСтрок-1,ПоследняяСтрока+"--"+Boundary+"--");
    
    ТекстОбраб.Записать(ИмяФайлаОтправки);
    
    HTTPxml.Open("POST", "http://"+"нашУТМ"+"/opt/in/QueryAP";, -1); //асинхронный запрос
    
    ФС.АтрибутыФайла(ИмяФайлаОтправки,РазмерФайла);
    HTTPxml.SetRequestHeader("Content-Type","multipart/form-data; boundary="+СокрЛП(Boundary));
    HTTPxml.SetRequestHeader("Content-Charset","utf-8");
    HTTPxml.SetRequestHeader("Content-Length", СокрЛП(РазмерФайла));
    HTTPxml.Send(ИмяФайлаОтправки);
    
    Состояние("Ожидание ответа на запрос...");
    ВремяОжидания = 0;
    Пока HTTPxml.ReadyState <> 4 Цикл
        Состояние("Ожидание ответа на запрос... "+Строка(ВремяОжидания)+"s");
    КонецЦикла;          
    Состояние("");
    
    Response = HTTPxml.ResponseXML;
    Если ПустоеЗначение(Response.XML) = 1 Тогда
        //XML в ответе нет, есть только текст
        Response = HTTPxml.ResponseText;
    Иначе //объект типа MSXML2.DOMDocument.<MSXMLver>.0    
        Если ФС.СуществуетФайл(КаталогВременныхФайлов()+"logEGAIS") = 0 Тогда
            ФС.СоздатьКаталог(КаталогВременныхФайлов()+"logEGAIS");
        КонецЕсли;    
        Response.Save(КаталогВременныхФайлов()+"logEGAIS\"+"\"+ПреобразоватьURLвФайл("http://"+"10.189.7.1:8080"+"/opt/in/QueryAP";));
    КонецЕсли;
    
    Response = HTTPxml.ResponseText;
    Сообщить(Response);
1 Pedroshitel
 
19.10.16
17:31
Файл, который формируется, нормальный, проверено на аналогичном коде в 8.2 . Судя по ответу от сервера сама проблема в заголовках.
Собственно сам ответ:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /opt/in/QueryAP. Reason:
<pre>    Server Error</pre></p><h3>Caused by:</h3><pre>java.lang.RuntimeException: java.io.IOException: Missing initial multi part boundary
    at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:500)
    at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:417)
    at org.eclipse.jetty.server.Request.extractParameters(Request.java:363)
    at org.eclipse.jetty.server.Request.getParameterMap(Request.java:1003)
    at es.programador.http.ClientDocumentServlet.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at es.programador.http.ClientDocumentServlet.service(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
    at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:56)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
    at org.eclipse.jetty.server.Server.handle(Server.java:517)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Missing initial multi part boundary
    at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:511)
    at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:405)
    at org.eclipse.jetty.server.Request.getParts(Request.java:2311)
    at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:495)
    ... 31 more
</pre>
<h3>Caused by:</h3><pre>java.io.IOException: Missing initial multi part boundary
    at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:511)
    at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:405)
    at org.eclipse.jetty.server.Request.getParts(Request.java:2311)
    at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:495)
    at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:417)
    at org.eclipse.jetty.server.Request.extractParameters(Request.java:363)
    at org.eclipse.jetty.server.Request.getParameterMap(Request.java:1003)
    at es.programador.http.ClientDocumentServlet.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at es.programador.http.ClientDocumentServlet.service(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
    at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:56)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
    at org.eclipse.jetty.server.Server.handle(Server.java:517)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
    at java.lang.Thread.run(Unknown Source)
</pre>
<hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.5.v20151012</a><hr/>

</body>
</html>
2 Pedroshitel
 
19.10.16
17:33
Сделал вывод(да и гугл помог) Missing initial multi part boundary указывает на неправильный заголовок или неполный. Повторюсь в 8.2 такие заголовки и такой файл легко проходят. Буду рад любой помощи)
3 Serginio1
 
19.10.16
17:41
4 VoditelKobyly
 
20.10.16
06:19
Перед отправкой в ЕГАИС прогоняю файл через функцию:
//======================================================================
Функция ПодготовитьТекстЗапросаУТМ(пИмяФ)
    Перем лТекстXMLФайла,лТекстДляОтправки;
    
    лТекстXMLФайла=СоздатьОбъект("ADODB.Stream");
    лТекстXMLФайла.Type=2;
    лТекстXMLФайла.charset="utf-8";
    лТекстXMLФайла.Open();
    лТекстXMLФайла.LoadFromFile(пИмяФ);
    
    лТекстДляОтправки    = "--"+мРазделительХМЛ;
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "Content-Disposition: form-data; name=""xml_file""; filename=""client.xml""";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "Content-Type: application/xml";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + лТекстXMLФайла.ReadText();
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "--"+мРазделительХМЛ+"--";
    
    Возврат лТекстДляОтправки;
    
КонецФункции // ПодготовитьТекстКОтправке(ИмяФ);
5 Pedroshitel
 
20.10.16
16:36
Ну да, это хороший способ привести файл к utf-8,но проблемы это не решает. Заголовки внутри файла у меня и так прописаны, более того по сути на УТМ можно отправлять и просто txt файл, не обязательно xml. Поэтому я думаю, что проблема и ошибка "Missing initial multi part boundary" относится к вот этому коду:     HTTPxml.Open("POST", "http://"+"нашУТМ"+"/opt/in/QueryAP";;, -1); //асинхронный запрос

    

    ФС.АтрибутыФайла(ИмяФайлаОтправки,РазмерФайла);

    HTTPxml.SetRequestHeader("Content-Type","multipart/form-data; boundary="+СокрЛП(Boundary));

    HTTPxml.SetRequestHeader("Content-Charset","utf-8");

    HTTPxml.SetRequestHeader("Content-Length", СокрЛП(РазмерФайла));

    HTTPxml.Send(ИмяФайлаОтправки);

Тут в принципе из заголовка даже можно убрать "Content-Charset". Если например я буду в функцию Send передавать просто текст, то все заработает, но я хочу именно файл передать.
6 Serginio1
 
20.10.16
18:02
Берешь в руки фиддлер и сравниваешь.
А вообще для 7 ки 3 самое то
http://ru.stackoverflow.com/questions/527763/%d0%9a%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-c-%d0%b2-1%d0%a1/527802#527802

Чем использовать древние инструменты.
7 VoditelKobyly
 
24.10.16
08:30
(5) Когда я писал обмен с УТМ и ловил такую ошибку, то проблема оказалась именно в правильном оформлении.
Не настаиваю, может это было только у меня так. Из восьмерки запросы шли, а из семерки эти же запросы постоянно выдавали ошибки.
(6) Это все хорошо, но для меня это тёмный лес.
8 Serginio1
 
24.10.16
10:00
(7) Так там примеры есть. При этом проще чем MSXML2.ServerXMLHTTP
А Фиддлер http://www.telerik.com/fiddler  это один из самых используемых снифферов