Xsi type xs string 1с не выводить в xml

Обновлено: 03.07.2024

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

XML документ

Давайте посмотрим на следующий XML документ под названием "shiporder.xml":

Приведенный выше XML документ состоит из корневого элемента shiporder с обязательным атрибутом orderid. Элемент shiporder содержит три дочерних элемента: orderperson, shipto и item. Элемент item используется дважды и содержит элемент title, необязательный элемент note, а также элементы quantity и price.

Строка xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" говорит XML парсеру, что этот документ должен быть проверен на соответствие схеме. Строка xsi:noNamespaceSchemaLocation="shiporder.xsd" указывает, где именно находится схема (в данном случае она находится в той же папке, что и файл "shiporder.xml").

Создание XML схемы

Теперь для приведенного выше XML документа создадим XML схему.

Создадим новый файл, который назовем "shiporder.xsd". Для создания XML схемы будем просто следовать за структурой XML документа и определять каждый встреченный элемент. Начнем со стандартной XML декларации, за которой опишем элемент xs:schema, который и определяет саму схему:

Теперь мы должны определить элемент shiporder. У этого элемента есть атрибут, и он содержит другие элементы, поэтому мы рассматриваем его как элемент составного типа. Определения дочерних элементов элемента shiporder поместим в декларацию xs:sequence, что задает жесткую последовательность подэлементов:

Теперь определим элемент orderperson, который будет простого типа (так как он не содержит ни атрибуты, ни другие элементы). Его тип (xs:string) имеет префикс пространства имен, ассоциированного с XML схемой, что указывает на использование предопределенного типа данных:

Теперь нам нужно определить два элемента составного типа: shipto и item. Начнем с определения элемента shipto:

При помощи схем мы можем определить число возможных вхождений любого элемента. В этом нам помогут атрибуты maxOccurs и minOccurs. Атрибут maxOccurs задает максимальное число вхождений элемента, а атрибут minOccurs задает минимальное число вхождений. По умолчанию значение обоих атрибутов равно 1.

Теперь определим элемент item. Этот элемент может использоваться неограниченное число раз внутри элемента shiporder. Определить такую особенность элемента item позволяет присваивание атрибуту maxOccurs значения "unbounded". Это означает, что элемент item может использоваться столько раз, сколько нужно автору документа. Обратите внимание, что элемент note опционален. Определим это установив атрибут minOccurs в нулевое значение:

Теперь мы можем декларировать атрибут элемента shiporder. Поскольку это обязательный атрибут, используем определение use="required".

Примечание: Атрибуты должны всегда декларироваться последними:

Вот полный код файла схемы "shiporder.xsd":

Разделение схемы

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

Следующий способ компоновки схемы заключается в том, что сначала определяются все элементы и атрибуты, а затем на эти определения создаются ссылки при помощи атрибута ref.

Ниже приводится новая компоновка файла схемы ("shiporder.xsd"):

Использование поименованых типов

Третий способ компоновки схемы предполагает определение классов или типов, которые позволяют повторное использование определений элементов. Это становится возможным, если дать имена элементам simpleTypes и complexTypes, а затем указать на них при помощи атрибута type.

Третий способ компоновки файла схемы ("shiporder.xsd"):

Элемент restriction указывает на то, что тип данных является производным от типов данных из пространства имен W3C XML Schema. Таким образом, следующий фрагмент кода означает, что значение элемента или атрибута должно быть строковым:

Однако гораздо чаще элемент restriction используется для накладывания ограничений на элементы. Посмотрите на следующие строки из приведенной выше схемы:

Этот фрагмент кода указывает, что значение элемента или атрибута должно быть строковым, ровно шесть символов в длину, и этими символами должны быть цифры от 0 до 9.

Вспомните свои проекты интеграции, почти все они имеют вывод в виде таблицы или дерева. Примерно год назад мне пришла голову идея, а что если использовать за основу обменов систему компоновки данных - она ведь все это умеет. Почти целый год эта идея обкатывалась на различных конфигурациях, платформах и серверах; при различных требованиях к интеграции; успешно выводила сотни миллионов объектов за один подход (BI системы). Пришло время двигать технология в массы.

Как заставить это работать?

  • Необходима платформа «1С:Предприятие 8», версия и режим совместимости 8.3.6 и выше;
  • К статье прикреплена конфигурация, в ней 3 общих модуля - это часть кодовой базы из проекта «Библиотека интеграционного счастья», а так же обработка, которая умеет выводить JSON используя схему компоновки данных. Вывод максимально аналогичен выводу в ТабличныйДокумент;
    • Общие модули это основа, которая работает с вашими настройками;
    • Дополнительная обработка это готовый пример реализации вывода в JSON. Что примечательно, вы можете реализовать такую же обработку для другого формата по аналогии и она будет работать;
    • Ничего не мешает выполнять вывод даже в очень специфичные форматы.

    НастройкиМакета = IHLDataComposition . NewDataCompositionTemplateParameters ();
    НастройкиМакета . Schema = СхемаКомпоновкиДанных ;
    НастройкиМакета . Template = НастройкиКомпоновкиДанных ;

    НастройкиВывода = IHLDataComposition . NewOutputParameters ();
    НастройкиВывода . DCTParameters = НастройкиМакета ;
    НастройкиВывода . CanUseExternalFunctions = Истина;

    StreamObject = Обработки . DataProcessorJSON . Create ();
    StreamObject . Initialize ();
    StreamObject . WriteStartObject ();

    // Последний параметр указывает на быстрый вывод
    IHLDataComposition . Output (Неопределено, StreamObject , НастройкиВывода , Ложь);

    StreamObject . WriteEndObject ();
    Результат = StreamObject . Close ();

    НастройкиМакета = IHLDataComposition . NewDataCompositionTemplateParameters ();
    НастройкиМакета . Schema = СхемаКомпоновкиДанных ;
    НастройкиМакета . Template = НастройкиКомпоновкиДанных ;

    НастройкиВывода = IHLDataComposition . NewOutputParameters ();
    НастройкиВывода . DCTParameters = НастройкиМакета ;
    НастройкиВывода . CanUseExternalFunctions = Истина;

    StreamObject = Обработки . DataProcessorJSON . Create ();
    StreamObject . Initialize ();
    StreamObject . WriteStartObject ();

    // Последний параметр указывает на последовательный вывод
    IHLDataComposition . Output (Неопределено, StreamObject , НастройкиВывода , Истина);

    StreamObject . WriteEndObject ();
    Результат = StreamObject . Close ();

    Видео, как это работает:

    Версия 0.6.0.0

    • Необходима платформа «1С:Предприятие 8», версия и режим совместимости 8.3.6 и выше;
    • К статье прикреплена конфигурация, в ней локализированная часть подсистемы - из проекта «Библиотека интеграционного счастья»;
    • Достаточно «Сравнить и объединить» с основной конфигурацией и система готова к работе;
    • После установки необходимо выполнить такие шаги:
      • добавить необходимые методы в справочник IHL_Methods (конфигурация пока поставляеться без встроенных методов)





      после создания СКД, появляеться возможность изменять настройки СКД через компоновщик настроек (страницы Structure, Parameters, Fields, Filter, Order). Внимание, после изменения СКД в компоновщик настроек будут загружены настройки по умолчанию.



      DataCompositionTemplate = IHL_DataComposition . NewDataCompositionTemplateParameters ();
      DataCompositionTemplate . Schema = DataCompositionSchema ;
      DataCompositionTemplate . Template = DataCompositionSettings ;

      OutputParameters = IHL_DataComposition . NewOutputParameters ();
      OutputParameters . DCTParameters = DataCompositionTemplate ;
      OutputParameters . CanUseExternalFunctions = True;

      StreamObject = DataProcessors . DataProcessorJSON . Create ();
      StreamObject . Initialize ();
      StreamObject . WriteStartObject ();

      // Последний параметр указывает на быстрый вывод
      IHL_DataComposition . Output (Undefined, StreamObject , OutputParameters , False);

      StreamObject . WriteEndObject ();
      Result = StreamObject . Close ();

      DataCompositionTemplate = IHL_DataComposition . NewDataCompositionTemplateParameters ();
      DataCompositionTemplate . Schema = DataCompositionSchema ;
      DataCompositionTemplate . Template = DataCompositionSettings ;

      OutputParameters = IHL_DataComposition . NewOutputParameters ();
      OutputParameters . DCTParameters = DataCompositionTemplate ;
      OutputParameters . CanUseExternalFunctions = True;

      StreamObject = DataProcessors . DataProcessorJSON . Create ();
      StreamObject . Initialize ();
      StreamObject . WriteStartObject ();

      // Последний параметр указывает на последовательный вывод
      IHL_DataComposition . Output (Undefined, StreamObject , OutputParameters , True);

      StreamObject . WriteEndObject ();
      Result = StreamObject . Close ();

      Планы для версии 0.7.0.0:

      • Локализировать интерфейс програмного получения настроек обмена;
      • Локализировать возможность обрабатывать API необходимого формата (Describe API, описать API есть возможность, но нигде не используеться);
      • Локализировать базовый авторизационный модуль (Базовая авторизация) + прикрепить видео трех-шаговой OAuth авторизации;
      • Локализировать подписки на события для вызова методов обмена из справочника IHL_ExchangeSettings.

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

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

      С чего начинается.

      С чего начинаются XDTO-пакеты для неискушенного разработчика? Для меня они начались с вопроса: "А что это еще за хренотень в дереве метаданных?" И еще я знал, что это что-то про xml. Но мы начнем не с этого. А с объекта ФабрикаXDTO. Как можно догадаться из названия, это фабрика объектов ( в частности, в разделе о шаблоне , или . Книга, хочу заметить, действительно стоящая, но мозголомная, скорее формата "справочник", а не "учебник". Вдобавок все, что там написано, сложно применимо к 1С. Когда-нибудь я разозлюсь и напишу здоровенную статью о шаблонах (привет, kote!), а то досадно, что некоторые 1С-программистов


      Тут я просто вынужден послать вас ознакомиться с

      Для этого примера я бы нарисовал такую диаграмму:


      Обратите внимание, что объект "структурныйТип" (т.н. "чертеж") тоже был создан фабрикой, на основании "загадочных" строчек. Рассмотрим, что же это за строчки. Про метод "Тип" объекта "ФабрикаXDTO" синтакс-помощник пишет:

      Не слишком информативно. Тем не менее понятно, что на основании какого-то пространства имен и имени типа метод "Тип" создает нам необходимый "чертёж". Про пространства имен можно почитать, например, в статье , или терзайте жужл запросом "xmlns". Вкратце же скажу, что это некая область, в которой вы можете определить свои xml-теги, и они будут означать именно то, что вы в них закладывали при определении. Например, тег < table> в пространстве имен, определяющем HTML-документ, означает описание таблицы, а в вашем собственном он может означать, например, блок описания стола. Чтобы их не путать и нужны пространства имен.

      Все же XDTO-пакеты

      Поскольку мы выяснили, что данные о пространстве имен берутся не из интернета, возникает вполне резонный вопрос: откуда же тогда, черт побери?! И вот тут мы подходим к тому самому разделу "XDTO-пакеты" в дереве метаданных в конфигураторе. Внимательный читатель, наверное, заметил (если еще не забыл после моих лирических отступлений), что в примере мы использовали объект "ФабрикаXDTO", нигде его не создавая. Все верно, в глобальном контексте 1С есть такой объект (я бы сказал ), который знает о куче разных пространств имен, уже описанных в конфигураторе и вообще в платформе. То есть для того, чтобы наш пример заработал, нам необходимо создать примерно такой XDTO-пакет:


      То есть мы создали тип объекта "Номенклатура", в который добавили два свойства: "Наименование" и "ЗакупочнаяЦена". Обратите внимание, что при создании пакета мы задали ему то пространство имен, которое в дальнейшем будем использовать при создании объекта "структурныйТип". Если вы посмотрите конструктор свойств, то можете увидеть там много интересного. Например, для моего свойства "Наименование" я использовал тип "string (http://www.w3.org/2001/XMLSchema)". Запомните это пространство имен. В нем описаны все базовые типы, которые вы можете использовать в своих объектах, такие как "string", "int" и так далее. После того как мы добавили пакет, объект "ФабрикаXDTO" знает о нашем пространстве имен и описанных в нем типах.

      Нужно помнить, что пространства имен, описанные в разделе дерева метаданных "XDTO-пакеты", доступны только на сервере. При попытке обратиться к ним из клиентского кода (так же как и при других ошибках) метод "Тип" вернет "Неопределено". Этот момент несколько раздражает при отладке, мне кажется, что лучше бы оно ругалось чем-нибудь вроде "Тип не найден", но "маємо те, що маємо".

      В своих объектах вы можете использовать и собственные типы из вашего пространства имен. Например, давайте добавим единицы измерения:


      В качестве типа для свойства "ЕдИзм" я установил тип "ЕдиницаИзмерения (http://www.1c.ru/demos/products1)", просто выбрав его из дерева определенных в конфигурации типов.

      А вот код, который создает этот объект:

      Надеюсь, принцип понятен. Можете самостоятельно поиграться со свойствами, типами, объектами и прочим. Там есть куда "потыкать пальцем" и чего попробовать. А я тем временем продолжу.

      Сериализировали-сериализировали

      Что полезного мы уже можем извлечь из того, что знаем? Во-первых, объекты XDTO прекрасно сериализуются (XML же, как вы помните).

      Дополним код вот таким фрагментом:

      На выходе мы получим вот такой файл:

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

      Но поскольку объекты сериализуются, то они так же замечательно и десериализуются.

      Вы когда-нибудь разбирали xml-файлы построчно, вылавливая значки "больше"-"меньше" бесконечными "Найти" и "Сред/Лев/Прав"? А пользовались ли вы замечательным объектом "ЧтениеXML" для разбора файла по тегам, которые потом приходилось разгребать вручную в какую-нибудь структуру? Теперь, если у вас правильно описаны XDTO-пакеты и типы в них, вы можете загружать xml сразу в объект и дальше работать с ним как с объектом. На мой взгляд, это замечательно и удобно.

      К тому же при загрузке xml-файла происходит его валидация на соответствие типу, и в случае ошибки метод вызывает исключение. Поэтому, конечно же, правильный код по загрузке xml будет такой:

      Что еще полезного можно получить из XDTO-пакетов? А вот что! Также мы можем очень просто выгружать объекты метаданных. В конфигурации есть пространство имен, в котором есть все типы XDTO присутствующих в конфигурации метаданных.

      Добавим справочник "Клиенты", создадим в нем один элемент и напишем такой код:

      В первой части кода, там, где мы получаем объект, ничего интересного не происходит, мы просто получаем объект (весьма коряво, надо отметить, но для примера пойдёт).

      Зато обратите внимание на пространство имен и имя объекта в строчке, где создается объект "клиентыТип". В пространстве имен "http://v8.1c.ru/8.1/data/enterprise/current-config" должны быть описаны все объекты метаданных конфигурации, в чем вы можете убедиться, если посмотрите его в конструкторе XDTO-пакетов. Дальше уже знакомая процедура - сохранение объекта в XML.

      Вот что получилось у меня:

      Как видите, тут есть все реквизиты, включая стандартные ("Наименование", "Код"), а также ссылка ("Ref") и пометка на удаление ("DeletionMark").

      Естественно, этот файл также можно загрузить обратно в объект. Код, надеюсь, вы уже можете написать сами.

      В помощь юному падавану-сериализатору в 1С есть объект "СериализаторXDTO". Он также представлен как "синглтон", доступный в глобальном контексте, и как отдельный тип. В принципе, строки:

      можно смело заменить на:

      Код получился короче и работает более корректно. Например, если в справочнике "Клиенты" определены табличные части, то "ЗаполнитьЗначенияСвойств" с их заполнением не справится. А сериализатор - запросто. Теперь, когда (я надеюсь) вы понимаете основные принципы работы XDTO-пакетов, вы запросто разберетесь с тем, что еще можно делать с сериализатором. Да пребудет с вами сила синтакс-помощника. А я продолжу.

      XDTO-пакет?

      Конечно, без описания типа вам не обойтись. Но конфигуратор для этого не нужен. И тут нужно рассмотреть такую замечательную вещь, как xml schemа. XML-cхема - это как раз и есть описание типа, представленное (внимание

      А теперь нажмите на кнопку "Экспорт XML-схемы. " (выглядит как ящик с листиком бумаги и стрелочкой) и сохраните схему в файл address.xsd

      У меня получилось вот что:

      Теперь удалите этот пакет из конфигурации, будто его и не было. Попробуем прочитать схему и создать по ней объект.

      Вот код, который это делает:

      Здесь мы для разнообразия не стали использовать глобальный объект "ФабрикаXDTO", а создали собственный функцией "СоздатьФабрикуXDTO". Если вы посмотрите в отладчике на нашу фабрику ("МояФабрикаXDTO"), то увидите, что в коллекции пакетов у нее всего два пакета: "http://www.w3.org/2001/XMLSchema" и "http://www.1c.ru/demos/products2", в отличие от "синглтона" "ФабрикаXDTO", где их существенно больше. В качестве бонуса мы получили то, что этот код может быть полностью исполнен на клиенте, так как не зависит от метаданных конфигурации.

      На выходе я получил xml-файл, в который был сериализован мой объект:

      Как вы видите, я поработал с объектом и сериализовал его без участия метаданных конфигурации. Таким образом, передавая вместе с xml-файлом также и XML-схему, вы можете быть уверенным, что тот, кто должен его получить, сможет разобраться, что с ним делать, а главное, как.

      Пример десериализации приводить не буду, оставляю вам как самостоятельное упражнение.

      Напоследок скажу, что можно выгрузить XML-схему всей вашей конфигурации, кликнув правой кнопкой по узлу "XDTO-пакеты". Результат получается поучительный, посмотрите.

      Еще: если у вас есть xml-файл, с ним хочется поработать как с объектом, а XML-схему прислать никто не удосужился, вы можете воспользоваться замечательным инструментом xsd.exe из .NET Framework. (У себя я нашел его в папке "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\".) Пользоваться им очень просто: даете ему на вход xml, на выходе получаете xsd. Вообще-то этот xsd не всегда (или вообще никогда?) является файлом сразу же "готовым к употреблению" в 1С, но все равно это существенная помощь в создании XML-схемы.

      Как видите, все оказалось достаточно просто.

      На этом всё

      Несмотря на то что статья оказалась неожиданно длинной, нельзя сказать, что все, что здесь описано, претендует на полноту. Пытливый исследователь XML-мира с легкостью напишет целую книгу по каждому абзацу этого небольшого обзора и еще ворох по тому, о чем здесь не сказано. Например, о том, что "вся эта кухня" тесно связана с web-сервисами. Тема обширна, так что дерзайте. Также я могу в чем-то заблуждаться, поэтому пишите комментарии - буду исправлять. Давайте учиться вместе.

      А я желаю вам хорошего дня и хорошего кода. До новых встреч.

      Прилагаю к статье dt-шник с примерами.

      UPD.2: На инфостарте появились еще две прекрасные статьи об XDTO, так что если что-то не понятно из моей, обязательно посмотрите их: XDTO - это просто и XDTO - это просто, часть 2

      С помощью механизма XDTO можно описать систему типов и значений, с помощью которой можно легко выполнить сериализацию/десериализацию в XML/JSON.

      XDTO можно сравнить со схемой XML. С помощью механизма XDTO можно создать XML-схему, а потом на основании этой схемы сформировать XML-документ.

      XDTO может применяться в следующих случаях:

      • Для описания типов параметров и возвращаемых значений Web-сервисов.
      • Для описания структуры данных, используемой при обмене с внешними системами (в том числе с другими базами на платформе 1С).
      • Для создания собственных типов и значений, используемых внутри конфигурации 1С.

      Создание XDTO-пакета

      В качестве примера рассмотрим следующую задачу: нужно настроить обмен документами между двумя различными конфигурациями на 1С. В обеих конфигурациях используются 2 типа документов: приходные и расходные накладные. Состав и наименование реквизитов в разных конфигурациях отличается.

      Для обмена будет использоваться определенный формат следующего вида:

      XDTO

      Есть корневой элемент Документ, который имеет 2 свойства: Тип и Состав. Состав включает в себя массив строк со свойствами: Номенклатура, Количество и Сумма.

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

      URI пространства имен

      URI пространства имен

      Добавим в пакет новый Тип объекта:

      Тип объекта

      В свойствах укажем Имя Документ:

      Тип объекта

      Это корневой узел нашего формата.

      Свойство

      В свойствах укажем Имя Тип:

      Свойство

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

      Чтобы заполнить тип сначала нужно нажать на зеленую галочку возле свойства:

      Тип

      Тип
      Тип

      Данный тип соответствует типу 1С Строка.

      Тип

      Добавим для объекта Документ еще одно свойство Состав, но тип пока заполнять не будем. Должно получиться так:

      Тип объекта

      Теперь добавим новый тип объекта Состав. Он будет использоваться для сериализации табличной части документа. Добавим для него одно свойство Строка, тип пока не будем указывать:

      Тип объекта

      Так как в табличной части может быть несколько строк, то для свойства Строка в свойстве Максимальное количество нужно указать -1 (предварительно нужно нажать на зеленую галку):

      Максимальное количество

      Это означает, что в данном свойстве может храниться неограниченное количество значений (аналогично массиву).

      Теперь для свойства Документа Состав в качестве типа укажем только что созданный объект Состав. Чтобы его выбрать нужно развернуть пространство имен созданного нами XDTO-пакета:


      Тип объекта

      Тип объекта

      Свойства
      Свойства
      Свойства

      И наконец для свойства Строка объекта Состав укажем тип Строка (только что созданный нами тип объекта):

      Свойства

      На этом создание XDTO-пакета завершено. Для удобства переименуем его в Документ (нужно щелкнуть по пакету правой кнопкой, выбрать Свойства и изменить свойство Имя):

      XDTO-пакет

      Сериализация XDTO в XML

      Теперь напишем простую процедуру для сериализации приходного документа в XML через механизм XDTO.

      Сначала рассмотрим некоторые понятия, которые будут использоваться в процессе сериализации:

      Читайте также: