gifts2017

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

Опубликовал Павел Меркулов (Palmer1976) в раздел Программирование - Практика программирования

Запрос реализован на объекте 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 и основанная на приведенном примере:

http://infostart.ru/public/435145/

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Крымов (СергейК) 16.12.15 10:46
Познавательно!
Но я решил для обмена все таки использовать старый проверенный curl.
т.к. все равно все хмл запросы/ответы пока сохраняю для анализов возможных сбоев.
p.s.
а не проверяли, мне кажется я как то тестировал напрямую считывание в XML по URL
выяснилось что влияют настройки IE в системе, в частности, например настройки прокси.
Почему то мне это не понравилось... :-)
2. Павел Меркулов (Palmer1976) 16.12.15 11:00
(1) СергейК, вызывать внешнюю утилиту curl при отправке каждого запроса, вы серьезно?
- не кошерно ;) окошки в глазах будут мельтешить )))
я тоже сохраняю все результаты в файл соответствующей функцией, для данного примера это Http.Save(имя файла)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа