XML в 1С 8.3

Курс

Формат XML

Общее описание

XML (eXtensible Markup Language) — это расширяемый язык разметки. Он называется расширяемым, потому что разработчик сам определяет структуру тегов и атрибутов внутри XML-документа. XML определяет лишь синтаксис языка.

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

По своей структуре XML-документ это обычный текстовый документ с расширением .xml.

XML-документ состоит из следующих элементов:

  • теги
  • Значения
  • атрибуты

Пример XML-файла:

Теги

XML-документ состоит из элементов (также называют узлами). В свою очередь элемент состоит из тегов.

Тег — это произвольная строка, заключенная в угловые скобки, например <Тег1>.

В XML может быть 2 вида тегов:

  • открывающий: <Тег1>
  • закрывающий: </Тег1>

Каждый открывающий тег должен иметь закрывающий. Регистр имеет значение, если открывающий тег называется <Тег1>, то закрывающий не может называться <тег1>.

Значения

Между открывающим и закрывающим тегом находится значение:

Если у элемента нет значения, то его можно отразить одним тегом:

Данный элемент аналогичен следующему элементу:

Значение может принимать следующие типы:

  • Строка
  • Число
  • Вложенный элемент

Например:

Элементы могут быть сколько угодно раз вложены друг в друга. У одного элемента может быть сколько угодно вложенных элементов, но только один владелец. Из этого следует, что на самом верху всегда должен быть только один элемент, который называется корневым элементом. Только у корневого элемента нет владельца.

Атрибуты

Каждый элемент может иметь произвольное количество атрибутов. Атрибуты указываются в открывающем теге в виде пары имя = «значение». Имя указывается обычной строкой, значение всегда помещается в кавычки:

Объявление XML

В начале XML-документа может быть следующая строка:

Такая строка называется объявлением XML (другое название XML пролог). В ней указывается версия XML и кодировка. Данная строка не обязательна, если ее нет, то кодировкой по умолчанию считается UTF-8.

Проверка корректности XML

XML-документ должен удовлетворять следующим условиям:

  • У каждого открывающего тега должен быть закрывающий тег. Регистр имеет значение <Тег1> не равен <тег1>.
  • Все элементы должны образовывать древовидную структуру, только с одним корневым элементом. Элементы могут быть вложенными, но не могут пересекаться. Например, такой XML корректный:

А такой нет:

  • Значения атрибутов должны быть заключены в кавычки:

Комментарии в XML

Внутри XML-документа могут быть комментарии. Комментарии начинаются с <!— и заканчиваются —>. Все что между считается комментарием. Комментарии никак не влияют на структуру документа:

Пространства имен

В XML можно использовать пространства имен. Они позволяют внутри одного документа использовать элементы с одинаковым именем, но принадлежащие разным пространствам имен.

Например, есть следующий XML файл:

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

Для этого можно объявить пространства имен и указать свое пространство для каждого тега:

Пространство имен может быть объявлено в любом теге в атрибуте xmlns. Сначала указывается префикс, а потом само пространство:

Здесь:

  • string — это префикс пространства имен.
  • com.string — это имя пространства имен.

Имя пространства имен должно быть уникальным. Как правило используется URL сайта, хотя можно использовать произвольные идентификаторы.

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

Можно указать пространство имен без префикса:

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

Запись XML

Для записи XML файла в 1С используется объект ЗаписьXML. Для создания данного объекта используется следующий конструктор:

Данный объект реализует последовательную запись. Это означает, что документ не загружается полностью в память, а также нельзя перепрыгивать на другие узлы внутри XML документа.

Чтобы указать файл, в который будет записан XML нужно вызвать метод ОткрытьФайл. Первым параметром указывается путь к файлу, вторым кодировка (по умолчанию UTF-8), третьим признак использования BOM (по умолчанию Истина):

Чтобы записать в файл строку с объявлением XML нужно вызвать метод ЗаписатьОбъявлениеXML:

Записывать объявление XML нужно перед записью других элементов, иначе будет выброшено исключение «Ошибочный порядок записи XML».

Для записи тегов используются методы ЗаписатьНачалоЭлемента и ЗаписатьКонецЭлемента. В методе ЗаписатьНачалоЭлемента нужно параметром указать имя тега. В методе ЗаписатьКонецЭлемента ничего не указывается, будет записан закрывающий тег последнего открытого тега:

Для записи значения нужно вызвать метод ЗаписатьТекст, передав параметром записываемое значение. Так как значение записывается между открывающим и закрывающим тегами, то его нужно вызывать до метода ЗаписатьКонецЭлемента:

Для записи атрибутов используются методы ЗаписатьНачалоАтрибута и ЗаписатьКонецАтрибута. В метод ЗаписатьНачалоАтрибута нужно параметром передать имя атрибута. Метод ЗаписатьКонецАтрибута закончит запись последнего начатого атрибута. Между двумя этими методами нужно вызвать метод ЗаписатьТекст для записи значения атрибута. Запись атрибутов должна выполняться сразу после вызова метода ЗаписатьНачалоЭлемента, иначе не будет понятно к какому тегу относятся атрибуты:

Также есть метод ЗаписатьАтрибут, которому параметрами нужно передать имя и значение атрибута. Его можно использовать вместо трех методов: ЗаписатьНачалоАтрибута, ЗаписатьТекст и ЗаписатьКонецАтрибута:

Для записи комментария используется метод ЗаписатьКомментарий. Его можно вызвать в любой момент, комментарий не влияет на структура XML-документа:

При записи элементов XML выполняется контроль правильной последовательности вызовов методов. И если последовательность будет нарушено, то будет выброшено исключение «Ошибочный порядок записи XML».

С помощью метода ЗаписатьБезОбработки можно записать в XML-файл произвольное значение без проверки порядка записи. Параметром можно передать произвольную строку, в том числе уже сформированная часть XML-файла:

В этом случае нужно учитывать, что после записи XML-файл может быть не валидным.

После окончания записи нужно вызвать метод Закрыть, который закроет записываемый файл:

Пример записи XML-файла:

В результате будет получен следующий файл:

Запись XML в строку

Если нужно записать XML не в файл, а в строку, например для передачи через веб-сервис, то нужно вместо метода ОткрытьФайл, вызвать метод УстановитьСтроку. Параметром можно указать кодировку.

При вызове метода Закрыть будет получена строка с XML:

Запись пространства имен

Для записи соответствия префикса и пространства имен используется метод ЗаписатьСоответствиеПространстваИмен. Первым параметром указывается префикс, вторым пространство имен:

Чтобы указать принадлежность элемента определенному пространству имен нужно просто указать его префикс в имени элемента:

Пример записи XML файла с пространством имен:

В результате будет получен следующий XML:

Чтение XML

Для чтения XML файла предназначен объект ЧтениеXML. Для создания данного объекта используется следующий конструктор:

Данный объект реализует последовательное чтение. Это означает, что документ не загружается полностью в память, что позволяет читать даже очень большие файлы. А также это означает, что нельзя перепрыгивать на другие узлы внутри XML-документа, чтение выполняется только последовательно.

Алгоритм чтения XML файла выглядит следующим образом:

  1. Создается объект ЧтениеXML
  2. Методом ОткрытьФайл выполняется открытие XML файла. Первым параметром указывается путь к файлу, четвертым кодировка. Если кодировку не указать, то она будет получена из объявления XML. Если в файле нет объявления XML, то будет установлена кодировка UTF-8.
  3. В цикле вызывается метод Прочитать, который читает из файла очередной узел. Если узел был прочитан, то данный метод возвращает Истина.
  4. У каждого узла есть свойства Имя, Значение и ТипУзла. Анализируя свойство ТипУзла можно узнать какая это часть узла: начало элемента, конец элемента, значение, комментарий, атрибут или ничего (чтение еще не начато или уже закончено). А через свойства Имя и Значение можно получить прочитанное значение.
  5. Для чтения атрибутов элемента в цикле вызывается метод ПрочитатьАтрибут.
  6. После окончания цикла вызывается метод Закрыть.

Чтение XML из строки

Чтобы прочитать XML из строки нужно вместо метода ОткрытьФайл вызвать метод УстановитьСтроку, куда параметром передать строку с XML. Все остальное совпадает с чтением из файла.

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

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

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

В результате будет получен следующий XML:

Для реквизитов ссылочных типов в XML был записан идентификатор объекта. Для примитивных типов само значение. Для строк табличных частей использовал тег <Row>.

Сериализовать в XML можно следующие типы:

  • Все примитивные типы данных (Строка, Число, Дата, Булево, Неопределено, Null, Тип)
  • Уникальный идентификатор
  • Двоичные данные
  • Хранилище значения
  • Описание типов
  • Все ссылки, а также сами объекты
  • Ссылки на перечисления
  • Наборы записей регистров, последовательностей, перерасчетов
  • Менеджер значения константы
  • Объект УдалениеОбъекта

В метод ЗаписатьXML третьим параметром можно указать явную запись в XML типа данных:

В этом случае в теге с документом будет указан атрибут type из пространства имен http://www.w3.org/2001/XMLSchema-instance. Значение данного атрибута будет содержать тип сериализованного объекта:

Десериализация XML

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

Метод ПрочитатьXML вернет не записанный объект документа с заполненными реквизитами из XML файла. Для записи нужно явно вызвать метод Записать. Поиск документа в базе выполняется по идентификатору, который был прочитан из тега Ref.

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

Если данные в XML не будут соответствовать структуре указанного типа, то будет выброшено исключение «Ошибка преобразования данных XML».

Для проверки возможности десериализации из XML можно воспользоваться методом ВозможностьЧтенияXML, в который параметром нужно передать ЧтениеXML. Данный метод вернет Истина, если текущий элемент в объекте ЧтениеXML может быть десериализован платформой и Ложь в противном случае:

Данный метод выполняет проверку сначала по атрибуту type, а потом по имени того элемента, который является текущим. В нашем примере это будет элемент DocumentObject.ПриходТовара. Если в конфигурации есть объект с таким же именем (DocumentObject означает что нужно искать документ с именем ПриходТовара), то метод вернет Истина. Но вложенные теги не проверяются и могут не соответствовать структуре реквизитов объекта текущей конфигурации и тогда при десериализации будет получена ошибка разбора XML.

XMLСтрока

Иногда бывает необходимость получить XML представление одного из примитивных типов, например даты. Его можно получить методом XMLСтрока. Параметром нужно передать само значение:

В результате дата будет записана в XML в следующем формате:

Помимо даты метод XMLСтрока может принимать значения следующих типов:

  • Число
  • Строка
  • Дата
  • Булево
  • Любая ссылка
  • Ссылка на перечисление
  • Уникальный идентификатор
  • ХранилищеЗначения и ДвоичныеДанные

XMLЗначение

Для десериализации значений, которые были сериализованы методом XMLСтрока можно воспользоваться методом XMLЗначение. Первым параметром указывается тип, в который нужно десериализовать. Вторым параметром значение в XML:

НайтиНедопустимыеСимволыXML

Метод НайтиНедопустимыеСимволыXML позволяет найти символы, которые нельзя использовать в XML. Первым параметром нужно передать строку, которую нужно проверить. Если в этой строке есть недопустимые символы, то метод вернет порядковый номер этого символа. Иначе вернет 0.

Данный метод удобно использовать перед сериализацией объекта в XML, например проверить наименование всех элементов справочника:


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok