Пример заполнения/создания файла XML из XSD схемы, используя XDTO

Обмен - Обмен через XML

Добрый день, коллеги! Наконец-то дошли руки написать сию статью. Хочу поделиться своим опытом по разбору xsd схемы используя Фабрику XDTO, а также связанным с этим XML файлом. Думаю, наверняка кому-то понадобится.

Все будет сухо, без лирики и т.п.

Итак. Мне принесли задание. Подружить 1С с внешним сервисом по приему отчетности в виде xml файла.

Сторонний сервис имеет свой API по приему файлов, на выходе выдает некий код «батч», по которому я смогу вызвать еще одну функцию и получить по этому батчу, всю развернутую информацию по ошибкам.

Файл схема xsd небольшая, но типов данных много, на основе этой схемы полностью сформированный XML файл занимает что-то около 200Мб.

Дали ссылку на сайт, где можно узнать все остальное. Показывать ссылку не имеет смысла, т.к. доступ только после авторизации.

В итоге я имел на руках некий файл с расширением «xsd».

На тот момент я даже понятия не имел, что это и с чем и как его едят.

Дали какие-то пароли, логины, ссылку, куда все это выкладывать, и дали срок 3 недели.

Очень помог Инфостарт (не без этого, конечно, – огромное спасибо).

Для начала ниже материал, которым я пользовался, пока не завершил этот мини проект, и поэтому вот ссылки вам в помощь, которые могут понадобиться в дальнейшем, я думаю, это «маст-хэйв» для тех, кто хочет обучиться правилам XDTO:

//infostart.ru/public/167459/ - все три части

//infostart.ru/public/98019/ - похоже на «XDTO это просто», но сыроват

//infostart.ru/public/311011/ - написано просто и доступно

//infostart.ru/public/689184 

Что в итоге.

  1. Есть файл с правилами, ниже показана картинка в компактном виде, весь xsd файл можно увидеть во вложении.
     
    Рис.1

     
     
     
    Скажу, что на момент, когда я получил данный файл, я мог кое-как создавать типы XDTO. Читал статью «XDTO это просто» (все три части, конечно, не всё вкурил, как без этого).
    И в итоге умел примерно такое:
     
    Рис.2

    (вырезка из другого кода)
     
    То есть я мог создать тип «объектXDTO, если этот тип был расположен в дереве импортированной схемы в ветке «Типы объектов».Но на рисунке 1 выше видно, что все важные данные создаются только через ветку «свойства».
     
    Рис.3

     
    К примеру, на рис.3 видно, что у свойства «FirstName» один параметр «Name» является типом, ссылка на которую уводит в ветку «Типы объектов», а уже таааам указывается, что это за тип и что он в себе еще дополнительно содержит.
     
    Рис.4
     
     
     
    Как быть?
    Что делать?
    Как их прочитать?
    Как на их основе мне создать тип «ОбъектXDTO», ведь через создать запись можно только если записываемый/создаваемый тип является типом «ОбъектXDTO»?
    Что только не приходилось делать… я же умел создавать и записывать значения только если требуемые расположены в ветке «Типы объектов».
     
    Даже дошел до того, что попробовал изменить схему.
    Всё, что находилось в ветке «Свойства», я начал переносить в ветку «Типы объектов», начал создавать «туеву хучу» неправильных вещей, в итоге пришлось бросить весь гемор, пойти перекурить, и искать новые способы.
    Попробовал все тестировать в «Liquid XML» - не получилось.
    Потом попробовал все в «Visual Studio» - тоже …
    Очень много звонил разработчикам этих схем, где им, наверное, думалось – «Вот чудик, он что, не знает про SOAP-ы, это же допотопный механизм обмена, странные он вопросы задает, хмм…» (кстати  им тоже спасибо. открыли глаза 1С-нику).
     
     
     
    В итоге.
    В начале скажу, что у меня по условиям сбора данных есть некий первичный справочник список, в котором есть много реквизитов, которые необходимы для этого файла.
    Данные собираются, фильтруются сортируются и в итоге я получаю готовую Таблицу значений.
    Далее прохожу циклом эту таблицу и заполняю соответствующие реквизиты.
     
    Итак, как я начал считывать XSD и создавать XML файлы.
     
    Вначале считал пакет
    Рис.5

     
    Получил пакет в таком виде.
    Рис.6

     
    Далее мне нужно найти и спозиционироваться на свойстве «Records» 
     
    Вот она в дереве
    Рис.7

     
    Как это делается?
    Скажу, что это как магия.
    Пишем:
    Рис.7

     
    И мы получаем то значение, которое потом можем превратить в тип «ОбъектXDTO»
     
    Вот код:
     
    Рис.8

         
     
    Получаем на выходе готовый нам нужный тип и делаем с ним все, что нужно.
    К примеру, я должен пройтись циклом по реквизитам полученного объекта.
     
     
    Рис.9

 

Просьба смотреть «не в воду», а в суть.

Тут главные строки это:

Рис.10

И (опять магия)

Рис.11

И т.д. далее, пока не получите что хотели.

Для получения каких-либо реквизитов свойства в схеме xsd пользуюсь такой конструкцией кода,

Но скажу, что видел и другие способы, тут, как говорится, дело ваше.

 

Рис.12

 

Результат рисунков с 7 по 12

Выглядит вот так в готовом файле:

Рис.13

 

И вот что я заметил (ну местные гуру, может, и знают давным-давно).

Это как бы и правила, и пометка.

Рассмотрим свойство «ContractCode»

Вот его описание:

Рис.14

Если это свойство имеет форму как «Элемент», то тогда код выглядит таким:

Рис.15

Т.е. я срази пишу значение в параметр, просто «= равно» и пошел.

Если свойство имеет форму как «Элемент», но он записан через знак «+»

Как вот тут

 

То его код выглядит немного иначе

Рис.16

 

Т.е. нужно сначала создать через фабрику этот тип, получить его подчиненные подтипы и уже им присваивать значения из ваших данных.

И в итоге получается вот что.

Если в схеме это свойство имеет форму «элемент»

То в готовом файле запишется такая запись:

 

Т.е. все будет записано внутри т.н. «тегов».

 

Далее если вы имеете в схеме такую связку значений и ее свойства:

рис.17

Т.е. у свойства «FundingType» есть подчиненный элемент «id», где его форма равна «Атрибут»

В этом случае код при написании НЕ изменится:

Замечу, что этот код похож на рис.16

Воот, а результат будет немножко другой:

Рис.18

 

Т.е. значение запишется сразу в сам «тег».

 

Далее.

Есть такое свойство, как «Gender»

Он в свою очередь имеет ссылку на другой тип:

Рис.19

 

А вот сам тип «GenderType»

Описан вот так.

Рис.20

Вот его свойства:

Рис.20.1

Тут говорится, что данный тип значения в целом равен типу «string», но он вариант у него «атомарный», т.е. имеет, скажем, «перечисление». И его перечисления, это

Тип ее:

Рис.20.2

Аналогично и с «F»

Теперь дилемма, как мне его получить и как его записать.

Вот ответ (сам искал полдня):

Рис. 21

Тут весь фокус в строке

 

Советую почитать про «Фасеты». Там все просто.

Ну и в завершение.

Собираем файл этими строками:

 

Тут лишь в конце стоит сказать один момент.

Принимающая сторона не передала значение «xmlns», пришлось ее искать и вписывать в начало файла, вот пример:

 

Думаю, на этом все!

Скачать файлы

Наименование Файл Версия Размер
Пример схемы xsd
.xsd 47,59Kb
15.12.17
2
.xsd 47,59Kb 2 Скачать
результат в виде xml
.xml 8,02Kb
15.12.17
1
.xml 8,02Kb 1 Скачать
Обработка с исходыми кодами
.epf 99,07Kb
15.12.17
5
.epf 99,07Kb 5 Скачать

См. также

Комментарии
1. Петр Малыгин (pm74) 105 21.12.17 11:22 Сейчас в теме
(0) возьмем на карандаш.
Прикольная цветовая схема . У меня примерно такая же , глаза не так устают(жаль только , что нельзя делать импорт/экспорт)
CyberCerber; +1 Ответить
2. Денис Никифоров (user649060) 21.12.17 12:24 Сейчас в теме
(1)
жаль только , что нельзя делать импорт/экспорт

Можно же, все эти настройки в файлике .pfl
https://its.1c.ru/db/metod8dev/content/3746/hdoc/_top/pfl
Saint13; CyberCerber; +2 Ответить
5. Петр Малыгин (pm74) 105 21.12.17 14:14 Сейчас в теме
8. Дмитрий Гавр (gavrilov_dv) 22.12.17 10:42 Сейчас в теме
(2) Поделитесь настройками цветов пожалуйста!
Хочу такую схему, но на ручную настройку нервов не хватит)))
10. Rauan Sandybaev (sandybaev) 126 22.12.17 13:40 Сейчас в теме
13. Artem Kolos (Rokstedi) 17 27.12.17 14:53 Сейчас в теме
(2) а дерево конфигурации и свойства белые остаються?
14. Денис Никифоров (user649060) 27.12.17 15:28 Сейчас в теме
(13) Эти настройки уже вроде хранятся в кэшах конкретных информационных баз
16. Денис Никифоров (user649060) 28.12.17 12:48 Сейчас в теме
(14) брр.. не так понял вопрос. думал вопрос про сохранение положений окон с деревом и свойствами
15. Rauan Sandybaev (sandybaev) 126 28.12.17 08:46 Сейчас в теме
(13) К огромному сожалению остальное белое
3. bulpi bulpi (bulpi) 128 21.12.17 12:50 Сейчас в теме
Спасибо за подробные объяснения.
По нынешним временам перечисление GenderType M/F может быть недостаточно :)
Yimaida; sandybaev; +2 Ответить
4. Rauan Sandybaev (sandybaev) 126 21.12.17 13:26 Сейчас в теме
(3) :) без комментариев...
6. Александр Шипков (sansys) 43 22.12.17 08:47 Сейчас в теме
Материал отличный, однозначно плюс!!! Как раз к стати, в январе придётся заниматься xsd схемами, а тут так шикарно разжёвано. Огромное спасибо за статью.
7. Алексей Захаров (almas) 192 22.12.17 10:36 Сейчас в теме
Спасибо. Читать тяжело, но полезно. Информации по данной теме в инете явно маловато.
9. Rauan Sandybaev (sandybaev) 126 22.12.17 12:12 Сейчас в теме
Спасибо. рад что пригодилось. если будут вопросы, помогу где знаю. пишите
11. Андрей Овсянкин (Evil Beaver) 5103 22.12.17 17:29 Сейчас в теме
Даешь больше статей про XDTO!

Ну и от меня, как от автора упомянутой "XDTO - это просто" - отдельное спасибо, что читаете и упоминаете.
Alligator84; sandybaev; +2 Ответить
12. Дмитрий Денисов (Uncore) 1195 24.12.17 17:59 Сейчас в теме
Отдельный плюс за грамотность, приятно читать :)
sandybaev; +1 Ответить
17. Валерий Калинин (klinval) 255 28.12.17 15:57 Сейчас в теме
Тоже только недавно впервые начал работать с XDTO. Статья хорошая жалко её не было пару месяцев назад))

Хотел бы добавить к списку статей:
Пророк в своем отечестве или Читаем XML с помощью XDTO
Там сквозной мини пример. Мне очень пригодился.
//infostart.ru/public/98019/ - похоже на «XDTO это просто», но сыроват

Не согласен. Мне наоборот эта статья больше понравилась чем «XDTO это просто». Но о вкусах не спорят))
18. Дамир Закиров (Dzenn) 229 16.02.18 10:26 Сейчас в теме
Круто, молодец, отличная работа и отличное изложение
19. john key (kadild) 19.02.18 23:55 Сейчас в теме
Спасибо за статью. Скриншоты кода, 50 оттенков синего... Самый опасный цвет для глаз
Оставьте свое сообщение