Имя: Пароль:
1C
1С v8
А можно как то создать XML из XDTO не мучаясь?
0 DES
 
23.02.18
11:47
Делаю так:

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("windows-1250");
НаборСхемXML = ФабрикаXDTO.ЭкспортСхемыXML(Имя_XDTO_пакета);
Фабрика = Новый ФабрикаXDTO(НаборСхемXML);
Пакет = Фабрика.Пакеты.Получить(Имя_XDTO_пакета);
КорневоеСвойство = Пакет.КорневыеСвойства;
Documents_Свойство        = КорневоеСвойство.Получить("Documents");
Documents_Тип            = Documents_Свойство.Тип;
XML_Documents    = Фабрика.Создать(Documents_Тип);

но мне кажется что можно все это сделать гораздо проще, типа:
XML_Documents = ХитраяФункцияОт1С(Имя_XDTO_пакета);

или я слишком хорошо думаю об 1С?
1 RomaH
 
naïve
23.02.18
12:48
ЗаписьXML = Новый ЗаписьXML;
        
        ЗаписьXML.УстановитьСтроку("windows-1251");
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КорневойРаздел);
        
        ТекстВыгрузки = ЗаписьXML.Закрыть();
2 DES
 
23.02.18
13:25
что такое "КорневойРаздел"?
3 DES
 
23.02.18
13:51
(1) А понял.
Я не спрашиваю что дальше делать, я спрашиваю что вместо этого делать.
Все выводится, все работает, только муторно это все собирать.
Ведь вся инфа есть в xdto, и система ее знает, зачем мне порхаться с
Documents_Свойство = КорневоеСвойство.Получить("Documents");
Documents_Тип = Documents_Свойство.Тип;
и т.д. для каждого элемента.
4 RomaH
 
naïve
23.02.18
15:34
тебе XML с описаниями нужен что-ли?


я выгружаю итоговый документ - что в корневой передашь - то и выгрузит в текст

у меня - самый верхний ОбъектXDTO

и получаю:
<?xml version="1.0" encoding="windows-1251"?>
<anyType xmlns="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; name="87 Простые и сложные медицинские услуги">
    <sms xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"; code="A01.01.001" name="Сбор анамнеза и жалоб в дерматологии" smp="0" stomat="0" tube_type="0" label_transfer="0" label_vizit="0"/>
    <sms xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"; code="A01.01.001.001" name="Сбор анамнеза и жалоб при термических, химических и электрических ожогах" smp="0" stomat="0" tube_type="0" label_transfer="0" label_vizit="0"/>
5 DES
 
23.02.18
15:41
У меня в конфигураторе импортирована схема.
Нужно создать файл xml
Для этого приходиться описывать каждый элемент, перед заполнением, вручную.
т.е. создавать ОбъектXDTO.
Это муторно, строк кода до сотни.
Я же говорю, в конфиге вся инфа есть об объекте, почему бы разработчики 1С не сделали команду СоздатьXDTOизСхемы(ТутУказываетсяСхема)
6 RomaH
 
naïve
23.02.18
15:50
короче держи - разбирайся

там порядка 5 процедур тебе надо будет
https://yadi.sk/i/r8t3Irsf3Shx7Q
7 hawksib
 
25.02.18
02:28
(5) я создаю только первый объект, а потом его заполняю в рекурсии, а в соответствии указываю, какое значение должно какому полю присваиваться, если при заполнении нет списка или список в виде одного элемента только у последнего объекта, рекурсия отлично всё заполняет, код как вызываю процедуру и сама процедура вот -
вызов:

VetDocumentStatusChangeDO = ФабрикаXD.Создать("http://api.vetrf.ru/schema/cdm/mercury/vet-document/v2";, "VetDocumentStatusChange");    //Сведения об установлении статуса ветеринарного документа.
    VetDocumentStatusChangePM = Новый Соответствие;
    VetDocumentStatusChangePM.Вставить("specifiedPerson/fio", confirmedBy_fio); //ФИО врача, оформившего ВСД.
    VetDocumentStatusChangePM.Вставить("specifiedPerson/post", confirmedBy_post);//Должность врача, оформившего ВСД.
    VetDocumentStatusChangePM.Вставить("status", "CONFIRMED");
    ЗаполнитьСвойстваОбъектаXDTOрек(VetDocumentStatusChangeDO, VetDocumentStatusChangePM);

процедура:

Процедура ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO, тСоответствие)
    Для Каждого Эл Из тСоответствие Цикл
        ЛевоеИмяПоля = ?(Найти(Эл.Ключ, "/") <> 0, Лев(Эл.Ключ, Найти(Эл.Ключ, "/")-1), Эл.Ключ);
        ПравыеИменаПолей = Прав(Эл.Ключ, СтрДлина(Эл.Ключ) - Найти(Эл.Ключ, "/"));
        Если ЛевоеИмяПоля = ПравыеИменаПолей Тогда
            Если ТипЗнч(ОбъектXDTO[ЛевоеИмяПоля]) = Тип("СписокXDTO") Тогда
                ОбъектXDTO[ЛевоеИмяПоля].Добавить(Эл.Значение);
            Иначе
                ОбъектXDTO[ЛевоеИмяПоля] = Эл.Значение;
            КонецЕсли;
        Иначе
            Если ОбъектXDTO[ЛевоеИмяПоля] = Неопределено Тогда
                ОбъектXDTO[ЛевоеИмяПоля] = ФабрикаXD.Создать(ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.URIПространстваИмен, ОбъектXDTO.Тип().Свойства.Получить(ЛевоеИмяПоля).Тип.Имя);
            КонецЕсли;
            ИменаПолей = Новый Соответствие;
            ИменаПолей.Вставить(ПравыеИменаПолей, Эл.Значение);
            ЗаполнитьСвойстваОбъектаXDTOрек(ОбъектXDTO[ЛевоеИмяПоля], ИменаПолей);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры // ЗаполнитьСвойстваОбъектаXDTOрек