Вход | Регистрация

1С:Предприятие ::

Метки: 

А можно как то создать XML из XDTO не мучаясь?

Я
   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С?
 
 
   RomaH
 
1 - 23.02.18 - 12:48
ЗаписьXML = Новый ЗаписьXML;
        
        ЗаписьXML.УстановитьСтроку("windows-1251");
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КорневойРаздел);
        
        ТекстВыгрузки = ЗаписьXML.Закрыть();
   DES
 
2 - 23.02.18 - 13:25
что такое "КорневойРаздел"?
   DES
 
3 - 23.02.18 - 13:51
(1) А понял.
Я не спрашиваю что дальше делать, я спрашиваю что вместо этого делать.
Все выводится, все работает, только муторно это все собирать.
Ведь вся инфа есть в xdto, и система ее знает, зачем мне порхаться с 
Documents_Свойство = КорневоеСвойство.Получить("Documents");
Documents_Тип = Documents_Свойство.Тип;
и т.д. для каждого элемента.
   RomaH
 
4 - 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"/>
   DES
 
5 - 23.02.18 - 15:41
У меня в конфигураторе импортирована схема.
Нужно создать файл xml
Для этого приходиться описывать каждый элемент, перед заполнением, вручную.
т.е. создавать ОбъектXDTO.
Это муторно, строк кода до сотни.
Я же говорю, в конфиге вся инфа есть об объекте, почему бы разработчики 1С не сделали команду СоздатьXDTOизСхемы(ТутУказываетсяСхема)
   RomaH
 
6 - 23.02.18 - 15:50
короче держи - разбирайся

там порядка 5 процедур тебе надо будет
https://yadi.sk/i/r8t3Irsf3Shx7Q
   hawksib
 
7 - 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рек


Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует