Дополнительный материал по 8 главе: Обмен данными Механизмы обмена данными позволяют создавать территориально распределенные информационные системы обменивающиеся данным в оффлайн режиме, без постоянного соединения. С помощью этих механизмов можно осуществлять интеграцию не только между различными информационными базами «1С:Предприятия 8», но и строить сложные гетерогенные информационные системы, включающие, наряду с решениями на платформе «1С:Предприятие 8», еще и внешние приложения. Платформа обеспечивает работу двух механизмов обмена данными: ● Механизм распределенных информационных баз предназначен для обмена данными только с идентичными конфигурациями «1С:Предприятия 8» и жестко регламентирует структуру создаваемой системы. Он является аналогом компоненты «Управление распределенными информационными базами», существующей в технологической платформе «1С:Предприятия 7.7», однако существенно превосходит этот механизм по гибкости настройки и разнообразию поддерживаемых схем обмена. Подробнее… ● Универсальный механизм обмена данными, напротив, позволяет создавать произвольные распределенные системы и практически не накладывает никаких ограничений на структуру создаваемой системы. Подробнее… Оба эти механизма используют ряд средств технологической платформы, которые разработчик может применять как по отдельности, так и в различных комбинациях, в зависимости от конкретной решаемой задачи. Такой подход позволяет обеспечить гибкость механизмов обмена и их настраиваемость на решение как можно большего круга задач. В состав средств платформы, используемых для построения схем обмена данными, входят: ● Планы обмена — эти объекты конфигурации позволяют описывать перечень узлов распределенной информационной системы, с которой будет производиться обмен данными, и задавать состав данных, которые будут участвовать в обмене. Подробнее… ● Средства XML-сериализации служат для представления данных «1С:Предприятия 8» различных типов в виде последовательности данных XML, и наоборот. Подробнее… ● Средства чтения/записи XML-документов позволяют работать с данными формата XML на «базовом» уровне, без привязки к объектам «1С:Предприятия 8». Подробнее… Важным качеством данного набора механизмов является то, что он обеспечивает высокий уровень готовности системы к работе в распределенной среде — организация обмена практически не требует дополнительных затрат на разработку. Нужно просто задать в интерактивном режиме состав данных, участвующих в обмене, а механизм обеспечит формирование сообщений и их загрузку. При этом платформа автоматически организует обмен только измененной информацией, отслеживает получение сообщений, определяет необходимость повторной отправки данных, разрешает коллизии и проверяет целостность загружаемой информации. Гибкие возможности настройки позволяют сформировать практически любую топологию схемы узлов обмена (звезда, снежинка, схемы без центрального узла). Состав данных, участвующих в обмене, и правила разрешения коллизий могут задаваться произвольно. При этом механизмы обмена с одной стороны минимизируют объем передаваемых данных (пересылаются только измененные данные), а с другой — гарантируют устойчивость к потере сообщений. Иными словами, система способна функционировать как в условиях гарантированной доставки сообщений, так и без таковой. Особенности механизма обмена данными 1С: 1. При использовании планов обмена управлять составом узлов, для которых производится регистрация изменений объектов, можно корректировать при работе с объектом. 2. И механизм распределенной информационной базы, и универсальный обмен данными используют технологию регистрации объектов (неких триггеров, после которого объект ставится на обмен), которая может работать (АВТОРЕГИСТРАЦИЯ): ○ в автоматическом режиме — простой вариант, как только объект изменен, он ставится на обмен; ○ в не автоматическом режиме — предполагает задание конкретных условий, при выполнении которых данный объект будет поставлен на обмен (условия могут распространяться не только на сам объект, но и на связанные объекты, и на какие-то вовсе несвязанные события информационной базы). 3. Для прикладных объектов в окне редактирования объекта конфигурации на закладке «Обмен данными» (рисунок выше) указываются планы обмена, в которых будут учитываться изменения в данном объекте. 4. То, в каких планах обмена для конкретного прикладного объекта указана авторегистрация можно определить: ○ в окне редактирования объекта, раздел «Обмен данными»; ○ посредством вызова окна «Дополнительно» для данного объекта (закладка «Планы обмена»). 5. Для преобразования XML документа в другой документ допустимого формата предназначен объект «ПреобразованиеXSL». ИНТЕГРАЦИЯ С DBF-ФАЙЛАМИ DBF — это стандартный формат хранения данных некоторых баз данных и электронных таблиц. В самом простом случае DBF файл состоит из заголовка, описывающего структуру базы и количество записей, и собственно записей, сведенных в таблицу с полями фиксированной длины. Для работы с базами данных формата DBF (dBase III) в системе 1С имеется специальный объект – XBase. Механизм работы с базами данных формата DBF предназначен для манипулирования ими непосредственно из встроенного языка. Возможно практически любое манипулирование данными (возможно как внесение изменений в существующие файлы, так и создание новых). С помощью этого может быть обеспечена интеграция со сторонними системами. Особенности интеграции 1С с DBF-файлами: 1. Одновременно с файлом формата dbf может быть открыто не более одного индексного файла. 2. Экземпляр объекта XBase позволяет одновременно организовать работу только с одним файлом формата .dbf. МЕХАНИЗМ ИНТЕГРАЦИИ OLE AUTOMATION Механизм OLE был задуман как технология интеграции программных продуктов Microsoft Office, которая позволяет работать с объектами, созданными в других приложениях (документы, рисунки, таблицы). С точки зрения пользователя, составной документ выглядит единым набором информации, но фактически содержит элементы, созданные двумя или несколькими разными приложениями. OLE-объект — объект, созданный в другом приложении и сохранивший связь с этим приложением (например, электронные таблицы Excel, вставленные в документ Word соответствующим образом — как OLE-объект; если не вставлять их как OLE-объект, то связь с оригинальным приложением будет отсутствовать). Контейнер приложения OLE — приложение, в котором создается составной документ, позволяя обрабатывать его части в исходном приложении (например, таком как Word или Excel), которое использовалось для создания OLE-объекта. Сервер приложения OLE (OLE Server Application) — приложение, создающее объекты, которые можно поместить в документ-контейнер. Программы 1С:Предприятие, Microsoft Word и Excel являются приложениями, которые могут выступать и как OLE-сервер, и как OLE-контейнер. Другими словами, эти приложения могут создавать новые OLE-объекты, а также хранить OLE-объекты, созданные в других приложениях. Подробная статья по ссылке https://infostart.ru/public/277982/ Особенности использования механизма OLE Automation в 1С: 1. Для создания объекта, с использованием которого из одной базы 1С:Предприятие 8 будет производиться обращение через OLE к другой информационной базе 1С:Предприятие 8, используется новый COMОбъект. 2. Редактирование OLE-объектов осуществляется приложением, связанным с OLE-объектом. 3. Automation-сервер «1С:Предприятие 8» дает практически полный доступ к приложению: ○ предоставляет доступ ко всем свойствам и методам своего глобального контекста; ○ предоставляет доступ к дополнительным свойствам и методам для выполнения действий, специфичных для работы в режиме Automation; ○ позволяет управлять приложением системы «1С:Предприятие 8» из других приложений, а также выполнять действия, аналогичные интерактивным. 4. В процедуре, которая будет вызываться при подключении к базе данных через СОМ, нельзя использовать Форма.Открыть(). 5. При обращении к базе данных 1С:Предприятие 8: ○ через OLE выполняется процедура-обработчик события «ПриНачалеРаботыСистемы», определенный в модуле приложения; ○ через COMConnector выполняется процедура-обработчик события «ПриНачалеРаботыСистемы» определенный в модуле внешнего соединения. XDTO XDTO - XML Data Transfer Objects, механизм, обеспечивающий объектное моделирование данных схемы XML. Основное его назначение - интеграция систем, но может также применяться для описания параметров и возвращаемых значений web-сервисов. XDTO позволяет оперировать не узлами XML, а прикладными типами данных и встроенными типами платформы. Механизм XDTO реализован при помощи общего объекта конфигурации XDTOпакет: Который на самом деле представляет собой обычную XML-схему, то есть описывает структуру XML-документа. Эту схему можно как настроить в конфигураторе (создав новый XDTO-пакет), так и импортировать ранее созданную вручную либо в сторонней программе: Важный нюанс - схема обязательно должна содержать описание пространства имен в виде URL-подобной строки. чтобы не было путаницы между разными пакетами. Если пространство имен не задано, то стороннюю XML схему не удастся импортировать: Работу механизма XDTO обеспечивает объект встроенного языка ФабрикаXDTO. Именно Фабрика отвечает за сериализацию XDTO-объектов в XML и обратно. Причем, за преобразование объектов XDTO в прикладные объекты и встроенные типы отвечает механизм XDTO-сериализации. То есть, процедура приведения объектов 1С к объектам XML схемы двухшаговая. Подробно: 1) http://v8.1c.ru/overview/Term_000000274.htm 2) http://v8.1c.ru/overview/Term_000000162.htm 3) https://infostart.ru/public/167459/ Подробнее из ИТС: Глава 16. Механизм XDTO 16.1. Общая информация Механизм XDTO является универсальным способом представления данных для взаимодействия с различными внешними источниками данных и программными системами. Аббревиатура XDTO обозначает XML Data Transfer Objects. Механизм XDTO позволяет создать модель представления данных (модель типов и значений), которая, с одной стороны, обеспечивает возможность просто и естественно манипулировать данными в среде системы «1С:Предприятие», а с другой стороны, хорошо приспособлена для прозрачного преобразования данных в другие форматы, главным образом XML. Рис. 425. Общая схема XDTO Можно выделить несколько задач, для решения которых используется механизм XDTO: ● обмен данными между конфигурациями системы «1С:Предприятие» с разными схемами данных; ● обмен данными на основе схем XML, не привязанных к той или иной конфигурации (например, обмен с информационными системами, построенными не на основе системы «1С:Предприятие»); ● организация работы с Web-сервисами. Механизм XDTO позволяет описывать типы параметров и возвращаемых значений Web-сервисов, а также манипулировать передаваемыми и возвращаемыми данными. Механизм XDTO обладает следующими ключевыми свойствами: ● обеспечивает работу с XML, ● привычная модель работы с данными. В настоящее время обмен данными с различными программными платформами и системами реализуется с использованием XML: XML-документы служат для представления данных, а схема XML используется для описания форматов и структур данных. Механизм XDTO позволяет создавать требуемые для обмена схемы XML и формировать XML-документы, удовлетворяющие этим схемам. В то же время использование механизма XDTO позволяет выполнять эти действия в привычной, для большинства разработчиков системы «1С:Предприятие», манере. Разработчик имеет дело с типами и объектами данных, объекты данных содержат свойства, свойствам присваиваются значения и т. д. При манипулировании данными с помощью XDTO разработчик максимально изолирован от подробностей, связанных с тем, как эти данные представлены в XML. Конечно, совсем избавиться от этих подробностей невозможно, но важно, что они проявляются только там, где это действительно нужно. 16.2. Фабрика XDTO 16.2.1. Общая информация Ключевым понятием механизма XDTO является фабрика XDTO. Фабрика XDTO содержит описание всех типов, с которыми оперирует некоторая система. В частности, для любой конфигурации системы «1С:Предприятие» существует глобальная фабрика XDTO, которая описывает все типы, используемые в конфигурации, в терминах XDTO (эта фабрика XDTO доступна через свойство глобального контекста ФабрикаXDTO). Все описания типов, которые содержит фабрика XDTO, сгруппированы в один или несколько пакетов XDTO. Если проводить аналогию между XDTO и XML, то можно сказать, что пакет XDTO соответствует схеме XML. Таким образом, фабрика XDTO может соответствовать нескольким схемам XML. Фабрика XDTO является полностью самодостаточной. То есть любой из типов, зарегистрированных в фабрике XDTO, может ссылаться только на типы из той же самой фабрики XDTO. В общем случае фабрика XDTO создается единовременно на основании описаний всех типов, которые должны быть зарегистрированы в фабрике. Для создания фабрики XDTO средствами встроенного языка используется конструктор объекта ФабрикаXDTO, которому передается набор схем XML, содержащийся в объекте НаборСхемXML. Сценарий, при котором типы XDTO добавляются в фабрику по одному или группами, не поддерживается. В отличие от произвольной фабрики XDTO, которую может создать разработчик, глобальная фабрика XDTO создается системой автоматически, при создании новой информационной базы, и допускает добавление типов XDTO по одному или группами. Для этого используются средства визуального конструирования, позволяющие добавлять пакеты XDTO в ветку дерева метаданных Общие – XDTOпакеты. Все пакеты, содержащиеся в глобальной фабрике XDTO, можно разделить на три вида: ● Один пакет XDTO, содержащий описание типов платформы. Этот пакет является одинаковым для всех конфигураций системы «1С:Предприятие». ● Один пакет XDTO, содержащий описание типов конфигурации, созданных в результате редактирования метаданных (создания и изменения свойств справочников, документов и пр.). ● Один или несколько пакетов XDTO, описанных непосредственно в дереве объектов конфигурации, в ветке Общие – XDTO-пакеты. Пакет XDTO содержит описание некоторого множества типов, принадлежащих одному пространству имен – пространству имен пакета. Кроме непосредственно описаний типов пакет XDTO может содержать ссылки на пакеты, которые используются данным пакетом, а также список определений глобальных свойств пакета. Ссылки на другие пакеты содержатся в свойстве Зависимости пакета XDTO и представляют собой объект КоллекцияПакетовXDTO. Пакеты этой коллекции содержат типы из пространства имен, на которые имеются ссылки в данном пакете. В пакете можно ссылаться на глобальные свойства из других пакетов. Отсутствует поддержка циклов в директивах импорта и включения XSD-схем. 16.2.2. Получение фабрики XDTO из файла-схемы XSD Ниже приведен пример создания фабрики XDTO на основе схемы XML, содержащейся в файле XML. Так как механизм XDTO представляет собой абстракцию, построенную «над» XML, то для получения схемы XML из файла XML необходимо последовательно «пройти» несколько уровней работы с данными XML: ● сначала низкоуровневое чтение/запись файлов XML; ● затем объектную модель XML, из которой уже может быть получен объект встроенного языка СхемаXML, содержащий данные схемы XML. Рис. 426. Создание фабрики XDTO Пример: Копировать в буфер обмена // Создать фабрику XDTO на основе схемы XML, // содержащейся в файле XML // Создать объект чтения XML по умолчанию ЧтениеXML = Новый ЧтениеXML; // Открыть файл XML ЧтениеXML.ОткрытьФайл("с:\temp\my_sсhema.xsd"); // Создать построитель документа DOM по умолчанию ПостроительDOM = Новый ПостроительDOM; // Прочитать файл XML в документ DOM ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); // Создать построитель схемы XML по умолчанию ПостроительСхемыXML = Новый ПостроительСхемXML; // Получить схему XML из документа DOM СхемаXML = ПостроительСхемыXML.СоздатьСхемуXML(ДокументDOM); // Создать набор схем XML по умолчанию НаборСхемXML = Новый НаборСхемXML; // Добавить схему XML в набор схем XML НаборСхемXML.Добавить(СхемаXML); // Создать фабрику XDTO на основе набора схем XML НоваяФабрикаXDTO = Новый ФабрикаXDTO(НаборСхемXML); В приведенном примере сначала создается объект ЧтениеXML и открывается файл XML, расположенный на диске. После этого с помощью построителя документа DOM создается объект ДокументDOM, содержащий данные файла XML. Затем с помощью построителя схемы XML на основе документа DOM создается новый объект СхемаXML, содержащий данные схемы XML. В заключение создается пустой набор схем XML, в который добавляется имеющаяся схема XML, и на основании этого набора создается фабрика XDTO. 16.2.3. Получение фабрики XDTO из нескольких источников В некоторых случаях может потребоваться создать фабрику на основании нескольких схем, некоторые из которых могут поставляться в виде файлов, а некоторые необходимо «унаследовать» от других фабрик XDTO (включая глобальную фабрику). Копировать в буфер обмена Схемы = Новый Массив; Схемы.Добавить("с:\temp\sсhema 1.xsd"); Схемы.Добавить("с:\temp\sсhema 2.xsd"); Пакеты = Новый Массив; Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 1")); Пакеты.Добавить(ФабрикаXDTO.Пакеты.Получить("URI пакета 2")); МояФабрика = СоздатьФабрикуXDTO(Схемы, Пакеты); В данном примере выполняется формирование фабрики XDTO на основании 4 источников: ● Схемы XML, которая расположена в файле с:\temp\sсhema 1.xsd. ● Схемы XML, которая расположена в файле с:\temp\sсhema 2.xsd. ● Схемы пакета 1 текущей конфигурации. ● Схемы пакета 2 текущей конфигурации. В общем случае, необязательно, чтобы пакеты получались из глобальной фабрики XDTO. Это может быть произвольная фабрика. 16.3. Типы данных XDTO 16.3.1. Общая информация Каждый из типов данных XDTO является либо типом значения XDTO, либо типом объекта XDTO. Соответственно, для описания типа значения используется объект ТипЗначенияXDTO, а для описания типа объекта – ТипОбъектаXDTO. Объект ТипЗначенияXDTO используется для описания типов простых неделимых значений, в которых не могут быть выделены отдельные составляющие. Примерами простых значений являются разнообразные строки, числа, даты и т. п. Объект ТипОбъектаXDTO используется для описания типов экземпляров данных, имеющих некоторое состояние, представляемое как совокупность значений свойств этого экземпляра данных. При этом типы свойств этого экземпляра данных могут являться как типами значений XDTO, так и типами объектов XDTO. И ТипЗначенияXDTO, и ТипОбъектаXDTO имеют два одинаковых свойства: ● Имя – имя типа; ● URIПространстваИмен – URI пространства имен, в котором определен данный тип. Значения этих свойств совпадают с аналогичными параметрами, с которыми тип определяется в схеме XML. Имя типа и URI пространства имен образуют уникальный идентификатор типа. Имя типа должно быть обязательно определено. При этом свойство URIПространстваИмен может содержать пустую строку, хотя это и нежелательно. 16.3.2. Тип значения XDTO Тип значения XDTO в соответствии с правилами для simple type из схемы XML может определяться тремя способами: ● ограничением, когда задается базовый тип (свойство БазовыйТип) и набор ограничений на множество возможных значений (свойство Фасеты); ● объединением, когда тип получается в результате объединения нескольких типов значений (объединяемые типы перечисляются в свойстве ТипыЧленовОбъединения); ● списком, когда значение представляет собой список значений (тип значения элементов, составляющих список значений, задается в свойстве ТипЭлементаСписка). Помимо свойств Имя и URIПространстваИмен тип значения XDTO содержит следующие свойства: ● БазовыйТип – базовый тип для данного типа значения XDTO. Базовые типы могут наследоваться, но только от других типов значений XDTO. Допустимое множество значений унаследованного типа представляет собой подмножество возможных значений базового типа. Верхним уровнем в иерархии простых типов является предопределенный тип anySimpleType из пространства имен http://www.w3.org/2001/XMLSchema. Все типы значений прямо или опосредованно унаследованы от этого типа. Типы, образованные объединением или списком, всегда непосредственно унаследованы от anySimpleType. ● Фасеты – список фасетов, ограничивающих множество допустимых значений по отношению к базовому типу. Список фасетов задается только для типов значений XDTO, определенных ограничением базового типа. Каждый отдельный фасет представляет собой пару: имя фасета и значение. Определен список имен допустимых фасетов. Причем не любой из допустимых фасетов может быть применен к любому типу. Список фасетов и применимость их к тому или иному типу определяются по правилам XML Schema (http://www.w3.org/TR/xmlschema2/). ● ТипыЧленовОбъединения – список типов, образующих объединение. Объединяться могут только типы значений XDTO. Если тип образован объединением, то список ТипыЧленовОбъединения содержит по крайней мере один тип. При этом список Фасеты должен быть пустым, а свойство ТипЭлементаСписка должно возвращать неопределенное значение. ● ТипЭлементаСписка – в случае, когда тип значения XDTO определяется списком, данное свойство показывает тип элемента списка. При этом списки Фасеты и ТипыЧленовОбъединения должны быть пустыми. ● Список имен допустимых фасетов (определяется системным перечислением ВидФасетаXDTO): ● Длина – фасет длины. Содержит количество единиц длины, причем единица длины имеет различный смысл для различных типов. Для типов string и anyURI длина содержит количество символов. Для типов hexBinary и base64Binary длина содержит количество байт двоичных данных. Для типов, определяемых списком, длина содержит количество элементов списка. ● МаксВключающее – фасет максимума, включающего границу. Ограничивает пространство значений данного типа максимальным значением. Любое значение данного типа меньше либо равно указанному значению. ● МаксДлина – фасет максимальной длины. Содержит максимальное количество единиц длины, причем единица длины имеет различный смысл для различных типов. Для типа string максимальная длина содержит максимальное количество символов. Для типов hexBinary и base64Binary максимальная длина содержит максимальное количество байт двоичных данных. Для типов, определяемых списком, максимальная длина содержит максимальное количество элементов списка. ● МаксИсключающее – фасет максимума, не включающего границу. Ограничивает пространство значений данного типа максимальным значением. Любое значение данного типа меньше указанного значения. ● МинВключающее – фасет минимума, включающего границу. Ограничивает пространство значений данного типа минимальным значением. Любое значение данного типа больше либо равно указанному значению. ● МинДлина – фасет минимальной длины. Содержит минимальное количество единиц длины, причем единица длины имеет различный смысл для различных типов. Для типа string минимальная длина содержит минимальное количество символов. Для типов hexBinary и base64Binary минимальная длина содержит минимальное количество байт двоичных данных. Для типов, определяемых списком, минимальная длина содержит минимальное количество элементов списка. ● МинИсключающее – фасет минимума, не включающего границу. Ограничивает пространство значений данного типа минимальным значением. Любое значение данного типа больше указанного значения. ● Образец – фасет образца. Содержит регулярное выражение, определяющее пространство значений данного типа. ● Перечисление – фасет перечисления. Определяет набор допустимых значений данного типа. ● ПробельныеСимволы – фасет пробельных символов. Может принимать одно из трех значений: ● Сохранять – строка может содержать любые пробельные символы. ● Заменять – строка не должна содержать #x9 (табуляция), #xA (перевод строки) и #xD (возврат каретки). Если они существуют, то должны быть заменены символом #x20 (пробел). ● Сворачивать – дополнительно к требованиям, указанным для значения replace, строка не должна содержать парных символов #x20 (пробел), а также лидирующих и завершающих символов #x20 (пробел). ● РазрядовВсего – фасет общего количества цифр. Содержит общее количество разрядов числа (целая часть плюс дробная часть). ● РазрядовДробнойЧасти – фасет количества цифр дробной части. Содержит количество разрядов дробной части числа. Инфраструктура XDTO определяет набор предопределенных типов значений XDTO. Этот набор совпадает с набором примитивных типов, определенных в XML Schema Part 2: Datatypes. Предопределенные типы образуют иерархию в соответствии с XML Schema Part 2: Datatypes. Имена типов совпадают с именами типов XML Schema и принадлежат URI пространства имен – http://www.w3.org/2001/XMLSchema. Предопределенные типы являются автоматически зарегистрированными в любой фабрике XDTO. 16.3.3. Тип объекта XDTO Помимо свойств Имя и URIПространстваИмен тип объекта XDTO содержит следующие свойства: ● БазовыйТип – базовый тип для данного типа. Это может быть только тип объекта XDTO. Базовым в иерархии типов объектов XDTO является предопределенный тип anyType из пространства имен http://www.w3.org/2001/XMLSchema. Все типы объектов XDTO прямо или опосредованно унаследованы от этого типа. ● Открытый – признак того, является ли тип объекта XDTO открытым. Данное свойство показывает, может ли экземпляр объекта XDTO содержать дополнительные свойства, не определенные в его типе, то есть реализует модель open content. Соответствует появлению в XML-схеме для данного типа описаний: <anyAttribute>, <any>. ● Абстрактный – признак того, является ли тип объекта XDTO абстрактным. Соответствует появлению в схеме для данного элемента атрибута abstract="true". ● Упорядоченный – признак того, является ли порядок следования элементов, представляющих значения свойств, строго соответствующим порядку следования свойств в типе объекта XDTO. Если задана модель контента xsd:all, то порядок следования элементов XML может быть произвольным. При этом допустимым является порядок, соответствующий порядку следования свойств в типе. То есть если свойство Упорядоченный имеет значение Ложь, то на входе порядок следования элементов XML не контролируется, а на выходе определяется порядком следования свойств, если только признак Последовательный не имеет значение Истина. ● Последовательный – это свойство показывает, содержит ли экземпляр соответствующего объекта XDTO последовательность XDTO. Данный признак равен значению Истина в тех случаях, когда порядок следования вложенных элементов XML не может однозначно определяться порядком следования свойств в типе (например, в схеме XML контент задан как <sequence … maxOccurs=10 … >) или для соответствующего типа XML в схеме определен атрибут mixed="true". Последовательность XDTO позволяет задать в явном виде порядок следования элементов, как они будут представлены в документе XML. Для объектов типов, у которых свойство Последовательный установлено в значение Ложь, порядок следования вложенных элементов соответствует порядку следования свойств. ● Смешанный – свойство показывает, определен ли в схеме XML для данного типа mixed content. Если значение свойства Смешанный равно Истина, то значение Последовательный обязательно равно Истина, так как mixed content невозможно смоделировать без применения последовательности XDTO. ● Свойства – список свойств, определенных для данного типа объекта XDTO. Каждое из свойств представляется в виде экземпляра объекта СвойствоXDTO. Список содержит полный список свойств, в том числе свойства, определенные в базовом типе. Существует предопределенный тип объекта XDTO с именем anyType и URI пространства имен http://www.w3.org/2001/XMLSchema. Данный тип является базовым для любого типа объекта XDTO, но у него нет базового типа. Он является открытым, не абстрактным, подразумевает наличие последовательности и имеет пустой список свойств. Данный тип объекта XDTO соответствует типу anyType, определенному в XML Schema Part 2: Datatypes. 16.3.4. Свойство XDTO Отдельно взятое свойство отдельного типа объекта XDTO описывается с помощью экземпляра объекта СвойствоXDTO. Это означает, что один и тот же экземпляр объекта СвойствоXDTO не может быть использован для описания свойств в различных типах объектов XDTO и двух различных свойств одного типа объекта XDTO. Объект СвойствоXDTO содержит следующие свойства: ● Имя – имя свойства. В пределах одного типа объекта XDTO имена свойств должны быть уникальными. При формировании модели данных XDTO на основе схемы XSD, имена свойств XDTO образуются на основании имен атрибутов и элементов, описанных в схеме. Построение модели типа выполняется последовательно: сначала формируется список свойств на основе атрибутов, затем – на основе элементов, в порядке объявления в схеме. При этом имя приводится в соответствие с правилами именования, принятыми во встроенном языке. Символы, допустимые в имени XML (например: ".", "-«'), но недопустимые с точки зрения имени для встроенного языка – заменяются на символ "_". В случае дублирования имени атрибута и элемента, дубликату назначается имя, расширенное числовым суффиксом (начиная от 1). ● Тип – тип свойства. Может быть как экземпляром объекта ТипЗначенияXDTO, так и экземпляром объекта ТипОбъектаXDTO. ● ВерхняяГраница – свойство типа объекта XDTO может быть определено как содержащее одно или множество значений. Свойство считается содержащим одно значение, если равно 1. Если же свойство ВерхняяГраница больше 1, то считается, что оно может содержать множество значений. Такое свойство в структуре объекта моделируется как список (не путать со списком в описании типа значения XDTO). Свойство ВерхняяГраница показывает максимальное количество значений свойства. Значение больше 1 может быть задано только для свойств, представляемых в виде элемента XML. Свойство ВерхняяГраница соответствует атрибуту xsd:maxOccurs в XML Schema. Значение -1 соответствует unbounded. ● НижняяГраница – минимальное количество значений свойства. Минимальное количество значений свойства может принимать значения меньше или равно 0. Естественно, значение НижняяГраница должно быть меньше или равно значению ВерхняяГраница (если, конечно, ВерхняяГраница не равно -1); ● ВозможноПустое – показывает, может ли свойство принимать неопределенное значение. Неопределенное значение свойства представляется в XML в виде элемента следующего вида: <elem xsi:nil="true" />. Таким образом, свойство ВозможноПустое, равное Истина, может быть определено только для свойств с формой представления Элемент. Свойство ВозможноПустое соответствует атрибуту xsd:nillable в XML Schema. Если значение свойства ВерхняяГраница больше 1, неопределенное значение является допустимым для элемента списка значений свойства. ● ЗначениеПоУмолчанию – значение свойства по умолчанию. Значением свойства по умолчанию может быть только ЗначениеXDTO. При этом данное значение должно быть того же типа, что и тип свойства или же унаследованного типа. При создании объекта XDTO свойство, если оно допускает единственное значение, принимает значение по умолчанию (метод Установлено() объекта XDTO возвращает значение Ложь для этого свойства). Для свойств с множеством значений список значений изначально пуст, независимо от того, определено или нет значение по умолчанию. ● Фиксированное – указывает, является ли значение свойства фиксированным. Если установлено в значение Истина, то само фиксированное значение можно получить через свойство ЗначениеПоУмолчанию. ● Форма – форма представления свойства в XML. Это может быть Текст, Элемент или Атрибут. Если формой представления является Атрибут или Текст, то значение свойства ВерхняяГраница не может быть больше 1. Если свойство принимает значение Текст, то значение свойства НижняяГраница также должно быть равным 1. У одного типа только одно свойство может иметь форму представления Текст, при этом остальные свойства должны иметь форму представления Атрибут. ● ЛокальноеИмя – локальное имя атрибута или элемента, используемого для представления свойства. Для свойств с формой представления Текст – пустая строка. ● URIПространстваИмен – URI пространства имен для атрибута или элемента, используемого для представления свойства. Пустая строка, если пространство имен отсутствует. 16.4. Экземпляры данных XDTO Экземпляры данных XDTO могут являться значениями XDTO (ЗначениеXDTO) или объектами XDTO (ОбъектXDTO). 16.4.1. Значение XDTO Значение XDTO представляет собой простое неделимое значение, в котором не могут быть выделены отдельные составляющие. Примерами простых значений являются разнообразные строки, числа, даты и т. п. Экземпляры простых значений являются немутабельными. Новое значение XDTO может быть создано с помощью метода Создать() фабрики XDTO: ● на основе типа значения XDTO и значения; ● на основе типа значения XDTO и лексического представления значения. Ниже приведены примеры создания значения XDTO. Пример: Копировать в буфер обмена ГлобальнаяФабрикаXDTO = ФабрикаXDTO; // Создать значение XDTO из ссылки СсылкаНаЭлементСправочника = Справочники.Номенклатура. НайтиПоКоду("0000001"); ТипЗначенияXDTOСоздаваемогоЗначения = ГлобальнаяФабрикаXDTO.Тип("urn:schemas-v8-1c-ru:config-data", "CatalogRef.Номенклатура"); НовоеЗначениеXDTO = ГлобальнаяФабрикаXDTO.Создать(ТипЗначенияXDTOСоздаваемогоЗначения, СсылкаНаЭлементСправочника); // Создать значение XDTO из лексического представления значения ТипЗначенияXDTOСоздаваемогоЗначения = ГлобальнаяФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime"); НовоеЗначениеXDTO = ГлобальнаяФабрикаXDTO.Создать(ТипЗначенияXDTOСоздаваемогоЗначения, "200604-20T12:00:30"); Новое значение XDTO может быть получено также путем чтения файла XML. Пример: Копировать в буфер обмена ГлобальнаяФабрикаXDTO = ФабрикаXDTO;, // Прочитать данные значения XDTO из файла XML НовоеЧтениеXML = Новый ЧтениеXML; НовоеЧтениеXML.ОткрытьФайл("D:/Exchange.xml"); … НовоеЗначениеXDTO = ГлобальнаяФабрикаXDTO. ПрочитатьXML(НовоеЧтениеXML); Значение XDTO может быть записано в файл XML. ГлобальнаяФабрикаXDTO = ФабрикаXDTO; // Записать данные значения XDTO в файл XML НоваяЗаписьXML = Новый ЗаписьXML; НоваяЗаписьXML.ОткрытьФайл("D:/Exchange.xml"); … ГлобальнаяФабрикаXDTO.ЗаписатьXML(НоваяЗаписьXML, НовоеЗначениеXDTO); 16.4.2. Объект XDTO В противовес простому значению состояние объекта XDTO представляется как совокупность значений его свойств. Экземпляры объекта XDTO являются мутабельными, то есть во время жизни объекта XDTO его состояние может быть изменено путем изменения значений отдельных его свойств. В качестве значений свойств могут фигурировать любые экземпляры данных XDTO, как значение XDTO, так и объект XDTO. Когда значением свойства является объект XDTO, говорят, что значением свойства является ссылка на объект. Новый объект XDTO может быть создан с помощью метода Создать() фабрики XDTO, на основе типа объекта XDTO. После этого следует присвоить соответствующие значения свойствам объекта XDTO. Ниже приведен пример создания объекта XDTO и заполнения его свойств. Пример: Копировать в буфер обмена ГлобальнаяФабрикаXDTO = ФабрикаXDTO; // Создать "пустой" объект XDTO ТипОбъектаXDTOСоздаваемогоОбъекта = ГлобальнаяФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "Номенклатура"); НовыйОбъектХDTO = ГлобальнаяФабрикаXDTO.Создать(ТипОбъектаXDTOСоздаваемогоОбъекта); // Заполнить значения свойств объекта XDTO ОбъектСправочника = СсылкаНаЭлементСправочника.ПолучитьОбъект(); НовыйОбъектХDTO.Наименование = ОбъектСправочника.Наименование; НовыйОбъектХDTO.ПолноеНаименование = ОбъектСправочника.ПолноеНаименование; НовыйОбъектХDTO.ЗакупочнаяЦена = ОбъектСправочника.ЗакупочнаяЦена; НовыйОбъектХDTO.ШтрихКод = ОбъектСправочника.ШтрихКод; Так же как и значение XDTO, данные объекта XDTO могут быть прочитаны из файла XML или записаны в файл XML. Пример: Копировать в буфер обмена ГлобальнаяФабрикаXDTO = ФабрикаXDTO;, // Прочитать данные объекта XDTO из файла XML НовоеЧтениеXML = Новый ЧтениеXML; НовоеЧтениеXML.ОткрытьФайл("D:/Exchange.xml"); … НовыйОбъектXDTO = ГлобальнаяФабрикаXDTO.ПрочитатьXML(НовоеЧтениеXML); … // Записать данные объекта XDTO в файл XML НоваяЗаписьXML = Новый ЗаписьXML; НоваяЗаписьXML.ОткрытьФайл("D:/Exchange.xml"); … ГлобальнаяФабрикаXDTO.ЗаписатьXML(НоваяЗаписьXML,НовыйОбъектХDTO); При чтении нетипизированных данных, считываемый элемент, в случае наличия атрибутов или дочерних элементов, считывается в ОбъектXDTO типа xsd:anyType. Данный тип является открытым типом со смешанным содержимым, поэтому текст в элементе интерпретируется не как значение свойства __content, а как текст и помещается в последовательность объекта. Например, если выполняет чтение элемента вида <element attr="attr_value">element value</element>, то текст element value можно получить следующим образом ОбъектXDTO.Последовательность().ПолучитьТекст(0). Объект ОбъектXDTO содержит следующие методы: ● Тип() – возвращает тип данного объекта XDTO (ТипОбъектаXDTO); ● Установить(<Выражение>), Установить(<Свойство>, <Значение>) – позволяет установить значение свойства; ● Выражение – выражение на XPath, указывающее свойство; ● Свойство – имя свойства; ● Значение – устанавливаемое значение свойства. Если Выражение задано неправильно или Значение не может быть присвоено свойству (например, тип несовместим с типом свойства), то вызывается исключение. Если свойству присваивается неопределенное значение, а свойство ВозможноПустое равно Ложь, то выдается исключение. Если свойству присваивается ссылка на объект XDTO и ссылка на этот объект XDTO уже является значением какого-либо другого свойства, то данная ссылка перестает быть значением этого другого свойства. Цепочки ссылок на объекты XDTO, содержащиеся в свойствах объектов, не могут образовывать циклов. Поэтому при присваивании ссылки на объект XDTO, вызывающий образование цикла, вызывается исключение. Если свойство допускает множество значений, то для него применение метода Установить() недопустимо и приводит к вызову исключения. При присваивании значения свойству производится проверка на допустимость присваивания данного типа значения свойству. Значение может быть присвоено в том случае, если его тип совпадает с типом свойства, является унаследованным от типа свойства или является одним из типов, входящих в объединение. При присваивании, если формой представления значения свойства в XML является Текст или Атрибут, производится приведение значения к типу свойства. Если формой представления является Элемент, значение присваивается как есть. ● Получить(<Свойство>), Получить(<Выражение>) – получение значения свойства: ● Свойство – имя свойства. ● Выражение – выражение на XPath, указывающее свойство. Для свойств с множеством значений данный метод возвращает список значений свойства – СписокXDTO. Все операции модификации значений свойства должны выполняться через этот список. ● Сбросить(<Свойство>), Сбросить (<Выражение>) – сброс значения свойства: ● Свойство – имя свойства. ● Выражение – выражение на XPath, указывающее свойство. Действие метода Сбросить() для различных свойств различно. Для свойств, допускающих множество значений (ВерхняяГраница > 1), выполнение метода Сбросить() приводит к очистке списка значений. ● Установлено() – проверяет, установлено ли значение свойства. Непосредственно после создания объекта у всех свойств результатом выполнения метода Установлено() будет значение Ложь. ● Последовательность() – возвращает объект-последовательность (ПоследовательностьXDTO), принадлежащий данному объекту XDTO. С помощью последовательности XDTO также можно модифицировать состояние объекта. Данный метод возвращает последовательность XDTO только в том случае, если у типа объекта установлено свойство Последовательный. ● Проверить() – данный метод позволяет проверить правильность заполнения значений свойств объекта XDTO. При проверке проверяются также объекты, ссылки на которые являются значениями свойств. Предметом проверки является соответствие количества значений свойств свойствам НижняяГраница и ВерхняяГраница, правильность следования значений свойств в последовательности XDTO, если свойство Упорядоченный имеет значение Истина. Проверка прекращается при нахождении первой же ошибки. При этом выдается исключение. 16.4.3. Последовательность XDTO С помощью объекта ПоследовательностьXDTO моделируется порядок следования элементов и фрагментов текста, как они выглядят в XML-представлении объекта. Последовательность состоит из пар «свойство – значение». В качестве свойств могут выступать только свойства с формой представления Элемент, так как порядок следования атрибутов не важен. Свойство в паре «свойство – значение» может также иметь неопределенное значение. В этом случае считается, что данный элемент последовательности представляет фрагмент текста. Появление элементов последовательности, представляющих фрагменты текста, допустимо только для объектов типов, у которых значение свойства Смешанный равно Истина. При формировании содержимого объекта XDTO с помощью присваивания значений свойствам порядок присваивания отражается в последовательности XDTO. Последовательность XDTO содержит следующие методы: ● Количество() – возвращает число элементов последовательности. ● ПолучитьСвойство(<Индекс>) – возвращает свойство, которому соответствует значение, находящееся по индексу Индекс. Если Индекс находится за границами допустимых значений, выдается исключение. Метод может вернуть неопределенное значение, если элементу последовательности соответствует фрагмент текста из смешанного содержания (текст и элементы). ● ПолучитьЗначение(<Индекс>) – возвращает значение, находящееся по индексу Индекс. Если Индекс находится за границами допустимых значений, выдается исключение. ● УстановитьЗначение(<Индекс>, <Элемент>) – устанавливает значение Элемент по индексу Индекс. Индекс должен иметь значение в диапазоне допустимых индексов. Элемент должен иметь допустимое значение для свойства, для которого он устанавливается, или для текста. ● Добавить(<Свойство>, <Элемент>) – добавляет пару «свойство – значение» к последовательности. Значение должно быть допустимым для свойства. ● Добавить(<Текст>) – добавляет фрагмент текста к последовательности. Если у типа объекта свойство Смешанный имеет значение Ложь, то выдается исключение. ● Вставить(<Индекс>, <Свойство>, <Элемент>) – вставляет пару «свойство – значение» в позицию Индекс последовательности. Индекс должен иметь значение внутри диапазона индексов. Элемент в позиции Индекс и все элементы с большими значениями индекса сдвигаются вправо на одну позицию. ● Вставить(<Индекс>, <Текст>) – вставляет текст Текст в позицию Индекс последовательности. Индекс должен иметь значение внутри диапазона индексов. Элемент в позиции Индекс и все элементы с большими значениями индекса сдвигаются вправо на одну позицию. ● Удалить(<Индекс>) – удаляет элемент последовательности в позиции Индекс. Индекс должен иметь значение внутри диапазона допустимых. 16.4.4. Список XDTO С помощью объекта СписокXDTO моделируется список значений для свойств с множественными значениями (ВерхняяГраница > 1). Список представляет собой упорядоченный набор объектов, которые могут являться как значениями XDTO, так и объектами XDTO. Среди них могут иметь место неопределенные значения, если свойство ВозможноПустое имеет значение Истина. Но понятие «установленности» для элемента списка не определено. Объект СписокXDTO содержит следующие методы: ● Количество() – возвращает размер списка. ● Получить(<Индекс>) – получает значение, находящееся по индексу Индекс. Индекс должен находиться в диапазоне допустимых. В противном случае выдается исключение. ● Установить(<Индекс>, <Элемент>) – устанавливает значение Элемент в позицию Индекс. Устанавливаемое значение замещает ранее присутствовавшее значение. Индекс должен находиться в диапазоне допустимых, а Элемент должен быть допустимым для свойства. В противном случае выдается исключение. ● Добавить(<Элемент>) – добавляет значение в хвост списка. Элемент должен быть допустимым для свойства. В противном случае выдается исключение. ● Вставить(<Индекс>, <Элемент>) – внесение значения Элемент в позицию Индекс. Индекс должен находиться в диапазоне допустимых, а Элемент должен быть допустимым для свойства. В противном случае выдается исключение. Значение в позиции Индекс и значения с большими позициями сдвигаются вправо на одну позицию. ● Удалить(<Индекс>) – удаление значения в позиции Индекс. Индекс должен находиться в диапазоне допустимых. Значения с большими позициями сдвигаются на освободившееся место. 16.4.5. XРath Для навигации по дереву объектов могут использоваться выражения на XPath. Строго говоря, это не совсем XPath, а скорее несколько модифицированное подмножество XPath. Основной конструкцией данного языка является путь к значению, который состоит из отдельных шагов. Шаги в пути отделяются друг от друга символами "/" (слеш). В качестве шага пути выступает имя свойства или предопределенные конструкции "." (точка) и ".." (две точки). Выражение приведенного ниже вида обозначает свойство с именем ИмяСвойства текущего объекта, а именно объекта, у которого вызвали метод Получить() или Установить(). Копировать в буфер обмена ИмяСвойства Выражение приведенного ниже вида означает, что у текущего объекта получено значение свойства ИмяСвойства1, а у объекта, ссылка на который является значением свойства ИмяСвойства1, получено свойство ИмяСвойства2. Копировать в буфер обмена ИмяСвойства1/ИмяСвойства2 Соответственно, шаг, обозначенный как точка, означает текущий объект, а две точки – объект-владелец текущего. Если путь поиска начинается с символа слеш, то это означает поиск от корня дерева объектов. Если какое-либо свойство в пути не найдено, то это вызывает исключение. Если в пути встречается свойство с множественным значением, то результатом является весь список значений данного свойства. Например, если в пути, приведенном ниже, свойство Список имеет множественное значение, то результат данного выражения – это список (СписокXDTO) значений данного свойства. Копировать в буфер обмена Свойство/Список Для того чтобы получить отдельное значение из этого списка, нужно через точку от имени свойства указать 0-базированный индекс значения в списке, как это показано ниже. Копировать в буфер обмена Свойство/Список.0 Индекс должен быть задан как целое число, находящееся в пределах диапазона допустимых индексов. В противном случае будет вызвано исключение. Можно получить отдельное значение из списка с использованием 1-базированного индекса. Для этого применяется конструкция следующего вида: Копировать в буфер обмена Свойство/Список[1] Индекс может принимать значения от 1 до числа элементов в списке. Имеется также возможность поиска в списке (только для объектов). Выражение для поиска выглядит следующим образом: Копировать в буфер обмена Свойство/Список[ИмяСвойства='СтрокаПоиска'] Здесь Список – это свойство с множественным значением. Значением списка являются объекты, у которых имеется свойство с именем ИмяСвойства. Результатом будет первый объект в списке, значение свойства Свойство которого равно строковому значению ‘СтрокаПоиска’. Если ни одного объекта не найдено, то результатом является неопределенное значение. Свойство ИмяСвойства также может присутствовать не у всех объектов в списке. А может и не присутствовать ни у кого. Значение, с которым сравнивается значение свойства, может быть задано в виде числа, логического значения (True или False) или строкового литерала. Копировать в буфер обмена Свойство/Список[ИмяСвойства!='СтрокаПоиска'] Приведенное выше выражение аналогично предыдущему примеру, за исключением того, что результатом будет первый объект в списке, значение свойства ИмяСвойства которого не равно строковому значению ‘СтрокаПоиска’. Ниже приведено определение описываемого подмножества XPath. <Путь> Копировать в буфер обмена [/] <Список шагов> <Список шагов> Копировать в буфер обмена <Шаг> [/<Список шагов>] | <Шаг> Копировать в буфер обмена <Имя свойства> [<Уточнение>] | .. | . | <Имя свойства> Копировать в буфер обмена [<Буква> | _]<Остаток имени> <Остаток имени> Копировать в буфер обмена {<Буква> | <Цифра> | _} <Остаток имени> | <Уточнение> Копировать в буфер обмена .<0-базированный индекс> | [<Имя свойства>=<Значение>] | [<Имя свойства>!=<Значение>] | [<1-базированный индекс>] <0-базированный индекс> Копировать в буфер обмена <Целое без знака> <1-базированный индекс> Копировать в буфер обмена <Целое без знака> <Целое без знака> Копировать в буфер обмена <Цифра> <Цифры> <Цифра> Копировать в буфер обмена 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <Цифры> Копировать в буфер обмена <Цифра> <Цифры> | <Значение> Копировать в буфер обмена <Число> | <Строка> | <Булево> <Число> Копировать в буфер обмена [+|-]<Целое без знака>[.<Целое без знака>] <Строка> Копировать в буфер обмена "<Символы>" | '<Символы>' <Булево> Копировать в буфер обмена true | false ПРИМЕЧАНИЕ. В строке с ограничителями «"» среди символов не может встречаться «"». Аналогично в строке с разделителями «’» не может встречаться символ «’». При сравнении значения свойства со значением, заданным в виде литерала, значение, заданное в виде литерала, приводится к типу свойства по правилам приведения, после чего производится сравнение. 16.5. XML-сериализация на основе XDTO Значения типов конфигураций системы «1С:Предприятие» могут быть сериализованы непосредственно в(из) файл(а) XML на основе XDTO. Для этого используется объект СериализаторXDTO, который может быть получен с помощью конструктора на основе существующей фабрики XDTO. Работа с объектом СериализаторXDTO аналогична работе с глобальными процедурами и функциями работы с XML. Например, сериализация ссылки на справочник Номенклатура в файл XML может быть выполнена с помощью программного кода. Пример: Копировать в буфер обмена // Получить ссылку на элемент справочника Номенклатура СсылкаНаЭлементСправочника = Справочники.Номенклатура.НайтиПоКоду("0000001"); // Создать сериализатор XDTO для глобальной фабрики XDTO НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); // Создать объект записи XML и открыть файл НоваяЗаписьXML = Новый ЗаписьXML; НоваяЗаписьXML.ОткрытьФайл("D:/Exchange.xml"); // ... // Cериализовать ссылку в XML НовыйСериализаторXDTO.ЗаписатьXML(НоваяЗаписьXML, СсылкаНаЭлементСправочника, НазначениеТипаXML.Явное); Ниже приведен пример сериализации ссылки на справочник Номенклатура из файла XML. Пример: Копировать в буфер обмена // Создать сериализатор XDTO для глобальной фабрики XDTO НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO); // Прочитать данные объекта XDTO из файла XML НовоеЧтениеXML = Новый ЧтениеXML; НовоеЧтениеXML.ОткрытьФайл("D:/Exchange.xml"); … // Сериализовать ссылку из XML НоваяСсылкаНаСправочник = НовыйСериализаторXDTO.ПрочитатьXML(НовоеЧтениеXML); 16.6. Рекомендации по оформлению схем XML Преобразование НаборСхемXML " ФабрикаXDTO " НаборСхемXML в общем случае не дает на выходе набор схем XML, эквивалентный исходному. Однако следование набору рекомендаций по оформлению схем XML позволит добиться эквивалентности выходного набора схем исходному, а именно: ● для преобразования НаборСхемXML " ФабрикаXDTO " НаборСхемXML будет соблюдаться эквивалентность выходного набора схем исходному; ● успешная проверка правильности заполнения свойств объекта ОбъектXDTO (метод Проверить()) гарантирует, что представление объекта в XML будет соответствовать схеме XML; ● обеспечивается максимальная гибкость и отсутствие искажений при использовании полиморфизма. Схема XML, полученная на основе фабрики XDTO, для типов которой не переопределялись значения по умолчанию параметров, ответственных за XMLпредставление данных, безусловно, соответствует приведенным рекомендациям. В общем, приведенный далее список рекомендаций представляет собой набор правил, позволяющий добиться наилучших результатов с различных точек зрения. Схема XML не должна содержать анонимных типов Недопустимы конструкции следующего вида: Копировать в буфер обмена <element name="Person"> <complexType> <sequence> <element name="FirstName" type="string" /> <element name="FamilyName" type="string" /> </sequence> </complexType> </element> Этот фрагмент нужно оформить следующим образом: Копировать в буфер обмена <element name="Person" type="tns:PersonType"> <complexType name="PersonType"> <sequence> <element name="FirstName" type="string" /> <element name="FamilyName" type="string" /> </sequence> </complexType> </element> Для контента сложных типов следует использовать только модель sequence Для моделирования контента у сложных типов (complexType) следует использовать только единственный блок sequence без переопределения значений по умолчанию атрибутов minOccurs и maxOccurs. Копировать в буфер обмена <complexType name="PersonType"> <sequence> <element name="FirstName" type="string" /> <element name="FamilyName" type="string" /> </sequence> </complexType> Модель all не нарушает тождественность исходной и результирующей схемы при преобразовании НаборСхемXML " ФабрикаXDTO " НаборСхемXML, однако имеет ряд ограничений. В частности, значение атрибута maxOccurs для элементов в модели all не может быть больше 1. Модель choice нарушает эквивалентность исходной и результирующей схем и не позволяет с помощью метода Проверить() проверить соответствие заполнения данных объекта схеме XML. По тем же причинам не следует использовать в рамках одного сложного типа комбинацию из нескольких моделей контента или же определять для sequence значения атрибутов minOccurs и maxOccurs, отличные от значений по умолчанию. Желательно свойства объектов представлять в XML в виде элементов Представление свойств как атрибутов XML не влияет на эквивалентность исходной и результирующей схем. Однако имеется ряд ограничений: ● В атрибуте не может быть представлено значение объектного типа – только типовзначений. ● В атрибуте не могут быть представлены свойства с множественными значениями. ● В случае полиморфных типов у свойства, представленного как атрибут XML, может происходить искажение типа значения. А именно: при присваивании значения свойству тип значения приводится точно к типу свойства, так как только для значения свойства в элементе XML можно указать атрибут xsi:type, который позволяет точно указать тип значения свойства. Как следствие не нужно использовать simpleContent для complexType, так как эта модель для хранения значений подразумевает использование свойств атрибутов и текста включающего элемента XML. Не рекомендуется использовать одинаковые имена для объявления атрибута и элемента. Правила формирования имени свойства XDTO см. здесь. Не следует использовать модель mixed content Применение в схеме XML конструкции приведенного ниже вида означает, что в элементе XML, соответствующем описываемому типу, текст может быть перемешан с элементами XML. Копировать в буфер обмена <complexType name="FormLetter" mixed="true"> </complexType> Для поддержки такого информационного содержимого у соответствующего объекта ТипОбъектаXDTO значения свойств Последовательный и Смешанный установлены в значение Истина, а у каждого экземпляра соответствующего объекта ОбъектXDTO появляется последовательность XDTO (объект ПоследовательностьXDTO). Управление информационным содержимым таких объектов намного сложнее, чем у объектов, состояние которых представлено только набором значений свойств. К счастью, в подавляющем большинстве случаев в применении mixed content не возникает необходимости. Свойство ФормаЭлементовПоУмолчанию у схемы XML должно иметь значение Квалифицированная. Данная рекомендация является элементом хорошего стиля, и XDTO придерживается этого стиля. 16.7. Правила проверки фабрики XDTO Общая схема кодирования идентификаторов сообщений об ошибках проверки фабрики XDTO выглядит следующим образом: Копировать в буфер обмена xdto-<область>-<раздел>[-<правило>]: <описание ошибки> ● <область> – область проверки (фабрика XDTO, пакет XDTO, тип значения XDTO, фасет XDTO, тип объекта XDTO); ● <раздел> – номер раздела, проверка правила которого завершилась неудачей; ● <правило> – правило раздела; ● <описание ошибки> – описание ошибки. 16.7.1. Правила проверки непосредственно фабрики XDTO При проверке непосредственно фабрики XDTO ошибки кодируются префиксом model. При этом общий префикс будет иметь следующий вид: Копировать в буфер обмена xdto-model-<раздел>[-<правило>]: <описание ошибки> Пакеты, входящие в модель, должны иметь уникальные URI пространства имен – дублирование пакетов в рамках модели запрещено. Директива импорта должна определять непустое URI пространства имен импортируемого пакета. Директивы импорта пакетов должны определять существующие пакеты типов. Пакеты типов, определенные в модели, должны удовлетворять правилам проверки пакетов. 16.7.2. Правила проверки пакета XDTO При проверке правильности пакета XDTO ошибки кодируются префиксом package. При этом общий префикс будет иметь следующий вид: Копировать в буфер обмена xdto-package-<раздел>[-<правило>]: <описание ошибки> Пакет XDTO должен иметь установленное свойство URIПространстваИмен. Типы, определяемые в пакете XDTO, могут иметь ссылки только на типы, указанные в списке импортируемых (свойство Зависимости). Директивы импорта должны удовлетворять следующим правилам: ● директивы импорта должны определять пакеты XDTO, в которых не могут содержаться директивы импорта, указывающие на данный пакет XDTO, – зацикливание импортируемых директив не допускается; ● директива импорта должна определять не пустое свойство URIПространстваИмен импортируемого пакета XDTO; ● директивы импорта должны определять существующие пакеты XDTO. Свойства пакета должны удовлетворять следующим правилам: ● имена свойств пакета должны быть установлены и не являться пустыми; ● имена свойств пакета должны быть уникальны в пределах пакета; ● тип свойства пакета должен быть установлен или определен; ● типы свойств пакета должны быть определены в пакете или его зависимостях; ● задание одновременно имени типа глобального свойства и анонимного определения типа глобального свойства недопустимо; ● свойство пакета не должно ссылаться на определение другого свойства пакета; ● свойство пакета не должно определять границы количества значений свойства; ● свойство пакета может иметь форму представления только Атрибут или Элемент. 16.7.3. Правила проверки типа значения XDTO При проверке правильности типа значения XDTO ошибки кодируются префиксом valueType. При этом общий префикс будет иметь следующий вид: Копировать в буфер обмена xdto-valueType-<раздел>[-<правило>]: <описание ошибки> ● Общие правила проверки типа значения XDTO: ● если тип определен в рамках пакета типов, то должны выполняться следующие условия: ● тип значения XDTO должен иметь установленное свойство Имя, содержащее непустое имя; ● имя типа значения XDTO должно быть уникальным в пределах пакета XDTO (среди всех типов пакета XDTO); ● если тип определен в рамках другого определения типа значения или в рамках определения свойства объектного типа, то должно выполняться следующее условие: ● свойство Имя определения типа не должно быть установлено; ● тип значения XDTO не может содержать ссылок на самого себя ни в базовом типе, ни в типе элемента списка, ни в одном из типов объединения на всю глубину иерархии. ● Правила проверки базового типа – свойство БазовыйТип: ● если свойство БазовыйТип не установлено: ● если свойство Вариант не установлено, а свойство ТипыЧленовОбъединения не установлено, или свойство Вариант установлено и имеет значение Атомарный: ● если свойство ОпределениеТипа содержит единственное значение, то это определение типа является определением анонимного базового типа; ● в противном случае базовым типом считается тип anySimpleType пространства имен XML-схемы (http://www.w3.org/2001/XMLSchema); ● если свойство БазовыйТип определения типа установлено, то должны выполняться следующие условия: ● базовый тип должен удовлетворять второму правилу проверки пакета XDTO; ● базовый тип должен являться типом значения XDTO; ● базовый тип не может являться данным типом значения XDTO. ● Правила проверки типа элемента списка – свойство ТипЭлементаСписка: ● если свойство ТипЭлементаСписка определения типа установлено, то должны выполняться следующие условия: ● тип элемента списка должен удовлетворять второму правилу проверки пакета XDTO; ● тип элемента списка должен являться типом значения XDTO; ● тип элемента списка не может являться данным типом значения XDTO; ● тип значения XDTO, являющийся элементом списка, должен быть либо атомарным, либо объединением типов значений XDTO, состоящим только из атомарных типов значений XDTO; ● если свойство Вариант не установлено, а свойство БазовыйТип установлено или свойство Вариант установлено и имеет значение Список: ● если свойство ОпределениеТипа содержит единственное значение, то это определение типа является определением анонимного типа элемента списка; ● в противном случае значение свойства ТипЭлементаСписка определяется из соответствующего свойства базового типа значения XDTO. ● Правила проверки типа объединения – свойство ТипыЧленовОбъединения: ● если свойство ТипыЧленовОбъединения определения типа XDTO установлено, то должны выполняться следующие условия: ● тип объединения должен удовлетворять второму правилу проверки пакета XDTO; ● тип объединения должен являться типом значения XDTO; ● тип объединения не должен являться данным типом значения XDTO; ● тип значения XDTO, являющийся объединением, должен быть либо атомарным, либо списком; ● если свойство Вариант не установлено, а свойство БазовыйТип установлено или свойство Вариант установлено и имеет значение Объединение: ● свойство ОпределениеТипа содержит значения, являющиеся анонимными определениями типов объединения; ● в противном случае значение свойства ТипыЧленовОбъединения определяется значением свойства ТипыЧленовОбъединения базового типа значения XDTO. ● Наследование типов значений XDTO считается правильным, если выполнятся следующие условия: ● для атомарных типов значений XDTO (после выполнения правил проверки типа элемента списка и правил проверки типа объединения свойства ТипЭлементаСписка и ТипыЧленовОбъединения не установлены) должны выполняться следующие условия: ● тип значения XDTO, являющийся базовым, должен быть атомарным, т. е. свойства ТипЭлементаСписка и ТипыЧленовОбъединения базового типа XDTO не должны быть установлены; ● предком типа значения XDTO должен быть один из примитивных типов пространства имен схемы XML (http://www.w3.org/2001/XMLSchema); ● состав фасетов, установленных в описании типа значения XDTO, должен соответствовать списку допустимых фасетов для примитивного типа, являющегося предком данного типа XDTO; ● значение каждого фасета, установленного в типе значения XDTO, должно удовлетворять правилам ограничения эффективного значения аналогичного фасета базового типа XDTO; ● для типов элемента списка (после выполнения правил проверки типа элемента списка и правил проверки типа объединения установлено свойство ТипЭлементаСписка): ● базовый тип XDTO не может являться типом объединения, т. е. свойство ТипыЧленовОбъединения базового типа XDTO не должно быть установлено; ● если свойство ТипЭлементаСписка базового типа XDTO установлено, то значение этого свойства должно определять базовый тип для типа элемента списка, определенного в свойстве ТипЭлементаСписка данного типа значения XDTO; ● если базовым типом является тип anySimpleType пространства имен XML схемы (http://www.w3.org/2001/XMLSchema), то среди списка фасетов допускается только фасет ПробельныеСимволы; ● в противном случае могут быть определены только фасеты: Образец, Перечисление, Длина, МинДлина, МаксДлина и ПробельныеСимволы; ● значение каждого фасета, установленного в типе, должно удовлетворять правилам ограничения эффективного значения аналогичного фасета базового типа; ● для типов объединения (после выполнения правил проверки типа элемента списка и правил проверки типа объединения установлено свойство ТипыЧленовОбъединения): ● базовым типом может являться тип anySimpleType пространства имен XML схемы (http://www.w3.org/2001/XMLSchema) или тип объединения, т. е. у базового типа должно быть установлено свойство ТипыЧленовОбъединения; ● если базовым типом является тип объединения, должны выполняться следующие условия: ● количество типов объединения базового типа не должно быть больше количества типов объединения данного типа; ● типы объединения должны быть потомками соответствующих им типов объединения базового типа в порядке следования в списке типов объединения; ● если базовым типом является тип anySimpleType пространства имен XML схемы (http://www.w3.org/2001/XMLSchema), то определение фасетов не допускается; ● в противном случае могут быть определены только фасеты Образец и Перечисление; ● значение каждого фасета, установленного в типе, должно удовлетворять правилам ограничения эффективного значения аналогичного фасета базового типа. ● Если свойство Вариант (модель содержания) определения типа установлено, то оно не должно противоречить определению типа: ● если свойство имеет значение Атомарный, то тип имеет атомарную модель содержания и должен удовлетворять правилам xdto-valueType-5.1; ● если свойство имеет значение Список, то тип имеет модель содержания Список и должен удовлетворять правилам xdto-valueType-5.2; ● если свойство имеет значение Объединение, то тип имеет модель содержания Объединение и должен удовлетворять правилам xdto-valueType-5.3. 16.7.4. Правила проверки типа объекта XDTO При проверке правильности типа объекта XDTO ошибки кодируются префиксом objectType. При этом общий префикс будет иметь следующий вид: Копировать в буфер обмена xdto-objectType-<раздел>[-<правило>]: <описание ошибки> ● Общие правила проверки типа объекта XDTO: ● если тип определен в рамках пакета типов, то должны соблюдаться следующие условия: ● тип объекта XDTO должен иметь установленное свойство Имя, содержащее непустое имя; ● имя типа объекта XDTO должно быть уникальным в пределах пакета (среди всех типов пакета); ● если тип определен в рамках свойства объектного типа, то должны соблюдаться следующие условия: ● свойство Имя определения типа не должно быть установлено. ● Правила проверки базового типа – свойство БазовыйТип: ● если свойство БазовыйТип не установлено, то базовым типом считается тип anyType пространства имен XML схемы (http://www.w3.org/2001/XMLSchema); ● если свойство БазовыйТип типа объекта XDTO установлено, то должны выполняться следующие условия: ● базовый тип должен удовлетворять второму правилу проверки пакета XDTO; ● базовый тип должен являться типом объекта XDTO; ● базовый тип не может являться данным типом объекта XDTO. ● Каждое свойство типа объекта XDTO должно удовлетворять следующим правилам: ● имя свойства должно быть определено; ● имя свойства не может быть пустым; ● имя свойства должно быть уникальным для типа объекта XDTO; ● если свойство Тип установлено, то должны выполняться следующие условия: ● имя типа должно определять существующий тип объекта XDTO или тип значения XDTO; ● тип свойства должен удовлетворять второму правилу проверки пакета XDTO; ● свойство не может содержать определение анонимного типа; ● если свойство Тип не установлено, то должны выполняться следующие условия: ● если у свойства имеется определение анонимного типа, то типом свойства является тип, соответствующий данному определению; ● в противном случае типом свойства считается тип anyType пространства имен XML схемы (http://www.w3.org/2001/XMLSchema); ● если у свойства определено значение по умолчанию, то должны быть выполнены следующие условия: ● тип свойства ЗначениеПоУмолчанию должен быть типом значения XDTO; ● лексическое представление значения по умолчанию должно соответствовать пространству значений типа свойства XDTO; ● удовлетворять следующим требованиям: ● если свойство ЛокальноеИмя свойства XDTO не установлено, то в качестве локального имени XML представления свойства XDTO используется свойство Имя свойства XDTO; ● если свойство URIПространстваИмен свойства XDTO не установлено, то URI пространства имен XML представления свойства XDTO определяется следующим образом: ● если формой XML представления свойства XDTO (свойство Форма) является Элемент, то используется URI пространства имен типа, которому принадлежит данное свойство; ● в противном случае URI пространства имен XML-представления свойства XDTO считается отсутствующим; ● свойство XDTO должно быть уникально по XML-представлению в пределах типа объекта XDTO; ● если свойство XDTO имеет форму XML-представления Текст, то должны выполняться следующие правила: ● имя и URI пространства имен должны быть неустановленными или быть пустыми; ● среди свойств типа объекта XDTO допускается наличие свойств XDTO с формой XML представления Атрибут; ● если свойство XDTO имеет форму XML представления Элемент, то наличие среди свойств типа объекта XDTO свойства XDTO с формой XMLпредставления Текст запрещено; ● значение нижней границы количества появления значений свойства НижняяГраница может принимать значения неотрицательных целых чисел. Значение нижней границы НижняяГраница должно быть меньше или равно значению верхней границы количества появления значений свойств ВерхняяГраница при условии, что данное значение не равно -1; ● значение верхней границы количества значений свойства ВерхняяГраница может принимать значения неотрицательных целых чисел или -1. Если данное значение равно -1, то это означает неограниченное количество значений свойства; ● если значение свойства Фиксированное установлено, то по умолчанию должно быть установлено ЗначениеПоУмолчанию, соответствующее пространству значений типа свойства XDTO; ● если установлена ссылка на определение глобального свойства, то должны выполняться следующие правила: ● определение свойства не может переопределять значения свойств глобального определения; ● глобальное свойство, на определение которого ссылается данное определение свойства, должно быть определено в рамках данного пакета или пакетовзависимостей. ● Если среди свойств типа объекта XDTO имеется свойство XDTO, совпадающее по имени или XML-представлению со свойством базового типа, то вид наследования определяется как наследование ограничением. При таком виде наследования должны выполняться следующие условия: ● для каждого свойства XDTO должны выполняться следующие условия: ● в базовом типе должно быть определено свойство XDTO с тем же именем – переопределяемое свойство; ● если базовый тип определяет порядок следования свойств (свойство Упорядоченный), то позиция переопределяемого свойства должна быть идентична позиции свойства в типе-наследнике; ● форма XML представления переопределяемого свойства и свойства данного типа должна совпадать; ● локальное имя XML представления переопределяемого свойства и свойства данного типа должно совпадать; ● URI пространства имен XML представления переопределяемого свойства и свойства данного типа должна совпадать; ● если переопределяемое свойство определяет фиксированное значение, то: ● наличие фиксированного значения не может быть отменено в типе-наследнике; ● фиксированное значение в базовом типе и типе-наследнике должно совпадать; ● нижняя граница количества значений свойства должна быть меньше или равна нижней границе количества значений переопределяемого свойства; ● верхняя граница количества значений свойства должна быть больше или равна верхней границе количества значений переопределяемого свойства; ● тип свойства должен являться потомком типу переопределяемого свойства; ● если базовый тип не обладает смешанным содержанием (свойство Смешанный), то смешанная модель не может быть установлена в типе-наследнике; ● если порядок следования свойств базового типа фиксирован (свойство Упорядоченный), то порядок не может быть изменен в типе-наследнике; ● если базовый тип не определяет наличие последовательности (свойство Последовательный), то наличие последовательности не может быть установлено в типе-наследнике; ● если базовый тип не определяет открытую модель содержания (свойство Открытый), то открытая модель содержания не может быть установлена в типе-наследнике. ● В противном случае вид наследования определяется как наследование расширением. Для данного вида наследования должны выполняться следующие правила: ● если модель содержания базового типа является смешанной (свойство Смешанный), то она не может быть изменена в типе-наследнике; ● если порядок следования свойств базового типа не фиксирован (свойство Упорядоченный), то порядок не может быть изменен в типе-наследнике; ● если базовый тип определяет наличие последовательности (свойство Последовательный), то последовательность не может быть запрещена в типенаследнике; ● если базовый тип определяет открытую модель содержания (свойство Открытый), то модель содержания не может быть изменена в типе-наследнике. ● При любом виде наследования должны выполняться следующие условия: ● если модель содержания является смешанной (свойство Смешанный), то наличие последовательности (свойство Последовательный) не может быть запрещено; ● если модель содержания является открытой (свойство Открытый), то наличие последовательности (свойство Последовательный) не может быть запрещено. 16.7.5. Правила ограничения фасетов При проверке правильности фасета XDTO ошибки кодируются префиксом facet. При этом общий префикс будет иметь следующий вид: Копировать в буфер обмена xdto-facet-<раздел>[-<правило>]: <описание ошибки> Правила для фасета Длина: ● значение фасета должно совпадать с эффективным значением фасета базового типа; ● если установлено значение фасета МинДлина, то оно должно удовлетворять следующим условиям: ● значение фасета МинДлина должно быть меньше или равно значению фасета Длина; ● в базовом типе не установлено значение фасета Длина, или значение фасета МинДлина не отличается от эффективного значения фасета МинДлина базового типа; ● если установлено значение фасета МаксДлина, то оно должно удовлетворять следующим условиям: ● значение фасета МаксДлина должно быть меньше или равно значению фасета Длина; ● в базовом типе не установлено значение фасета Длина, или значение фасета МаксДлина не отличается от эффективного значения фасета МаксДлина базового типа. Правила для фасета МинДлина: ● значение фасета должно быть больше или равно эффективному значению фасета в базовом классе; ● значение фасета должно быть меньше или равно эффективному значению фасета МаксДлина. Правила для фасета МаксДлина: ● значение фасета должно быть меньше или равно эффективному значению фасета в базовом классе; ● значение фасета должно быть больше или равно эффективному значению фасета МинДлина. Правила для фасета ПробельныеСимволы: ● если эффективное значение фасета базового типа равно collapse, то значение фасета не может принимать другое значение; ● если эффективное значение фасета базового типа равно preserve, то значение фасета не может принимать значение replace. Правила для фасета МинВключающее: ● значение фасета должно быть меньше эффективного значения фасета МаксИсключающее данного типа; ● значение фасета должно быть больше или равно эффективному значению фасета базового типа; ● если установлено значение фасета МаксВключающее, то оно должно быть меньше или равно эффективному значению фасета МаксВключающее базового типа. ● если установлено значение фасета МинИсключающее, то оно должно быть больше эффективного значения фасета МинИсключающее базового типа; ● если установлено значение фасета МаксИсключающее, то оно должно быть меньше эффективного значения фасета МаксИсключающее базового типа. Правила для фасета МинИсключающее: ● установка значения фасета МинИсключающее и МинВключающее фасета в определении типа не допускается; ● если установлено значение фасета МаксВключающее, то значение фасета МинИсключающее должно быть меньше значения фасета МаксВключающее данного типа; ● значение фасета должно быть больше или равно эффективному значению фасета базового типа; ● если установлено значение фасета МаксВключающее, то оно должно быть меньше или равно эффективному значению фасета МаксВключающее базового типа; ● если установлено значение фасета МинВключающее, то оно должно быть больше или равно эффективному значению фасета МинВключающее базового типа; ● если установлено значение фасета МаксИсключающее, то оно должно быть меньше эффективного значения фасета МинВключающее базового типа. Правила для фасета МаксВключающее: ● значение фасета должно быть больше или равно значению фасета МинВключающее данного типа; ● если установлено значение фасета МаксИсключающее, то оно должно быть меньше эффективного значения базового типа; ● если установлено значение фасета МинВключающее, то оно должно быть больше или равно эффективному значению базового типа; ● если установлено значение фасета МинИсключающее, то оно должно быть больше эффективного значения базового типа. Правила для фасета МаксИсключающее: ● установка значения фасета МаксИсключающее и МаксВключающее фасета в определении типа не допускается; ● если установлено значение фасета МинИсключающее, то значение фасета МаксИсключающее должно быть больше значения фасета МинИсключающее данного типа; ● значение фасета должно быть меньше или равно эффективному значению фасета базового типа; ● если установлено значение фасета МаксВключающее, то оно должно быть меньше или равно эффективному значению базового типа; ● если установлено значение фасета МинИсключающее, то оно должно быть больше эффективного значения базового типа; ● если установлено значение фасета МинВключающее, то оно должно быть больше эффективного значения базового типа. Правило для фасета РазрядовВсего: ● значение фасета должно быть меньше или равно эффективному значению фасета базового типа. Правила для фасета РазрядовДробнойЧасти: ● значение фасета должно быть меньше или равно эффективному значению фасета РазрядовВсего; ● значение фасета должно быть меньше или равно эффективному значению фасета базового типа.