IE 2016

HTTP POST запрос к УТМ системы ЕГАИС

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

В преддверии ввода системы ЕГАИС, разбирались с УТМ и HTTP POST запросами.

 

С 01.01.2016 через систему ЕГАИС (Единая государственная автоматизированная информационная система http://egais.ru)  - будут обязаны работать оптовики и розничные продавцы крепкого и слабого алкоголя.

В преддверии внедрения на своих учетных системах обмена с УТМ (ЕГАИС) разбирались, как работает.

Для обработки использовалась статья "Передача файлов и данных на веб-сервер средствами 1С:Предприятие 8.X методом POST".

 

 

XML запрос к справочнику организаций (из Технической документации УТМ 1.1)

Сформируем xml-файл запроса (client.xml) c запросом рекивизитов организации вида (структура запроса взята из описания УТМ модуля):

<?xml version="1.0" encodmg="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:oref="http://fsrar.ru/WEGAIS/ClientRef"
    xmlns:qp="http://fsrar.ru/WEGAIS/QueryParameters">
 <ns:Owner>
  <ns:FSRAR_ID>00040218</ns:FSRAR_ID>
 </ns:Owner>
 <ns:Document> (5.1)
 <ns:QueryClients>
  <qp:Parameters>
   <qp:Parameter>
    <qp:Name>ИНН</qp:Name>
    <qp:Value>1681000049<</qp:Value>
   </qp:Parameter>
  </qp:Parameters>
  </ns:QueryClients>
 </ns:Document>
</ns:Documents>

Запрос реквизитов организации выполняется по ее ИНН и FSRAR_ID содержит идентификатор организации, отправляющей данный документ.

В ответ на этот запрос, УТМ подписывает файл запроса и возвращает реквизиты подписи в квитанции следующего вида:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<A>
   <url>d9ef780e-4d35-41b0-bb9c-f06e53ac23d3</url>
        <sign>895B92CAD115B57B02C7D12ADC488066D99B60549D57A737B0CAC18E5E3E1C72E6B8D414C763CB58A5E67DE7C8C2ECE908451C4AE6838479A42ABBA8179D0CE8
        </sign>
   <ver>2</ver>
</

В элементе url возвращается идентификатор запроса, его значение требуется запомнить для поиска впоследствии ответа на этот запрос.

 

При использовании CURL, команда будет вида: curl -F "xml_file=@client.xml" http://localhost:8080/opt/in/QueryPartner

 

УТМ отправляет запрос на сервер ЕГАИС. Сервер ЕГАИС формирует ответ на запрос, возвращает ответ в УТМ.

 

Далее сформируем запрос средствами 1С, без использования CURL:

 

1. Подготовка переменных: 

 

        Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""); // Идентификатор границы разделов POST запроса
        ИмяФайлаДляЗагрузки = КаталогВременныхФайлов() + "select.xml";       
        ИмяФайлаОтвета = КаталогВременныхФайлов() + "answer.xml"; // Имя файла ответа на POST запрос
        ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt";

 

2. Формируем XML запрос :

 

    ОбъектXML  = Новый ЗаписьXML();
    ОбъектXML.ОткрытьФайл(ИмяФайлаДляЗагрузки);
    ОбъектXML.ЗаписатьОбъявлениеXML();
    ОбъектXML.ЗаписатьНачалоЭлемента("ns:Documents");
    ОбъектXML.ЗаписатьАтрибут("Version", "1.0");
    ОбъектXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    ОбъектXML.ЗаписатьСоответствиеПространстваИмен("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
    ОбъектXML.ЗаписатьСоответствиеПространстваИмен("oref", "http://fsrar.ru/WEGAIS/ClientRef");
    ОбъектXML.ЗаписатьСоответствиеПространстваИмен("qp", "http://fsrar.ru/WEGAIS/QueryParameters");
    ОбъектXML.ЗаписатьНачалоЭлемента("ns:Owner");
    ОбъектXML.ЗаписатьНачалоЭлемента("ns:FSRAR_ID");
    ОбъектXML.ЗаписатьТекст(FSRAR_ID);
    ОбъектXML.ЗаписатьКонецЭлемента();//ns:FSRAR_ID
    ОбъектXML.ЗаписатьКонецЭлемента();//ns:Owner
    ОбъектXML.ЗаписатьНачалоЭлемента("ns:Document");
    ОбъектXML.ЗаписатьНачалоЭлемента("ns:QueryClients");
    ОбъектXML.ЗаписатьНачалоЭлемента("qp:Parameters");
    ОбъектXML.ЗаписатьНачалоЭлемента("qp:Parameter");
    ОбъектXML.ЗаписатьНачалоЭлемента("qp:Name");
    ОбъектXML.ЗаписатьТекст("ИНН");
    ОбъектXML.ЗаписатьКонецЭлемента();//qp:Name
    ОбъектXML.ЗаписатьНачалоЭлемента("qp:Value");
    ОбъектXML.ЗаписатьТекст(ИННКонтрагента);
    ОбъектXML.ЗаписатьКонецЭлемента();//qp:Value
    ОбъектXML.ЗаписатьКонецЭлемента();//qp:Parameter
    ОбъектXML.ЗаписатьКонецЭлемента();//qp:Parameters
    ОбъектXML.ЗаписатьКонецЭлемента();//ns:QueryClients
    ОбъектXML.ЗаписатьКонецЭлемента();//ns:Document
    ОбъектXML.ЗаписатьКонецЭлемента();//ns:Documents
    ОбъектXML.ЗаписатьТекст(Символы.ПС);
    ОбъектXML.Закрыть();

 

 

3. Формирование тела POST запроса через объеденение текстовых файлов:

 

	//Определяем массив для процедуры ОбъединитьФайлы
	МассивФайловДляОбъединения = Новый Массив;

	//Формируем начальный фрагмент файла POST-запроса
	ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
	ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.ANSI, Символы.ПС, Ложь);
	//Определяем раздел двоичных данных
	ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
	//Указываем имя файла для передачи
	ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""xml_file""; filename=""" + "select.xml" + """");
	//Указываем тип передаваемых данных.
	ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: text/xml; charset=utf-8");
	ФайлОтправкиНачало.ЗаписатьСтроку("");
	ФайлОтправкиНачало.Закрыть();

	МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);

        МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузки);

	//Формируем конечный фрагмент файла POST-запроса
	ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
	ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.ANSI, Символы.ПС, Ложь);

	//Завершение раздела двоичных данных
	//Завершение сообщения для сервера
	
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--");
	ФайлОтправкиКонец.Закрыть();

	МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец); // !!! 3 добавление в массив

	//Теперь сформированные фрагменты сообщения для сервера объединяем в один файл POST-запроса
	ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);

 

4. Формируем заголовок POST запроса:

 

        ЗаголовокHTTP = Новый Соответствие();

        //Укажем формат данных Content-Type
        ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);

        //Укажем длину POST-запроса Content-Length
        ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
        РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
        ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);

 

5.  Инициализируем HTTPСоединение,  При необходимости задаём параметры прокси.

 

        СерверПриемник = "localhost"; //Без протокола http://. Естественно, следует указать свой адрес.
        Порт = "8080"; //Порт УТМ
        ИспользоватьПрокси = Ложь;
	
        Если ИспользоватьПрокси Тогда
	        Прокси = Новый ИнтернетПрокси;
	        Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;
	        Прокси.Пароль = "ПарольПрокси"; // укажите своё значение
	        Прокси.Пользователь = "ПользовательПрокси"; // укажите своё значение
	        НТТР = Новый HTTPСоединение(СерверПриемник, Порт, , , Прокси);
	    Иначе
                НТТР = Новый HTTPСоединение(СерверПриемник, Порт);
        КонецЕсли;

	
	Попытка
		АдресСкрипта = "/opt/in/QueryPartner"; //Адрес ресурса.
		
		//Формируем HTTP запрос
		ЗапросHTTP = Новый HTTPЗапрос(АдресСкрипта, ЗаголовокHTTP);
		ЗапросHTTP.УстановитьИмяФайлаТела(ИмяФайлаОтправки);  //Устанавливает имя файла, из которого будет прочитано тело POST-запроса.
		
		//Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
		ОтветHTTP = НТТР.ОтправитьДляОбработки(ЗапросHTTP, ИмяФайлаОтвета);
	Исключение
		Сообщить("Неудачная попытка соединения с " + СерверПриемник + ": " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	//Разрушаем объект HTTP-запроса для освобождения файла POST-запроса.
	//В противном случае при попытке удаления файла получим ошибку совместного доступа.
	ЗапросHTTP = Неопределено;

 

6. Читаем ответ на запрос, разбираем XML файл ответа.

 

	ЧтениеОтвета = Новый ЧтениеXML;
	ЧтениеОтвета.ОткрытьФайл(ОтветHTTP.ПолучитьИмяФайлаТела());
	
	ИдОтвета = "";
	ПодписьОтвета = "";
	ИмяУзла = "";
	
	Пока ЧтениеОтвета.Прочитать() Цикл
		Если ЧтениеОтвета.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			ИмяУзла = ЧтениеОтвета.Имя;
		КонецЕсли;
		Если ЧтениеОтвета.ТипУзла=ТипУзлаXML.Текст Тогда
			Если ИмяУзла = "url" Тогда
				urlЗначение=ЧтениеОтвета.Значение;
				Сообщить("ID "+urlЗначение);
			КонецЕсли;
			Если ИмяУзла = "sign" Тогда
				signЗначение=ЧтениеОтвета.Значение;
				Сообщить("SIGN "+signЗначение);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	//Разрушаем объект HTTP-ответ для освобождения файла ответа.
	ЧтениеОтвета = Неопределено;

 

7. Удаляем временные файлы.

 

	// Удаляем файлы POST-запроса и фрагменты сообщения. Больше они не нужны.
	УдалитьФайлы(ИмяФайлаОтвета); // "answer.xml"
	УдалитьФайлы(ИмяФайлаОтправки); // "post.txt"
	УдалитьФайлы(ИмяФайлаДляЗагрузки); // "select.xml"
	
	Для каждого ЭлементМассива Из МассивФайловДляОбъединения Цикл
		УдалитьФайлы(ЭлементМассива);
	КонецЦикла;

В итоге  мы получаем ключ url вида "d9ef780e-4d35-41b0-bb9c-f06e53ac23d3", и "sign" вида "895B92CAD115B57B02C7D12ADC488066D99B60549D57A737B0CAC18E5E3E1C72E6B8D414C763CB58A5E67DE7C8C2ECE908451C4AE6838479A42ABBA8179D0CE8", что с этим делать и что это значит? Наш запрос был принят УТМ и подписан, далее каждые 5 минут УТМ отправляет запросы на сервер ЕГАИС, сервер обрабатывает и присылает на ответы. Список ответов будет находится по адресу "http://localhost:8080/opt/out?refresh=true" в виде :

 

 

Строим HTTP запрос к ресурсу "/opt/out" получаем список ответов, в списке находим нужный ответ по url = relayId,

получаем ссылку "http://localhost:8080/opt/out/ReplyPartner/1" на файл ответа с сервера и по ссылке получаем XML файл ответа.

Ответ на запрос к справочнику организаций будет вида:

 

<?xml version="1.0" encoding="UTF-8"?>
<ns:Documents xmlns:rc="http://fsrar.ru/WEGAIS/ReplyClient" xmlns:oref="http://fsrar. ru/WEGAIS/ClientRef" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns:Owner>
         <ns:FSRAR_ID>3463047</ns:FSRAR_ID>
    </ns:Owner>
   <ns:Document> (5.9)
       <ns:ReplyClient>
       <rc:Clients xmlns:rc="http://fsrar.ru/WEGAIS/ReplyClient" xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <rc:Client>
               <oref:ClientRegId>00008907</oref:ClientRegId>
               <oref:INN>1681000049</oref:INN>
               <oref:KPP>303265456</oref:KPP>
               <oref:FuMName>ООО "Пример"</oref:FuMName> <oref:ShortName>П</oref:ShortName>
               <oref:address>
                   <oref:Country>643</oref:Country>
                   <oref:RegionCode>30</oref:RegionCode>
                   <oref:city>Астрахань г</o ref: city>
                   <oref:street>1 -й проезд</оге^^ее^ <oref:house>12</oref:house>
                   <oref:description>643,,AcTpaxaHCK8H обл,,Астрахань г,,1 -й проезд,12,,,</oref:description>
               </oref:address>
           </rc:Client>
       </rc:Clients>
       </ns:ReplyClient>
   </ns:Document>
</ns:Documents>

...

 

 

 

См. также

Лучшие комментарии

30. ifal 03.12.2015 18:28
(29) Uncore, Спасибо, помогли (навели на мысли), в общем-то код мне не нужен, а вот информация была бы кстати. В общем-то мне нужен только алкокод из марки, так как используя только марки быстрей и точней можно подготовки акты постановки на баланс. Собственно вот:"...для получения AlcСode из QR-кода надо символы с 8 по 19 (12 символов) перевести из тридцатишестеричной
системы счисления в десятичную систему счисления, добавить впереди недостающие ведущие нули,
и получим 19 -ти разрядное число, состоящее только из цифр". Получившаяся функция:
Функция ПолучитьАлкоКод(Марка)
	
	СтрокаАнализа = Сред(НРег(Марка), 8, 12);
	Длина = СтрДлина(СтрокаАнализа);
	Сообщить(СтрокаАнализа);
	
        // Переводим 36-ричное число в 10-ое
	Результат = 0;
	Для ин = 1 По СтрДлина(СтрокаАнализа) Цикл
		
		СимволСтроки = Сред(СтрокаАнализа,ин,1);
		
		ч = 0;
		Если КодСимвола(СимволСтроки)>=97 И КодСимвола(СимволСтроки)<=122 Тогда
			ч = КодСимвола(СимволСтроки) - 87; 
		Иначе
			ч = Число(СимволСтроки);
		КонецЕсли;
		
		Результат = Результат + Pow(36, (Длина - ин))*ч; 
		
	КонецЦикла;
	
	// Длина алкокода = 19 символов дополняем нулями спереди
	Результат = Формат(Результат, "ЧГ=");
	Для ин = 1 По 19 - СтрДлина(Результат) Цикл
		Результат = "0" + Результат;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции
...Показать Скрыть
Ответили: (34) (40) (46)
# Ответить
32. Uncore 04.12.2015 04:34
(31) maljaev, вместо ИНН производителя нужно передавать параметр КОД:
ТекстЗапроса.ЗаписатьНачалоЭлемента("qp:Name");
ТекстЗапроса.ЗаписатьТекст("КОД");
ТекстЗапроса.ЗаписатьКонецЭлемента(); //name
Ответили: (33)
+ 3 [ aziat71; ifal; maljaev; ]
# Ответить
46. st-ty@ngs.ru 21.12.2015 16:07
(30) ifal, Если в платформе нет функций КодСимвола() и Pow(), вот нашел еще такой пример:
Функция ПолучитьАлкоКод(Значение) Экспорт
   	 Значение = Сред(Значение,8,12);
	 Нотация=36;
     Результат=0;
     Длина=СтрДлина(Значение);
     Для Х=1 По Длина Цикл
          М=1;
          Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
          Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
     КонецЦикла;
     Возврат Строка(Результат);
КонецФункции

...Показать Скрыть
+ 2 [ wowik; ifal; ]
# Ответить

Комментарии

1. SergVD 17.09.2015 13:26
УТС возвращает код ошибки 500
Ответили: (4)
# Ответить
2. flyer 18.09.2015 08:16
может в виде обработки выложите или конфы?
# Ответить
3. Corvax46 18.09.2015 15:30
СерверПриемник = "localhost"; //Без протокола http://. Если УТМ установлени на удаленном компьютере, указываем свой адрес.

Прикрепленные файлы:

HTTPPOSTЗапросКУТМСистемыЕГАИС.epf
# Ответить
4. desarz 19.09.2015 18:23
(1) SergVD, обновил статью, тело запроса составляется через объединение текстовых файлов, 100% работает )
Добавил разбор файл ответа.
# Ответить
5. Uncore 20.09.2015 04:32
А на 8.2 не пробовали сделать через HTTPСоединение? Там HTTPЗапрос нет. Вроде все то же, но не выполняется запрос, чего-то видимо все-таки не хватает.
Ответили: (6)
# Ответить
6. 31ric 23.09.2015 13:58
(5) Uncore, Обновите платформу. Начиная с 8.2.18 HTTPЗапрос есть
Ответили: (7)
# Ответить
7. Uncore 23.09.2015 17:10
(6) 31ric, мне как раз для 8.2 нужно было для старых версий без обновления платформы. Уже разобрался, заработало и без HTTPЗапрос.
# Ответить
8. Diman_Kr 28.09.2015 07:04
А для 7.7 есть что нибудь?
Ответили: (42)
# Ответить
9. Teodor_kr 29.09.2015 07:57
-<head> <met a content="text/html; charset=ISO-8859-1" http-equiv="Content-Type"/>
<title>Error 500 Server Error</title>
</head>
-<body><h2>HTTP ERROR 500</h2>
-<p>Problem accessing /opt/in/QueryPartner. Reason: <pre> Server Error</pre></p>


at java.lang.Thread.run(Unknown Source)


Вот у меня тоже почему-то ошибка 500.
Ответили: (10)
# Ответить
10. desarz 29.09.2015 11:42
(9) Teodor_kr,
1. Проверить запущена ли служба УТМ "Transport".
2. Работает и видится ли ключ JaCarta.
3. Проверить в браузере доступ к - http://localhost:8080/opt/out
4. Отключить брандмауэр и антивирус если УТМ находится не на локальной машине.
Ответили: (11) (13)
# Ответить
11. agorohov 29.09.2015 16:30
(10) desarz, А служба УТМ "Transport" не запустится, если JaCarta не работает
Ответили: (12) (15)
# Ответить
12. desarz 30.09.2015 00:38
(11) agorohov, Да, если ключ не вставлен, на нем нет сертификата, и т.д. УТМ не запускается.
# Ответить
13. Teodor_kr 01.10.2015 13:03
(10) desarz, Машина локальная. Доступ к http://localhost:8080/opt/out?refresh=true есть.Транспорт запущен (ключ JaCarta вставлен и читается)

Пробовал HTTPPOSTЗапросКУТМСистемыЕГАИС.epf из (3)
в ответ приходит вот такое, но ошибки не дает:
<A>
<error>null</error>
<ver>2</ver>
</A>
Ответили: (14)
# Ответить
14. desarz 02.10.2015 09:43
(13) Teodor_kr, то что вы пробовали, старая версия (она работала не везде).
В статье обновленный пример, если код из статьи перенесете в обработку, подставите свои значения FSRARID, все заработает.
Ответили: (15)
# Ответить
15. demon_infernal 05.10.2015 20:59
(14) desarz, у меня такой же ответ, как у (13)
пробовал и обработкой HTTPPOSTЗапросКУТМСистемыЕГАИС.epf, и копипастил код из статьи. в чем может быть дело?
Ответили: (16)
# Ответить
16. mma928 06.10.2015 14:02
(15) demon_infernal, такая же проблема.. вчера загрузил справочник организаций, ттн, а сегодня "Error 500 Server Error", хотя ТТН все же загружаются.
# Ответить
17. ifal 07.10.2015 11:38
Для тех у кого вылезает ошибка <A> <error>null</error> <ver>2</ver> </A>
Правильное формирование запроса (Тут главное последовательность перевода строки правильно расставить и Boundary):
        ТелоЗапроса = Новый ТекстовыйДокумент();
	ТелоЗапроса.ДобавитьСтроку(Символы.ПС);
	ТелоЗапроса.ДобавитьСтроку("--" + Boundary);
	ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""xml_file""");
	ТелоЗапроса.ДобавитьСтроку("Content-Type: application/octet-stream");
	ТелоЗапроса.ДобавитьСтроку(Символы.ПС);
	ТелоЗапроса.ДобавитьСтроку(Текст);
	ТелоЗапроса.ДобавитьСтроку("--" + Boundary);
	ТелоЗапроса.ДобавитьСтроку("--" + Boundary+ "--");
	
	Текст = ТелоЗапроса.ПолучитьТекст();      

	Запрос = Новый HTTPЗапрос("/opt/in/QueryPartner");
	Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
	Запрос.УстановитьТелоИзСтроки(Текст, КодировкаТекста.UTF8);
	Ответ = Соединение.ОтправитьДляОбработки(Запрос);
...Показать Скрыть


тут Текст - ваш сформированный xml - запрос, Boundary - тоже, что и в основной статье.
Ответили: (47)
# Ответить
18. desarz 07.10.2015 15:18
Обработка была тестированием УТМ с целью разобраться и посмотреть как работает УТМ и т.д.
Если собираетесь внедрять, то советую код и принцип работы с УТМ взять из последней редакции 1С 8 Розница 2.1.
Обмен построен на XDTO объектах, очень удобно и красиво )
Ответили: (19)
# Ответить
19. ifal 07.10.2015 18:38
(18) desarz, с оттуда и взял, и он не заработал! Пришлось немного поразбираться, почитав стандарт передачи данных в POST. Возможно все дело в настройках веб-сервера (Jetty), но факт - из коробки не работает.
# Ответить
20. bds22 28.10.2015 11:15
xsd файлы не пробовали импортировать в 1С? у меня проблема в 1С возникает, когда тип не описан отдельно, а идет как "описание типов", указанное непосредственно у значения. в этом случае выходит сообщение вроде нельзя присвоить значение типу "" (пустая строка). после того как отдельно описываю этот тип и указываю его, 1С начинает воспринимать эти данные

я вообще сначала попробовал отправить через curl -F свой запрос и получил ответ
<A><error>??????????? ???? ?? ???????. ?????????? ????????? ? ?????? "ns:FSRAR_ID":0</error><ver>2</ver></A>
потом средствами 1С (спасибо за Ваш код), и получил те же самые знаки вопроса, что-то с кодировкой
# Ответить
21. bds22 28.10.2015 12:45
в общем причина у меня была в том, что с пустым namespace загрузка не происходит. если кто-то будет использовать фабрику XDTO (загружая файлы xsd), то рабочий код такой

ТипDocuments=ФабрикаXDTO_ЕГАИС.Тип("http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01", "Documents");
		ЗначениеDocuments=ФабрикаXDTO_ЕГАИС.Создать(ТипDocuments);
		
		ТипSenderInfo=ФабрикаXDTO_ЕГАИС.Тип("http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01", "SenderInfo");
		ЗначениеSenderInfo=ФабрикаXDTO_ЕГАИС.Создать(ТипSenderInfo);
		ЗначениеSenderInfo.FSRAR_ID=FSRAR_ID;
		
		ЗначениеDocuments.Owner=ЗначениеSenderInfo;
		
		ТипDocument=ТипDocuments.Свойства.Получить("Document").Тип;
		ЗначениеDocument=ФабрикаXDTO_ЕГАИС.Создать(ТипDocument);
		
		ТипQueryParameters=ФабрикаXDTO_ЕГАИС.Тип("http://fsrar.ru/WEGAIS/QueryParameters", "QueryParameters");
		ЗначениеQueryParameters=ФабрикаXDTO_ЕГАИС.Создать(ТипQueryParameters);
		
		ТипParameters=ТипQueryParameters.Свойства.Получить("Parameters").Тип;
		ТипParameter=ТипParameters.Свойства.Получить("Parameter").Тип;
		ЗначениеParameter=ФабрикаXDTO_ЕГАИС.Создать(ТипParameter);
		
		ЗначениеQueryParameters.Parameters=ФабрикаXDTO_ЕГАИС.Создать(ТипParameters);
		
		ЗначениеParameter.Name="ИНН";
		ЗначениеParameter.Value=INN;
		ЗначениеQueryParameters.Parameters.Parameter.Добавить(ЗначениеParameter);
		
		ЗначениеDocument.QueryClients=ЗначениеQueryParameters;
		
		ЗначениеDocuments.Document=ЗначениеDocument;
		
		//ФабрикаXDTO_ЕГАИС.ЗаписатьXML(ЗаписьXML, ЗначениеDocuments);
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("ns:Documents");
    	ЗаписьXML.ЗаписатьАтрибут("Version", "1.0");		
		
		ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
		ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
    	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("oref", "http://fsrar.ru/WEGAIS/ClientRef");
    	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("qp", "http://fsrar.ru/WEGAIS/QueryParameters");		
		
		ФабрикаXDTO_ЕГАИС.ЗаписатьXML(ЗаписьXML, ЗначениеDocuments.Owner, "Owner");
		ФабрикаXDTO_ЕГАИС.ЗаписатьXML(ЗаписьXML, ЗначениеDocuments.Document);
		
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
	ЗаписьXML.ЗаписатьТекст(Символы.ПС);	
	СтрокаОбъект = ЗаписьXML.Закрыть();
...Показать Скрыть
# Ответить
22. Fuego 28.10.2015 18:02
Я не мучился со средствами 1С. Сделал на более интуитивных инструментах.
Function PostXMLFile(URL, XML)
	
	Boundary = String(New UUID());
	
	XMLHTTPRequest = CreateXMLHTTPRequest();

	XMLHTTPRequest.open("POST", URL, False);

	XMLHTTPRequest.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + Boundary);
	
	FormData = 
	"--" + Boundary + CrLf()
	+ "Content-Disposition: form-data; name=""xml_file""; filename=""file.xml""" + CrLf()
	+ "Content-Type: text/xml; charset=utf-8" + CrLf()
	+ "Content-Transfer-Encoding: binary" + CrLf()
	+ CrLf()
	+ XML + CrLf()
	+ "--" + Boundary + "--" + CrLf();
	
	XMLHTTPRequest.send(FormData);

	If XMLHTTPRequest.status = 200 Then
		
		XMLDocument = XMLHTTPRequest.responseXML;
		If IsBlankString(XMLDocument.xml) Then
			XMLDocument.load(XMLHTTPRequest.responseStream);
		EndIf;
		XMLDocument.setProperty("SelectionLanguage", "XPath");
					
		Return XMLDocument.selectSingleNode(".//url").text;
		
	Else

		HandleError(XMLHTTPRequest, URL);

	EndIf;

	
	Return "";
	
EndFunction

Function CrLf()
	Return Chars.CR + Chars.LF;
EndFunction

Function CreateXMLHTTPRequest()
	Return New COMObject("Msxml2.XMLHTTP.6.0");
EndFunction

Procedure SendQueryForOrgData()
	XML =
	"<?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:oref=""http://fsrar.ru/WEGAIS/ClientRef""
	|xmlns:qp=""http://fsrar.ru/WEGAIS/QueryParameters""
	|>
	|<ns:Owner>
	|<ns:FSRAR_ID>543751347</ns:FSRAR_ID>
	|</ns:Owner>
	|<ns:Document>
	|<ns:QueryClients>
	|<qp:Parameters>
	|<qp:Parameter>
	|<qp:Name>ИНН</qp:Name>
	|<qp:Value>652348658</qp:Value>
	|</qp:Parameter>
	|</qp:Parameters>
	|</ns:QueryClients>
	|</ns:Document>
	|</ns:Documents>
	|";
	URL = "http://my_egais_srv:8080/opt/in/QueryPartner";
	
	ReplyID= PostXMLFile(URL, XML);
	// Do something
EndProcedure

...Показать Скрыть
# Ответить
23. Геннадьевич 13.11.2015 07:23
Из браузера такой запрос может прокатить? Например на PHP если написать? Никто не пробовал?
У меня в ответ на запрос выдаёт:

HTTP ERROR: 404
Problem accessing opt/in/QueryPartner. Reason:
Not Found
# Ответить
24. maljaev 26.11.2015 11:06
Скажите пожалуйста, а можно ли передать на сервер ЕГАИС коды товаров PDF417 и получить обратно информацию об этих товарах (карточки товаров)?
Ответили: (25)
# Ответить
25. krv2k 28.11.2015 20:01
(24) maljaev, можно передать в запросе AlcCode, и получить информацию только об этом конкретном товаре (в отличие от запроса по ИНН, в котором возвращаются все товары).
Ответили: (26) (31)
# Ответить
26. aziat71 03.12.2015 01:56
(25) krv2k, запрос AlcCode - применимо для проверки акцизной марки??? Интересует как раз получение информации (проверка акцизной марки) по штрих-коду PDF417 !!!
Ответили: (27)
# Ответить
27. Uncore 03.12.2015 03:44
(26) aziat71, в штрихкоде есть алккод, его можно оттуда вытащить
Ответили: (35)
# Ответить
28. ifal 03.12.2015 15:07
Там по идее строка зашифрована, как же его оттуда вытащить?
Ответили: (29)
# Ответить
29. Uncore 03.12.2015 16:50
(28) ifal, расшифровать :) есть код для 1С на просторах инета, тут приводить не буду, т.к. используется в коммерческом решении.
Ответили: (30)
# Ответить
30. ifal 03.12.2015 18:28
(29) Uncore, Спасибо, помогли (навели на мысли), в общем-то код мне не нужен, а вот информация была бы кстати. В общем-то мне нужен только алкокод из марки, так как используя только марки быстрей и точней можно подготовки акты постановки на баланс. Собственно вот:"...для получения AlcСode из QR-кода надо символы с 8 по 19 (12 символов) перевести из тридцатишестеричной
системы счисления в десятичную систему счисления, добавить впереди недостающие ведущие нули,
и получим 19 -ти разрядное число, состоящее только из цифр". Получившаяся функция:
Функция ПолучитьАлкоКод(Марка)
	
	СтрокаАнализа = Сред(НРег(Марка), 8, 12);
	Длина = СтрДлина(СтрокаАнализа);
	Сообщить(СтрокаАнализа);
	
        // Переводим 36-ричное число в 10-ое
	Результат = 0;
	Для ин = 1 По СтрДлина(СтрокаАнализа) Цикл
		
		СимволСтроки = Сред(СтрокаАнализа,ин,1);
		
		ч = 0;
		Если КодСимвола(СимволСтроки)>=97 И КодСимвола(СимволСтроки)<=122 Тогда
			ч = КодСимвола(СимволСтроки) - 87; 
		Иначе
			ч = Число(СимволСтроки);
		КонецЕсли;
		
		Результат = Результат + Pow(36, (Длина - ин))*ч; 
		
	КонецЦикла;
	
	// Длина алкокода = 19 символов дополняем нулями спереди
	Результат = Формат(Результат, "ЧГ=");
	Для ин = 1 По 19 - СтрДлина(Результат) Цикл
		Результат = "0" + Результат;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции
...Показать Скрыть
Ответили: (34) (40) (46)
# Ответить
31. maljaev 04.12.2015 00:31
(25) krv2k, А где есть информация о том как сформировать запрос к серверу по AlcСode?
Ответили: (32) (41)
# Ответить
32. Uncore 04.12.2015 04:34
(31) maljaev, вместо ИНН производителя нужно передавать параметр КОД:
ТекстЗапроса.ЗаписатьНачалоЭлемента("qp:Name");
ТекстЗапроса.ЗаписатьТекст("КОД");
ТекстЗапроса.ЗаписатьКонецЭлемента(); //name
Ответили: (33)
+ 3 [ aziat71; ifal; maljaev; ]
# Ответить
33. Uncore 04.12.2015 09:44
+(32) для запроса контрагента/производителя по регномеру, тоже поправить нужно в одном месте:
ТекстЗапроса.ЗаписатьНачалоЭлемента("qp:Name");
    Если ЭтоРегНомер Тогда
	ТекстЗапроса.ЗаписатьТекст("СИО");
    Иначе	
	ТекстЗапроса.ЗаписатьТекст("ИНН");
   КонецЕсли;	
ТекстЗапроса.ЗаписатьКонецЭлемента(); //name
...Показать Скрыть
# Ответить
34. aziat71 06.12.2015 22:27
(30) ifal, И всетаки, чтобы получить AlcCode, какой код нужно сканировать, тот что поменьше на марке (формата DATA-MATRIX) или тот что побольше (формата PDF417) ???
Ответили: (36)
# Ответить
35. beard1 10.12.2015 22:17
(27) Uncore, AlcCode достали, проверили, результат положительный, но разве этот факт === подлинная акцизная марка?
Ответили: (38)
# Ответить
36. ifal 10.12.2015 22:43
(34) aziat71, Я думаю вы уже разобрались, но на всякий - PDF417
Ответили: (39)
+ 1 [ aziat71; ]
# Ответить
37. beard1 11.12.2015 09:23
доброго времени суток,

а можно ли и как

    запросить всю продукцию
    запросить всех производителей
    запросить FSRAR_ID из УТМ

в документации по УТМ вроде не нашел параметров
# Ответить
38. aziat71 11.12.2015 14:45
(35) beard1, нет, думаю не равен, проверить подлинность все равно прийдется в личном кабинете ФСРАР либо через терминал сбора данных с поддержкой CheckMark, либо при помощи детектора Госзнак. В данном случае цель получения AlcoCode - правильная/точная постановка на учет при проведении инвентаризации.
# Ответить
39. aziat71 11.12.2015 16:57
(36) ifal, да, огромное спасибо - то что нужно!!!
# Ответить
40. makus 15.12.2015 16:09
(30) ifal, огромное спасибо!

Не подскажете, Ваша функция для распознавания кода PDF417, если её адаптировать, будет работать в 1С 7.7?
Дело в том, что я ровным счётом ничего не понимаю в кодировках, но насколько я понял, функция КодСимв() в 7.7 может дать совсем не тот результат, что КодСимвола() в 8-ке. Я прав? И если это так, есть способ обойти проблему?
Ответили: (44)
# Ответить
41. Palmer1976 16.12.2015 01:41
(31) maljaev, пример запроса продукции по коду есть там Недокументированные возможности УТМ ЕГАИС
# Ответить
43. makus 16.12.2015 11:17
Вот тут, вроде, в сообщении №84, для 7-ки хороший человек написал обработку, чтобы AlcCode из QR-кода доставать: http://infostart.ru/public/405305/#comm
# Ответить
44. ifal 16.12.2015 22:02
(40) makus, вообще надо проверять, по идее должна работать, только конечно надо адаптировать, например, в 7-ке нет оператора возведения в степень - надо функцию писать и т.д.
Ответили: (45)
+ 1 [ makus; ]
# Ответить
45. makus 17.12.2015 12:15
(44) ifal, спасибо!

В действительности, с возведением в степень, как раз, проблем нет, потому что в сети есть готовые функции, которые можно вставить в глобальный модуль и есть 1C++, где реализована функция возведения в степень, аналогичная восьмёрочной. Я больше беспокоюсь о соответствии кодов символов, которые будет возвращать 7-ка кодам, возвращаемым 8-кой, т.к. 7-ка не понимает юникод.

Как бы там ни было, я обнаружил буквально вчера функцию для 7.7, которая делает то же самое. Я её уже адаптировал, она работает.

Большое спасибо Вам за начальную информацию о содержании кода в PDF417 и за саму идею.
# Ответить
46. st-ty@ngs.ru 21.12.2015 16:07
(30) ifal, Если в платформе нет функций КодСимвола() и Pow(), вот нашел еще такой пример:
Функция ПолучитьАлкоКод(Значение) Экспорт
   	 Значение = Сред(Значение,8,12);
	 Нотация=36;
     Результат=0;
     Длина=СтрДлина(Значение);
     Для Х=1 По Длина Цикл
          М=1;
          Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
          Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
     КонецЦикла;
     Возврат Строка(Результат);
КонецФункции

...Показать Скрыть
+ 2 [ wowik; ifal; ]
# Ответить
47. dima_home 23.12.2015 10:42
(17) ifal, В конце XML обязательно должен быть перевод строки. По умолчанию - ЗаписьXML() не заканчивает файл XML переносом строки.
не забудьте... как в примере закончить :
    ОбъектXML.ЗаписатьТекст(Символы.ПС);
    ОбъектXML.Закрыть();
Ответили: (48)
# Ответить
48. ifal 24.12.2015 22:09
(47) dima_home, а где у меня ЗаписьXML используется?
# Ответить
49. aximo 03.01.2016 21:57
а можно дополнить статью, что в итоге должно "нарисоваться" после выполнения п.3 ? спасибо
# Ответить
50. Shadow308 08.03.2016 03:00
А можно запрос на удаление документов???
# Ответить
51. art010 07.07.2016 13:37
С чем может быть связана ошибка, вылетающая при попытке отправить запрос в УТМ:

Ошибка при вызове конструктора (HTTPСоединение)
НТТР = Новый HTTPСоединение(СерверПриемник, Порт);
по причине:
Несоответствие типов (параметр номер '2')

Ошибка вылетает на 1с8 Розница 2.2.4.12
Платформа 8.3
СерверПриемник = "localhost" (и IP подставлял, и локально, и по сети)
Порт="8080"
# Ответить
52. desarz 07.07.2016 17:04
тип порта - число, попробуй Порт=8080;
# Ответить
53. desarz 07.07.2016 17:08
А так, универсальное решение... обнови платформу, обнови конфигурацию.
# Ответить
54. SerSinelnik 07.07.2016 17:08
Уже все перепробовал
Все последние релизы и платформа и конфигурация. Сейчас перепроверю, может еще что-то вышло
# Ответить
55. SerSinelnik 07.07.2016 17:11
уже голову сломал, что ему не нравится.
Бухгалтерия Предприятия 3,0 работает нормально
в некоторых Розницах - нормально.
У одного товарища эта ошибка выскакивает и хоть убейся
# Ответить
56. desarz 07.07.2016 17:12
Платформа какая?
# Ответить
57. SerSinelnik 07.07.2016 17:14
1С:Предприятие 8.3 (8.3.8.1675) (Кстати БП на такой платформе норм отрабатывает)
и на этой проверял и на следующей. сейчас уточню какая именно.
# Ответить
58. desarz 07.07.2016 17:19
1С:Предприятие 8 не ниже 8.3.8.1784 нужна, думаю в этом дело.
# Ответить
59. SerSinelnik 07.07.2016 17:23
а как же это
1С:Предприятие 8.3 (8.3.8.1675) (Кстати БП на такой платформе норм отрабатывает)
У этого товарища 1С:Предприятие 8.3 (8.3.8.1784)
# Ответить
60. desarz 07.07.2016 17:28
Возможно в Рознице изменили код соединения с УТМ и требуется новая платформа, в обновление Розницы, 1С пишет что нужна платформа "1С:Предприятие 8 не ниже 8.3.8.1784"...
Как то так, других мыслей нет.
# Ответить
61. SerSinelnik 07.07.2016 17:31
Спасибо за помощь
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016