![]() |
|
А можно как то создать 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
|
||||
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рек |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |