Имя: Пароль:
1C
1С v8
Вопрос по XDTO
,
0 FiftyStars
 
27.04.19
21:34
Здравствуйте.
Сегодня решил впервые коснуться этого зверя.
Понятной документации ооооочень мало, даже статьи, которые якобы для тех, кто впервые видит XDTO, на самом деле написаны для тех, кто на XDTO если не целиком собаку съел, то облизал лапы и хвост точно.
Собственно взял простую схему из ЕГАИС, вроде XML генерится, но все же не совсем правильно.

    ПакетОбщий = ФабрикаXDTO.Пакеты.Получить("http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01";);
    ПакетЗапросМарок = ФабрикаXDTO.Пакеты.Получить("http://fsrar.ru/WEGAIS/QueryFilter";);
    
    КорневоеСвойство = ПакетОбщий.КорневыеСвойства.Получить("Documents");
    БазовыйТип = КорневоеСвойство.Тип;
    ОбъектXDTO = ФабрикаXDTO.Создать(БазовыйТип);
    ОбъектXDTO.Version = 1;
    
    
    ОбъектВладелец = ФабрикаXDTO.Создать(БазовыйТип.Свойства.Получить("Owner").Тип);
    ОбъектВладелец.FSRAR_ID = 9;
    ОбъектXDTO.Owner = ОбъектВладелец;
    
    
    ТипДокумент = БазовыйТип.Свойства.Получить("Document").Тип;
    ОбъектXDTO.Document = ФабрикаXDTO.Создать(ТипДокумент);
    ОбъектXDTO.Document.QueryFilter = ФабрикаXDTO.Создать(ТипДокумент.Свойства.Получить("QueryFilter").Тип);
    ОбъектXDTO.Document.QueryFilter.bc.Добавить("1");
    ОбъектXDTO.Document.QueryFilter.bc.Добавить("2");
    ОбъектXDTO.Document.QueryFilter.bc.Добавить("3");
    
    ЗаписьXML = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Истина);
    ЗаписьXML.УстановитьСтроку(ПараметрыЗаписиXML);
    ЗаписьXML.ЗаписатьБезОбработки("<?xml version=""1.0"" encoding=""UTF-8"" standalone=""no""?>" + Символы.ПС);
    ЗаписьXML.ЗаписатьНачалоЭлемента(КорневоеСвойство.ЛокальноеИмя, КорневоеСвойство.URIПространстваИмен);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", ПакетЗапросМарок.URIПространстваИмен);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ns", ПакетОбщий.URIПространстваИмен);
    ЗаписьXML.ЗаписатьАтрибут("Version", ОбъектXDTO.Version);
    ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO.Owner, "Owner", ПакетЗапросМарок.URIПространстваИмен);
    ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO.Document, "Document", ПакетЗапросМарок.URIПространстваИмен);
    ЗаписьXML.ЗаписатьКонецЭлемента();
    Сообщить(ЗаписьXML.Закрыть());


На выходе имеем XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ns:Documents xmlns="http://fsrar.ru/WEGAIS/QueryFilter";
        xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01";
        Version="1">
    <Owner xmlns:xs="http://www.w3.org/2001/XMLSchema";
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
        <ns:FSRAR_ID>9</ns:FSRAR_ID>
    </Owner>
    <Document xmlns:xs="http://www.w3.org/2001/XMLSchema";
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
        <ns:QueryFilter>
            <bc>1</bc>
            <bc>2</bc>
            <bc>3</bc>
        </ns:QueryFilter>
    </Document>
</ns:Documents>

XML из документации

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ns:Documents xmlns="http://fsrar.ru/WEGAIS/QueryFilter";
        xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"; Version="1.0">
    <ns:Owner>
        <ns:FSRAR_ID>030000328912</ns:FSRAR_ID>
    </ns:Owner>
    <ns:Document>
        <ns:QueryFilter>
            <bc>1</bc>
            <bc>2</bc>
            <bc>3</bc>
        </ns:QueryFilter>
    </ns:Document>
</ns:Documents>

Появляются вопросы:
как убрать ns из Document и Owner?
Как сделать объявление XML с standalone="no" не используя костыль ЗаписьXML.ЗаписатьБезОбработки("<?xml version=""1.0"" encoding=""UTF-8"" standalone=""no""?>" + Символы.ПС)?
Как убрать объявление пространств имен в Document и Owner?

Про то, что корневой нужно записать вручную, для возможности указания пространств имен вычитал в этой теме Можно ли в XDTO пакете задать префикс для пространства имен?

Вопросы может дилетантские, но ничего на ум не приходит.
1 Рэйв
 
27.04.19
21:42
Удачи тебе и счастья.
2 FiftyStars
 
27.04.19
21:50
(1) Спасибо, взаимно, но оно так не работает)))
3 FiftyStars
 
27.04.19
22:09
Прошу прощение за оформление, думал автоматом распознается. О_о
Жаль предпросмотра нет(((
4 FiftyStars
 
27.04.19
22:10
(3) о как. Не понял. А почему там оформилось? О_о
5 Cyberhawk
 
28.04.19
08:34
До какого-то момента запись ХМЛ через ХДТО-обвязку 1С прокатывает и ты вроде даже радуешься, что все красиво и аккуратно.
Но рано или поздно наступает момент, когда все равно приходится железобентонным дедовским способом собирать ХМЛ в циклах, с ручной записью начал и концов тэгов.
6 Cyberhawk
 
28.04.19
08:36
Префикс убирается через указание пустой строки в методе ЗаписатьСоответствиеПространстваИмен
7 IVT_2009
 
28.04.19
18:31
В том же оптовом егаис использовал для чтения данных. Но сейчас стал уходить на DOM. При записи  точно не стоит использовать. Вот пример вашего запроса:

&наСервере
функция создатьЗапросНаОстатокМарокПоИД(ид) ЭКСПОРТ
    
    вернутьОтвет = новый структура;
    
    стр = "<?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>[рарИД]</ns:FSRAR_ID>
    |    </ns:Owner>
    |    <ns:Document>
    |        <ns:QueryRestBCode>
    |            <qp:Parameters>
    |                <qp:Parameter>
    |                    <qp:Name>ФОРМА2</qp:Name>
    |                    <qp:Value>[формаИД]</qp:Value>
    |                </qp:Parameter>
    |            </qp:Parameters>
    |        </ns:QueryRestBCode>
    |    </ns:Document>
    |</ns:Documents>";

            
    стр = стрЗаменить(стр,"[рарИД]"            ,константы.текущийТранспорт.Получить().код);
    стр = стрЗаменить(стр,"[формаИД]"        ,ид);
    
    РазделительСтрок = Символ(13)+Символ(10);
    
    вернутьОтвет.Вставить("исходныйЗапрос",стр);
    вернутьОтвет.Вставить("ответ","тестоввый прогон");
    
    //возврат вернутьОтвет;
    
    ФайлОтвета     = ПолучитьИмяВременногоФайла("xml");
    boundary     = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    
    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    xml_file = "ttn.xml";
    
    стрЗапроса = "--" + Boundary + "
    |Content-Disposition: form-data; name=""xml_file""; filename=""" + xml_file + """" + РазделительСтрок +
    "Content-Type: application/xml" + РазделительСтрок + РазделительСтрок+
    стр + РазделительСтрок + РазделительСтрок
            + РазделительСтрок + "--" + Boundary + "--" + РазделительСтрок;
            
            
    WinHttp.Open("POST", "http://"+константы.текущийТранспорт.Получить().адресСервера+"opt/in/QueryRestBCode";, 0);
    WinHttp.SetRequestHeader("Content-Type","multipart/form-data; boundary=" + Boundary);
    WinHttp.SetRequestHeader("Content-Length", СтрДлина(стрЗапроса));
    WinHttp.Send(стрЗапроса);
    вернутьОтвет.Вставить("ответ",WinHttp.ResponseText());
    возврат  WinHttp.ResponseText();
        
конецФункции    //создатьЗапросНаОстатокМарокПоИД