Краткое описание создания XML файла по XSD схеме на примере создания выгрузки Статистической отчетности для ФТС





Появилась задача создания XML файла на основе XSD схемы. Поиски по форумам приводили к большому количеству обсуждений, связанных с непониманием процесса, и всего к паре статей объясняющих суть. Люди задавали вопросы, бились над решением, но после того как задача поддавалась им, просто исчезали, не описав механизм. Это подтолкнуло на создание простого описания процесса.
P.S. Не ругайтесь сильно, моей целью не было создание некой наукообразной статьи, строго использующей правильную терминологию, а желание просто помочь сделать первый шаг к пониманию очень мощного механизма обмена через XML.
P.P.S. Сразу должен оговориться, что прилагаемый к статье файл выгрузки является только заготовкой, создающей только часть требуемой структуры XML файла, т.к. моя работа с этой выгрузкой имела скорее познавательный характер (копировать предыдущий документ по экспорту на сайте ФТС и загружать из Excel’овского файла только табличную часть Товары представилось более эффективным решением), а недостаток времени не позволял дописать создание всей структуры, исходя только из соображений перфекционизма.

 Итак, зарегистрировавшись на сайте ФТС, стало понятно, что для создания документов Статистической отчетности по экспорту требуется выгрузка данных из документов Реализация товаров и услуг Управления торговлей и создания файла для загрузки.

Там возможно два варианта загрузки.

Первый: загрузка табличной части с Товарами из файла Excel (этот вариант и был выбран как рабочий, т.к. имел те плюсы, что не надо было возиться с обработкой «Шапки» документа, а можно было просто копировать предыдущий, изменив в «Шапке» то, что требовалось).

Второй: создание XML файла по схеме скачаной с сайта ФТС в виде «Альбома форматов электронных форм документов». Альбом представляет из себя достаточно большое количество XSD схем. В них была найдена схема «Статистической формы учета перемещения товара» и дополнительные файлы с описаниями типов для нее. Схемы прилагаются к статье в архиве с обработкой.

Для просмотра XSD схем использовался бесплатный Майкрософтовский XML Notepad 2007.

Схема StaticForm.xsd

На изображении показан основной файл со схемой XSD «Статистическая форма учета перемещения товара». На изображении выделены основные блоки XSD схемы, требуемые нам для ее понимания.

Из схемы видно, что нам надо получить XML файл, заполненый структурой, указанной в ветке «xs:element» типа StaticFormType.

Элемент

Структура может быть достаточно сложной (как и в нашем случае). С описаниями типов, присутствующими непосредственно в ветке, вынесенными в отдельную ветку или даже находящимися в другом файле.

Тип элемента

Данная структура имеет тип StaticFormType, который в свою очередь, состоит из базового типа BaseDocType, набора объектов разных типов и текстовых аттрибутов.

Путь к описанию 

Базовый тип BaseDocStyle описывается в другом файле (и пространстве имен)Тип BaseDocStyle из другого файла.

Этот файл содержит в себе еще массу типов, которые не используются в нашем случае. 

  

Теперь перейдем к работе в 1С. В двух словах, то что нам надо сделать сводится к следующему:

1. Создается ФабрикаXDTO

НашаФабрикаXDTO = СоздатьФабрикуXDTO(МассивПолныхИменФайловСоСхемамиXSD);

2. В фабрикеXDTO создаются все сложные типы данных, которые далее мы будем заполнять в создаваемом файле XML:

StaticFormType = МояФабрикаXDTO.Тип("urn:customs.ru:Information:CustomsDocuments:StaticForm:5.4.0", "StaticFormType");

Типы данных, входящих в некий тип, можно получить из коллекции его свойств:

CUOrganizationType = StaticFormType.Свойства.Получить("Consignee").Тип;

NameType = CUOrganizationType.Свойства.Получить("OrganizationName").Тип;
ShortNameType = CUOrganizationType.Свойства.Получить("ShortName").Тип;
LanguageCodeType = CUOrganizationType.Свойства.Получить("OrganizationLanguage").Тип;

3. Когда все сложные типа данных созданы, создаем на их основе структуру XML файла, состоящую из объектов ФабрикиXDTO:

StaticFormType_ОбъектXDTO = МояФабрикаXDTO.Создать(StaticFormType);
// коллекция с документами
NewDocuments = МояФабрикаXDTO.Создать(DocumentsType);
NewDocuments.PrDocumentName = МояФабрикаXDTO.Создать(PrDocumentNameType, "Товарная накладная");
NewDocuments.PrDocumentNumber = МояФабрикаXDTO.Создать(PrDocumentNumberType, "123-номер");
NewDocuments.PrDocumentDate = МояФабрикаXDTO.Создать(PrDocumentDateType, "2014-10-05");
StaticFormType_ОбъектXDTO.Documents.Добавить(NewDocuments);

Одновременно заполняем элементарные (простых типов) реквизиты.

4. Ну и наконец выгружаем все из ФабрикиXDTO в файл:

ФайлXML = Новый ЗаписьXML();
ФайлXML.ОткрытьФайл(ИмяФайла);
ФайлXML.ЗаписатьОбъявлениеXML();
МояФабрикаXDTO.ЗаписатьXML(ФайлXML, StaticFormType_ОбъектXDTO);
ФайлXML.Закрыть();

P.S. В архиве содержится файл заготовки выгрузки в XML (создаются только некоторые реквизиты, отражающие все случае заполнения файла) и схемы XSD. 

Разархивировать все файлы в некоторую директорию.

XML будет создаваться в ней же.

 

 

4 Comments

  1. Yashazz

    Вы меня, конечно, извините, но плохо искали. Evil Beaver всё это уж давным-давно разжевал детально и досконально в своих публикациях, и не он один. Баян, короче.

    Гораздо интереснее другой, действительно мало освещённый вопрос — создание схем на основании имеющихся xml-файлов, т.к. общеизвестно, что плоды трудов стандартных генераторов xsd сама 1С вообще не воспринимает, и лишь методом тыка выяснено несколько неприемлемых для неё моментов. Я вот схемы всегда вынужден генерить «по месту», а общего решения не видел.

    Reply
  2. katkov_a

    Да! Evil Beaver — отдельное спасибо. Я и не замахивался превзойти его статьи. Просто хотел свой опыт рассказать, допускаю, что это кому-нибудь будет полезно.

    «создание схем на основании имеющихся xml-файлов» — скорее файлы стоит делать из схем. Ну это я так, ну не что бы поумничать. 🙂 Просто файл может (что скорее всего и случится) не давать полного представления о форматах данных реквизитов.

    Кстати схемы из ФТС вполне себе без ошибок импортировались в ОбъектыXDTO.

    Reply
  3. ABVera

    Спасибо! попробую использовать на практике

    Reply
  4. baan5c

    Автор нечитаемый.

    Что-то отметил красным в шаблонном XML. Что-то заменил. И у него что-то получилось.

    Имеет ли этот расплывчатый рецепт универсальный характер копипаста? Нет.

    Он интересен 2-3 бедалагам, пошедшим тем же путем тыка исключительно с информационной целью, что автору удалось вручную сформировать XML файл из шаблона.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *