квалифицированная форма элемента xdto

1С магия XDTO-пакетов на примере интеграций с ГИС ЖКХ

Есть очень много статей о том, как работать с XSL/XSD из 1С, но все они в стиле: возьмем нашу XSD схему (простую и удбоную) или наш web-сервис и смотрите, как все легко экспортировать или импортировать. А что делать, если нам дали пачку XSD-схем со сложным взаимосвязями и изменять мы них не можем, а работать и поддерживать актуальность схем надо?

Сразу скажу, вопросы шифрования/подписи по ГОСТУ при работе с ГИС ЖКХ за рамками этой статьи и на хабре уже освещались. Хотя без подписей запросы выполнить не удастся.

квалифицированная форма элемента xdto
Начнем с простого — скачаем пакет форматов по интеграционному взаимодействию с ГИС ЖКХ, импортируем все xsd схемы из пакета интеграций, наведем порядок переименуем все как нам удобно. В итоге получим как показано на картинке:

Ну а теперь приступим к магии. Попробуем запросить данные из справочника организаций по ОРГН. Это подсистема organizations-registry-common метод exportOrgRegist.

В hcs-organizations-registry-common-service.wsdl указано:

Ну приступим, откроем нужные нам пакеты XDTO. Оказывается, нужные сущности являются не типами, а свойствами, как с этим работать в документации на XDTO в статьях, которые я находил, не описано, поэтому воспользуемся урокам магии:

Начнем с тела exportOrgRegistryRequest.

Напишем функцию для сбора XML-запроса:

В итоге получим запрос:

Ответ от серверов ГИС ЖКХ (СИТ-1):

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

В итоге работать можно с очень сложными xsd схемами через стандартные инструменты платформы. В целом 1С контролируют типизацию и заполнения, бывает чересчур излишне, особенно когда внутри свойства пакета используется базовый тип другого пакета, но в любом случае тип нужно привести к локальному из-за другого пространства URI. Удобно работать с десериализоваными данными, так как там всю работу на себя берет платформа. Но проверки происходят на этапе выполнения, а при написания кода платформа 1С не предоставляет никаких подсказок и проходится пользоваться сторонними утилитами, и даже при выполнении большая часть элементов находится в состоянии «Неопределено» и даже тип или его свойство можно увидеть только в спецификации.

Источник

Использование объектов XDTO в web-сервисах

Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии web-сервисов 1С:Предприятия. В этой статье мы рассмотрим, как с использованием XDTO можно задавать различные типы данных и как их применять в web-сервисах.

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

Свойство замкнутости позволяет объекту переноса данных обеспечить необходимый уровень целостности, т.к. если бы какая-либо его часть ссылалась на другие объекты, то после переноса и десериализации эта ссылка стала бы недействительной, из чего следовало бы, что и сам объект переноса данных был бы непригоден для дальнейшего использования. Свойство замкнутости не запрещает иметь ссылки внутри объекта переноса данных, т.к. объект сериализуется/десериализуется как единой целое и механизм сериализации обеспечивает правильное преобразование ссылок внутри объекта переноса данных.

Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.

Все типы данных XDTO подразделяются на типы-значения и типы-объекты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы.

Строки

Для создания строкового значения нужно:

Строка при передаче представляется в виде текста xml тега:

Следует учесть, что строки конвертируются в UTF-8 при сериализации.

Целые числа

Для создания целочисленного значения нужно:

Число при передаче представляется в виде текста xml тега:

Дробные числа

Для создания дробного значения нужно:

Число при передаче представляется в виде текста xml тега:

Для создания значения даты нужно:

Число при передаче представляется в виде текста xml тега:

Лексическое представление даты задается в формате:

Временная зона может быть не указана.

Лексическое представление времени задается в формате:

Временная зона может быть не указана.

Лексическое представление даты вместе со временем задается в формате:

Структуры

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

Например, для создания структуры Номенклатура из демо-конфигурации Web-Сервисы нужно:

Структура при передаче представляется в виде xml структуры:

Массивы

Например, для создания массива номенклатур, определенного в свойстве Элементы структуры НоменклатураГруппа из демо-конфигурации Web-Сервисы нужно:

Массив при передаче представлятся в виде xml структуры:

Рассмотрим, как создавать типы и элементы в случае клиента web-сервиса и в случае сервера web-сервиса.

Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.

Источник

XDTO в 1С

В этой статье попробую рассказать о механизме XDTO, рассказать постараюсь только суть — без воды.

XDTO (XML Data Transfer Objects) — это разработка фирмы 1С и ни в каком другом языке программирования эту аббревиатуру не встретишь.

Основное назначение этого механизма — обмен данными, как с другой конфигурацией 1С, так и со сторонними приложениями. Кроме этого XDTO используется для описания параметров и возвращаемых значений web-сервисов, а также для произвольной обработки данных.

Основная «полезность» механизма XDTO заключается в том, что он позволяет работать (чтение и запись) с XML-файлом как с объектом 1С — «через точку» и не думать при этом о тегах и атрибутах XML.

Реализован механизм XDTO при помощи объекта конфигурации «Пакет XDTO». Этот объект в действительности является обычной XML-схемой (XSD) т.е. описывает структуру какого-либо XML-документа.

Средствами 1С мы можем:

Для успешного импорта XML-схемы (XSD) в XDTO пакет, необходимо наличие в XSD-файле атрибута «targetNamespace» с указанием пространства имен, иначе импортировать схему не удастся.

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

Таким образом понятно, что названия объектов должны быть уникальны в пределах одного пространства имен (по сути в пределах одного XDTO пакета)

XSD-файл можно сделать самому — написать руками в блокноте или сделать XDTO пакет прямо в конфигураторе, кроме этого можно воспользоваться какой-нибудь специализированной программой (например Liquid XML Studio) или онлайн сервисом (Google в помощь) которые умеют создавать XSD-файлы из XML. При использовании программ и сервисов нужно быть осторожным, так как по моему опыту результат их работы (XSD-файл) очень часто не подходит для использования в 1С — неправильно указываются типы данных и, как следствие, записать XML-файл при помощи такого XDTO пакета не удастся. В качестве примера приведу два XDTO пакета для одного и того же XML-файла.

Слева тот, что создан руками, справа — программой.

Работа с XDTO в 1С неразрывно связана с объектом «ФабрикаXDTO». Именно этот объект читает и записывает данные из/в XML-файл(а), а также создает все нужные объекты с которыми можно привычно работать «через точку».

Перейдем к практике.

Допустим у нас есть файл заказ вот такого вида:

Источник

Объект 1С «XDTO-пакеты»

ВАЖНО! Схема обязательно должна содержать описание пространства имен в виде URL-подобной строки. Если пространство имен не задано, то стороннюю XML-схему импортировать не удастся.

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

В конфигурацию может быть добавлено произвольное количество XDTO-пакетов.

Типы данных в 1С чаще всего соответствуют типам данных в других языках, но бывают и исключения, которые проще всего описывать в этом объекте конфигурации.

Механизм XDTO

Механизм XDTO позволяет на уровне языка 1С оперировать не узлами XML, а прикладными понятиями «Накладная», «Сотрудник», «Счет» и т.д., а также встроенными типами 1С (“ТаблицаЗначений”, “СправочникСсылка” и т.п.).

Основные возможности XDTO:

ФабрикаXDTO

Работу механизма XDTO обеспечивает объект встроенного языка ФабрикаXDTO: именно она отвечает за сериализацию XDTO-объектов в XML и обратно. Причем, за преобразование объектов XDTO в прикладные объекты и встроенные типы отвечает механизм XDTO-сериализации. То есть, процедура приведения объектов 1С к объектам XML схемы двухэтапная.

Особенности ФабрикиXDTO:

квалифицированная форма элемента xdto

Свойства XDTO-пакета 1С:

квалифицированная форма элемента xdto

Система 1С позволяет выполнить следующие действия:

Редактирование XDTO-пакета 1С

Редактирование XDTO-пакета 1С осуществляется в специальном окне, отображающем его иерархическую структуру:

квалифицированная форма элемента xdto

Особенности использования XDTO-пакетов в 1С:

Сериализация в 1С с помощью XDTO-пакета

Сериализованы могут быть не все объекты, а те, которые имеют соответствующую запись в Синтакс-помощнике: «Данный объект может быть сериализован в/из XML».

В системе 1С:Предприятие 8 реализована сериализация данных на основе механизма XDTO, которая позволяет сериализовать в/из XML:

Таким образом, с точки зрения XML-сериализации, например, значение типа «ДокументСсылка.ИмяДокумента» относится к простым типам.

Источник

Перенос данных с использованием XDTO

Здравствуйте! Моя статья посвящена моему вниканию в XDTO, первые шаги. Статьи по XDTO есть, но там слишком много теории.

Предисловие

Итак, начинаю описывать то, что я понял.

Для начала, необходимо представить три понятия.

Можно, конечно, всё создавать вручную через ЗаписьXML, все атрибуты и узлы, согласно конфигурации базы-приемника. Но! Мне далеко не всегда нравится состав реквизитов этих объектов. Например, для чего мне в формируемом XML по документу платежки данные счетов учета? Или мне не хотелось создавать в передаваемом XML данные для РасшифровкаПлатежа. Мне хотелось сделать свой ОбъектXDTO, со своими свойствами, которые сочту необходимыми для переноса.

Решение

квалифицированная форма элемента xdto

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

Пакет в базе-приемнике выглядит так:

квалифицированная форма элемента xdto

ВидОперации тоже имеет тип из типов конфигурации.

А вот ДокументОснование не имеет типа, он имеет открытый тип. В базе приемнике у соответствующего документа составной тип, поэтому при формировании XML необходимо передавать тип.

Вот как выглядит функция формирования XML:

Объекты XDTO создаются фабрикой по типу полученному из фабрики: сначала получаем тип, потом создаем ОбъектXDTO (или ЗначениеXDTO, как в случае, например, с перечислением).

Обратите внимание на заполнение свойства ДокументОснование. Мы создаем фабрикой значение из ТипВозврата, передавая ей уникальный идентификатор ссылки основания. У документа основания в базе-источнике составной тип: РеализацияТоваровУслуг и ВозвратОтПокупателя. А вот в базе-приемнике они называются иначе: Реализация и Возврат.

Наименования значений перечислений в базе источнике и в базе приемнике тоже разные: Оплата, Возврат и ОплатаПокупателя, ВозвратПокупателю. В приведенном примере заполняется однозначно, но, думаю, понятно, что в реальном обмене необходимо добавлять условия, как именно заполнять создаваемый ОбъектXDTO.

Итого получается XML:

Для чтения такого XML в базе приемнике пишем короткую функцию:

После этого кода в ОбъектXDTO будет следующее:

квалифицированная форма элемента xdto

Сравните с тем, что было в исходной базе:

квалифицированная форма элемента xdto

Необходимые мне ссылки преобразовались, как мне было нужно.

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

Источник

Добавить комментарий

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