Пример HTTP запроса к УТМ ЕГАИС на платформе 1С 7.7

Запрос реализован на объекте ServerXMLHTTP из встроенной в Windows библиотеки MSXML,
результатом запроса является XML объект DOMDocument из той же библиотеки MSXML со встроенным интерфейсом его обработки

Предлагаю Вашему вниманию пример HTTP запроса к Универсальному транспортному модулю Единой государственной автоматизированной информационной системы на платформе 1С 7.7.

Поскольку встроенный язык 1С 7.7 не содержит инструменты для работы с HTTP и XML, запрос реализован на объекте ServerXMLHTTP из библиотеки MSXML.
Это решение обладает рядом преимуществ:

+ не используется внешняя утилита CURL, процесс отправки запроса полностью контролируется из кода 1С
+ не требуются внешние библиотеки типа v7plus.dll, объект встроен в операционую систему Windows
+ результатом запроса является XML объект DOMDocument из той же библиотеки MSXML со встроенным интерфейсом его обработки,
т.е. для распознавания XML ответа на запрос также не требуются внешние библиотеки и сторонние парсеры.

Документация на используемые объекты размещена на сайте «мелкомягкого»:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms760218%28v=vs.85%29.aspx

Для корректной работы примера необходима библиотека MSXML не ниже 4.0
Определить, какая версия библиотеки у вас установлена, можно по версиям объектов MSXML в ветке реестра HKEY_CLASSES_ROOT:

При необходимости обновить из того же источника

https://support.microsoft.com/ru-ru/kb/324460

В качестве примера рассматривается отправка запроса остатков организации:

    //определение версии MSXML
MSXMLver = "6";
Попытка
Http = CreateObject("MSXML2.ServerXMLHTTP."+MSXMLver+".0");
Исключение
Попытка
MSXMLver = "4";
Http = CreateObject("MSXML2.ServerXMLHTTP."+MSXMLver+".0");
Исключение
Сообщить(ОписаниеОшибки(),"!");
Сообщить("Для работы модуля обмена необходима библиотека MSXML не ниже 4.0","!");
Возврат;
КонецПопытки;
КонецПопытки;

//адрес службы УТМ ЕГАИС
ServiceIP = "localhost";
ServicePort = "8080";
Service = "http://"+ServiceIP+":"+ServicePort;
FSRAR_ID = "123456789"; //ваш идентификатор в ЕГАИС

//текст XML запроса остатков
XMLstr = "<?xml version=""1.0"" encoding=""UTF-8""?>
|<ns:Documents Version=""1.0""
|xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
|xmlns:ns=""http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01""
|xmlns:qp=""http://fsrar.ru/WEGAIS/QueryParameters"">
|<ns:Owner>
|<ns:FSRAR_ID>"+FSRAR_ID+"</ns:FSRAR_ID>
|</ns:Owner>
|<ns:Document>
|<ns:QueryRests>
|</ns:QueryRests>
|</ns:Document>
|</ns:Documents>";

Response = SendHTTPRequest("POST", "/opt/in/QueryRests", XMLstr);
Если Response = 0 Тогда
Возврат;
КонецЕсли;

replyId = Response.documentElement.childNodes.item(0).text; //идентификатор для отслеживания ответа на запрос

В ответ на такой запрос от УТМ приходит XML квитанция о подписи запроса вида

<?xml version=»1.0″ encoding=»UTF-8″ standalone=»no»?>
<A>
<url>992ecfcf-7f31-4372-80c0-7a8b91cc85dd</url>
<sign>597CC2C9CE9F2D56F447C2E2D2D6B3481CC0A13DE0A49EAA15CBEB32BEDAC5F7B0B35DBD08C7369A2826AC9935CBB212FE6FBCAF6FCC5DF6C0E9171818AB8EEE</sign>
<ver>2</ver>
</A>

В теге url квитанции содержится идентификатор, по которому далее отслеживается получение ответа на запрос от сервера ЕГАИС

Ну и, собственно, функция SendHTTPRequest для отправки запроса:

Функция SendHTTPRequest(Metod, Request, XMLstr="")

Сообщить(Metod+" "+Service+Request,".");
Если ПустаяСтрока(XMLstr) = 0 Тогда
Сообщить(XMLstr);
Boundary = "Boundary"+СтрЗаменить(ТекущееВремя(),":","");
//формируем тело запроса
Body = "--"+Boundary+РазделительСтрок
+"Content-Disposition: form-data; name=""xml_file""; filename=""file.xml"""+РазделительСтрок
+"Content-Type: text/xml; charset=utf-8"+РазделительСтрок+РазделительСтрок
+XMLstr+РазделительСтрок
+"--"+Boundary+"--";
КонецЕсли;

Попытка
Http = CreateObject("MSXML2.ServerXMLHTTP."+MSXMLver+".0");
Исключение
Сообщить(ОписаниеОшибки(),"!");
Возврат 0;
КонецПопытки;

Http.Open (Metod, Service+Request, -1); //асинхронный запрос
Http.SetRequestHeader("Host", ServiceIP);

Попытка
Если ПустаяСтрока(XMLstr) = 0 Тогда
Http.SetRequestHeader("Content-Type","multipart/form-data; boundary="+Boundary);
Http.SetRequestHeader("Content-Length", СтрДлина(Body));
Http.Send(Body);
Иначе
Http.Send();
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки(),"!");
Возврат 0;
КонецПопытки;

Состояние("Ожидание ответа на запрос...");
ВремяОжидания = 0;
Пока Http.ReadyState <> 4 Цикл
Попытка
Если Http.waitForResponse(1) = 0 Тогда //превышено время ожидания ответа =1s
Если ВремяОжидания >= 60 Тогда //60s
Состояние("");
Сообщить("Превышен интервал ожидания запроса сервера "+ServiceIP,"!");
Возврат 0;
КонецЕсли;
ВремяОжидания = ВремяОжидания + 1; //1s
Состояние("Ожидание ответа на запрос... "+Строка(ВремяОжидания)+"s");
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки(),"!");
Возврат 0;
КонецПопытки;
КонецЦикла;
Состояние("");

Если Http.Status = 200 Тогда
Сообщить("HTTP status: "+Http.Status+" "+Http.StatusText+", время ожидания "+?(ВремяОжидания=0,"<1",Строка(ВремяОжидания))+"s");
Иначе
Сообщить("HTTP status: "+Http.Status+" "+Http.StatusText+", ошибка!","!");
Возврат 0;
КонецЕсли;

Response = Http.ResponseXML;

Возврат Response;

КонецФункции // SendHTTPRequest

Внешняя обработка, демонстрирующая обмен данными с УТМ ЕГАИС на платформе 1С 7.7 и основанная на приведенном примере:

//infostart.ru/public/435145/

2 Comments

  1. СергейК

    Познавательно!

    Но я решил для обмена все таки использовать старый проверенный curl.

    т.к. все равно все хмл запросы/ответы пока сохраняю для анализов возможных сбоев.

    p.s.

    а не проверяли, мне кажется я как то тестировал напрямую считывание в XML по URL

    выяснилось что влияют настройки IE в системе, в частности, например настройки прокси.

    Почему то мне это не понравилось… 🙂

    Reply
  2. Palmer1976

    (1) СергейК, вызывать внешнюю утилиту curl при отправке каждого запроса, вы серьезно?

    — не кошерно 😉 окошки в глазах будут мельтешить )))

    я тоже сохраняю все результаты в файл соответствующей функцией, для данного примера это Http.Save(имя файла)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *