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...
Часовой пояс GMT +3, время: 21:54.

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