22.01.2025 18:56
Отправка, это:

Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Это=Скрипт.Eval("this");
BOUNDARY = "BOUNDRYxXxXxEGAISxXxXxBOUNDARY";
POST_STRING = "--"+BOUNDARY+РазделительСтрок;
POST_STRING = POST_STRING + "Content-Disposition: form-data; name=""xml_file""; filename=""select.xml""" + РазделительСтрок;
POST_STRING = POST_STRING + "Content-Type: text/xml; charset=utf-8" + РазделительСтрок + РазделительСтрок;
POST_STRING = POST_STRING + XML_DOM.xml + РазделительСтрок + РазделительСтрок;
POST_STRING = POST_STRING + "--" + BOUNDARY + "--" + РазделительСтрок;
WinHttp=СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт.AddObject("WinHttp",WinHttp);
WinHttp.Open("POST", URL, 0);
WinHttp.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
WinHttp.SetRequestHeader("Content-Length", СтрДлина(POST_STRING));
WinHttp.Send(POST_STRING);

Остальное, получение результата. Если делать курлом, то все еще проще, пара строк всего, как в документации к УТМ, но там действительно нужен файл XML.
А в посте #65 я просто написал, что можно создавать XML не как текст, а как DOM с помощью парсера, и дальше уже или сохраняете его как XML, не думая об BOM и прочем, или запихиваете в УТМ как есть, без сохранения.
А если даже и сохранять в файл - то один оператор: XMLDOM.Save(<путь к файлу>), и никаких BOM в нем не будет, и кодировка полученного файла будет как в первой, декларативной строке укажете.
23.01.2025 13:21
А формирование самого XML как выглядит?
23.01.2025 22:05
Хм... На чем бы попроще показать, и что-бы там все функции работы с XML были...
Ну, вот например, формирование XML для запроса информации по АлкоКоду:

Функция ЗапроситьАлкоКод(УТМ_URL, ФСРАР_ID, АлкоКод) Экспорт
XML_DOM=CreateObject("MSXML2.DOMDocument.6.0");
XML_HELPER=CreateObject("Msxml2.MXNamespaceManager.6.0");
XML_HELPER.declarePrefix("qp", "http://fsrar.ru/WEGAIS/QueryParameters");
XML_HELPER.declarePrefix("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""" );
XML_DOM.appendChild(Header);
XML_ROOT = ДобавитьУзел(XML_DOM, XML_HELPER, XML_DOM, "Documents", "ns");
ДобавитьАттрибут(XML_DOM, XML_ROOT, "Version", "1.0");
ДобавитьАттрибут(XML_DOM, XML_ROOT, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
ДобавитьАттрибут(XML_DOM, XML_ROOT, "xmlns:ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
ДобавитьАттрибут(XML_DOM, XML_ROOT, "xmlns:qp", "http://fsrar.ru/WEGAIS/QueryParameters");
XML_OWNER = ДобавитьУзел(XML_DOM, XML_HELPER, XML_ROOT, "Owner", "ns");
XML_FSRAR_ID = ДобавитьУзел(XML_DOM, XML_HELPER, XML_OWNER, "FSRAR_ID", "ns");
ДобавитьТекст(XML_DOM, XML_FSRAR_ID, ФСРАР_ID);
XML_DOCUMENT = ДобавитьУзел(XML_DOM, XML_HELPER, XML_ROOT, "Document", "ns");
XML_REPLYCLIENT = ДобавитьУзел(XML_DOM, XML_HELPER, XML_DOCUMENT, "QueryAP_v2", "ns");
XML_PARAMETERS = ДобавитьУзел(XML_DOM, XML_HELPER, XML_REPLYCLIENT, "Parameters", "qp");
XML_PARAMETER = ДобавитьУзел(XML_DOM, XML_HELPER, XML_PARAMETERS, "Parameter", "qp");
XML_Name = ДобавитьУзел(XML_DOM, XML_HELPER, XML_PARAMETER, "Name", "qp");
ДобавитьТекст(XML_DOM, XML_Name, "КОД");
XML_Value = ДобавитьУзел(XML_DOM, XML_HELPER, XML_PARAMETER, "Value", "qp");
ДобавитьТекст(XML_DOM, XML_Value, СокрЛП(АлкоКод));
// XML_DOM.Save("c:\Temp\Q_AP.xml"); // тут я сохранял для просмотра самого файла перед отправкой. в реали не нужно, закомментировано
RESULT_XML_DOM = ВыгрузитьDOM(XML_DOM, УТМ_URL+"opt/in/QueryAP_v2"); // это уже отправка самого файла в УТМ, функция в предыдущем посте.

// Дальше, тут обработка полученного ответа, разбор XML, формирование таблицы значений, которую вернет эта функция в процедуру для печати результата.

Эта функция использует три экспортных функции из глобального модуля, они универсальные, используются для всех функций формирования XML:


Функция ДобавитьУзел(XML_DOM, XML_HELPER, XML_NODE, Имя, Префикс) Экспорт
Если СокрЛП(Префикс) = "" Тогда
XML_CHILD = XML_DOM.createNode(1,Имя,"");
Иначе
XML_CHILD = XML_DOM.createNode(1,Префикс+":"+Имя,XML_HELPER.getURI(Префикс));
КонецЕсли;
XML_NODE.appendChild(XML_CHILD);
Возврат XML_CHILD;
КонецФункции

Процедура ДобавитьАттрибут(XML_DOM, XML_NODE, Имя, Значение) Экспорт
XML_ATTR = XML_DOM.createAttribute(Имя);
XML_ATTR.nodeValue = Значение;
XML_NODE.setAttributeNode(XML_ATTR);
КонецПроцедуры

Процедура ДобавитьТекст(XML_DOM, XML_NODE, Значение) Экспорт
Попытка
XML_TEXT = XML_DOM.createTextNode(Значение);
XML_NODE.appendChild(XML_TEXT);
Исключение
Сообщить("Ошибка: " + Значение);
КонецПопытки;
КонецПроцедуры

В общем, как-то так...
Принцип - создается объект XMLDOM, и потом с ним идет работа с использованием этих трех функций -

1. Добавляется узел. - всегда, для каждого нового узла
2. Добавляются нужные атрибуты - когда это нужно, когда есть атрибуты в этом узле. Может и не быть
3. Добавляется текстовое содержимое - тоже когда нужно. может отсутствоваить

В результате, после отработки всего этого - образуется готовая структура XML, которуюможно передать в запрос как есть или сохранить в файл.

Правка: MWWRuza, 23.01.2025 22:14
23.01.2025 22:07
Если заинтересовало - прокомментирую непонятные места подробнее.
23.01.2025 22:36
В принципе, для изучения как что работает, вот это:

XML_DOM.Save("c:\Temp\Q_AP.xml");

Можно пихать после каждой строки для визуализации, что получается.
Например, самое начало, обработка для демонстрации:

Процедура Сформировать()
XML_DOM=CreateObject("MSXML2.DOMDocument.6.0");
XML_HELPER=CreateObject("Msxml2.MXNamespaceManager.6.0");
XML_HELPER.declarePrefix("qp", "http://fsrar.ru/WEGAIS/QueryParameters");
XML_HELPER.declarePrefix("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""" );
XML_DOM.appendChild(Header);
XML_ROOT = ДобавитьУзел(XML_DOM, XML_HELPER, XML_DOM, "Documents", "ns");

XML_DOM.Save("c:\Temp\Q_AP.xml");
КонецПроцедуры

Дает такое:


Добавим атрибуты к этому узлу и следующий узел с текстом в нем:

ДобавитьАттрибут(XML_DOM, XML_ROOT, "Version", "1.0");
ДобавитьАттрибут(XML_DOM, XML_ROOT, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
ДобавитьАттрибут(XML_DOM, XML_ROOT, "xmlns:ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
ДобавитьАттрибут(XML_DOM, XML_ROOT, "xmlns:qp", "http://fsrar.ru/WEGAIS/QueryParameters");
XML_OWNER = ДобавитьУзел(XML_DOM, XML_HELPER, XML_ROOT, "Owner", "ns");
XML_FSRAR_ID = ДобавитьУзел(XML_DOM, XML_HELPER, XML_OWNER, "FSRAR_ID", "ns");
ДобавитьТекст(XML_DOM, XML_FSRAR_ID, "1234567890");
Получим:



Дальше - в том-же духе. И не надо думать об структуре XML, наличии/отсутствии BOM, о кодировке файла. Парсер делает это сам.
24.01.2025 12:41
Цитата:
MWWRuza Если заинтересовало - прокомментирую непонятные места подробнее.
Извините, если как-то в чём-то обнадёжил, но цель была не в этом.
Просто сравните ваш и мой вариант по наглядности и простоте понимания.
https://olegon.ru/showpost.php?p=411893&postcount=73
https://olegon.ru/showpost.php?p=411567&postcount=38

И после этого вы будете говорить, что пересохранение файла из-за ВОМ усложняет процесс?
Цитата:
MWWRuza В некоторых случаях даже и сохранять не нужно - так в запрос строкой передается.
И ни о каких BOM и т.п. даже не думаю, парсер это все сам делает.
Мне кажется проще один раз про ВОМ подумать, чем разбираться в построителях и парсерах.
Спорить не буду - это возможно важно и когда-то понадобится в таком виде, но сейчас это перегружало бы процесс.

Правка: FerroPanda, 24.01.2025 12:44
24.01.2025 13:08
Да мне то что...
Вы спросили, как я ХМЛки формирую, я ответил.
Как Вам удобно, так и делайте, главное результат

PS Я один раз освоил этот процесс, и теперь его везде использую, все эти стандартные функции в ГМ - и в ЕГАИС, и в маркировке, и в ЭДО...
Хотя, нет, в маркировке мало где XML используется, там в основном JSON...
20.03.2025 12:13
Цитата:
FerroPanda Igor_NP ➤ ПостроительDOM = Новый ПостроительDOM;
ЧтениеXML=Новый ЧтениеXML ;
ЧтениеXML.ОткрытьФайл(ИмяФайлаДляЗагрузки);
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ТекстЗапроса = ЗаписьXML.Закрыть();
Igor_NP, можете объяснить что тут делается? ...
Нашел время разобраться что тут делается. В итоге весь этот кусок выкинул. Сейчас работает так (У меня - запрос Справки Ф1):

Указываю файл который нужно будет выгрузить в УТМ:

ИмяФайлаДляЗагрузки = КаталогВременныхФайлов() + "QeryRest.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:qf=""http://fsrar.ru/WEGAIS/QueryFormF1F2"">
| <ns:Owner>
| <ns:FSRAR_ID>";

СтрокаЗапроса = СтрокаЗапроса + Строка(ИдентификаторФСРАР) + "</ns:FSRAR_ID>
| </ns:Owner>
| <ns:Document>
| <ns:QueryFormF1>
| <qf:FormRegId>";
СтрокаЗапроса = СтрокаЗапроса + Строка(НомерСправки1) + "</qf:FormRegId>
| </ns:QueryFormF1>
| </ns:Document>
| </ns:Documents>";

Записываю текст запроса в файл для выгрузки QeryRest.xml:

ТекстЗапроса = Новый ТекстовыйДокумент();
ТекстЗапроса.ДобавитьСтроку(СтрокаЗапроса);
ТекстЗапроса.Записать(ИмяФайлаДляЗагрузки,"UTF8");

Формирую тело запроса (используется сформированная строка запроса и ссылка на файл в который ее записал - QeryRest.xml):

ТелоЗапроса = Новый ТекстовыйДокумент();
ТелоЗапроса.РазделительСтрок = Символы.CR+Символы.LF;
ТелоЗапроса.ДобавитьСтроку("--" + Boundary);
ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""xml_file""; filename=""QeryRest.xml");
ТелоЗапроса.ДобавитьСтроку("Content-Type: text/xml; charset=utf-8");
ТелоЗапроса.ДобавитьСтроку("");
ТелоЗапроса.ДобавитьСтроку(СтрокаЗапроса);
ТелоЗапроса.ДобавитьСтроку("--" + Boundary + "--");
ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();

Формирую запрос HTTP:

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

Дальше выгружаю в УТМ, Запрос уходит успешно, ответ успешно получаю:

Соединение = Новый HTTPСоединение(
СокрЛП(АдресСервера),
ПортУТМ,,,
,
Таймаут);
Часовой пояс GMT +3, время: 23:39.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.