К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как прочитать XSD-схему в 1С: практическое руководство

Разбираем, как прочитать XSD-схему в 1С: XDTO-пакеты, объект ЧтениеXML, фабрика XDTO, примеры кода, проверка результата и типичные ошибки при обмене данными.

XSD-схема (XML Schema Definition) описывает структуру XML-документа: какие элементы в нём допустимы, какого они типа, какие атрибуты обязательны и как элементы вкладываются друг в друга. В 1С:Предприятии работа с XSD-схемами встроена в платформу через механизм XDTO (XML Data Transfer Objects) — именно он позволяет импортировать схему, проверить по ней XML-файл и типизированно прочитать данные.

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

Прежде чем писать код, определите задачу: если вам нужно обмениваться данными с внешней системой по готовой схеме (ФНС, банки, EDI-провайдеры), используйте XDTO-пакеты. Если нужно разобрать саму схему как данные — читайте XSD обычным объектом ЧтениеXML или через DOM-модель.

Что такое XSD-схема и как она устроена

XSD-файл — это обычный XML-документ с корневым элементом xs:schema. Внутри него описываются элементы (xs:element), сложные типы (xs:complexType), простые типы (xs:simpleType), атрибуты (xs:attribute) и ограничения: минимальная и максимальная длина строки, шаблон (pattern), перечисление допустимых значений (enumeration), обязательность (minOccurs/maxOccurs).

Ключевые конструкции, которые нужно уметь распознавать при чтении схемы:

  • xs:element name="..." type="..." — объявление элемента и ссылка на его тип;
  • xs:complexType с вложенным xs:sequence — составной объект с упорядоченными полями;
  • xs:simpleType с xs:restriction base="xs:string" — строка с ограничениями;
  • targetNamespace — пространство имён схемы, критично для сопоставления при импорте в XDTO;
  • xs:import и xs:include — подключение других схем, из-за чего одна схема может состоять из нескольких файлов.

Способ 1: импорт схемы в пакет XDTO конфигурации

Штатный путь для постоянного обмена — добавить схему в конфигурацию. В конфигураторе откройте ветку «Общие» → «XDTO-пакеты», создайте новый пакет, затем в его свойствах нажмите кнопку импорта схемы (иконка со стрелкой/диалог «Импорт XML-схемы») и укажите XSD-файл. Платформа разберёт схему и создаст в пакете типы объектов и типы значений.

После импорта проверьте свойство «URI пространства имен» пакета — оно должно совпадать с targetNamespace схемы. Если схема ссылается на другие XSD через xs:import, импортируйте зависимые схемы тоже, иначе получите ошибки о неразрешённых типах при обновлении конфигурации или при чтении данных.

Чтение XML-файла по импортированной схеме выполняется через глобальную фабрику XDTO:

Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл("C:\Обмен\document.xml");

ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);

Чтение.Закрыть();

// Доступ к данным — типизированный, по именам из схемы

НомерДокумента = ОбъектXDTO.Номер;

Для Каждого Строка Из ОбъектXDTO.ТабличнаяЧасть Цикл

Сообщить(Строка.Наименование);

КонецЦикла;

Если схема меняется редко и контракт стабилен, этот способ предпочтителен: платформа сама контролирует типы, а код остаётся читаемым.

Импорт XSD в пакет XDTO
  1. 1
    Создайте XDTO-пакет в ветке «Общие» конфигуратора
  2. 2
    Через диалог импорта укажите XSD-файл схемы
  3. 3
    Проверьте URI пространства имён пакета
  4. 4
    Импортируйте зависимые схемы из xs:import
  5. 5
    Обновите конфигурацию базы данных
  6. 6
    Прочитайте тестовый XML через ФабрикаXDTO.ПрочитатьXML

Способ 2: чтение XSD программно без изменения конфигурации

Когда менять конфигурацию нельзя (расширение, внешняя обработка, разовая загрузка), схему можно загрузить в фабрику XDTO программно. Для этого используется объект ЧтениеXML и метод создания фабрики из схемы:

ЧтениеСхемы = Новый ЧтениеXML;

ЧтениеСхемы.ОткрытьФайл("C:\Обмен\schema.xsd");

Построитель = Новый ПостроительDOM;

ДокументDOM = Построитель.Прочитать(ЧтениеСхемы);

ЧтениеСхемы.Закрыть();

ПостроительСхем = Новый ПостроительСхемXML;

Схема = ПостроительСхем.СоздатьСхемуXML(ДокументDOM);

НаборСхем = Новый НаборСхемXML;

НаборСхем.Добавить(Схема);

МояФабрика = Новый ФабрикаXDTO(НаборСхем);

ЧтениеДанных = Новый ЧтениеXML;

ЧтениеДанных.ОткрытьФайл("C:\Обмен\document.xml");

ОбъектXDTO = МояФабрика.ПрочитатьXML(ЧтениеДанных);

ЧтениеДанных.Закрыть();

Такой подход позволяет хранить XSD в справочнике или макете и подгружать её в рантайме. Ограничение: если схема импортирует другие файлы, их тоже нужно добавить в набор схем, причём с корректными URI пространств имён.

Способ 3: разбор самой XSD как XML-документа

Если задача — извлечь из схемы метаданные (список полей, типы, обязательность), читайте XSD как обычный XML. Проще всего это сделать через DOM:

Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл("C:\Обмен\schema.xsd");

Построитель = Новый ПостроительDOM;

Документ = Построитель.Прочитать(Чтение);

Чтение.Закрыть();

Корень = Документ.ЭлементДокумента;

ПространствоИмен = Корень.ПолучитьАтрибут("targetNamespace");

// Найдём все объявления элементов

Узлы = Документ.ПолучитьЭлементыПоИмени(

"http://www.w3.org/2001/XMLSchema", "element");

Для Каждого Узел Из Узлы Цикл

ИмяЭлемента = Узел.ПолучитьАтрибут("name");

ТипЭлемента = Узел.ПолучитьАтрибут("type");

Обязательный = (Узел.ПолучитьАтрибут("minOccurs") <> "0");

Сообщить(ИмяЭлемента + " : " + ТипЭлемента);

КонецЦикла;

Обратите внимание: метод ПолучитьЭлементыПоИмени с двумя параметрами ищет по пространству имён и локальному имени, что надёжнее, чем поиск по строке «xs:element» — префикс пространства имён XML Schema в конкретном файле может отличаться (xsd, xs, xsc и т.д.).

Для потокового разбора очень больших схем вместо DOM используйте последовательное чтение через ЧтениеXML с проверкой ТипУзлаXML.НачалоЭлемента — это не загружает весь документ в память.

Сопоставление типов XSD и типов 1С

При чтении данных через XDTO платформа автоматически сопоставляет XML-типы типам 1С. Понимание этого соответствия помогает правильно обрабатывать прочитанные значения:

Тип XSDТип в 1СОсобенности
xs:stringСтрокаОграничения maxLength не проверяются автоматически при присваивании
xs:decimal, xs:doubleЧислоРазделитель в XML — точка, независимо от региональных настроек
xs:date, xs:dateTimeДатаФормат ISO 8601; время без часового пояса трактуется как локальное
xs:booleanБулевоДопустимы значения true/false и 1/0
xs:base64BinaryДвоичныеДанныеУдобно для передачи файлов внутри XML
перечисление (enumeration)СтрокаСписок допустимых значений хранится в свойствах типа XDTO

Если элемент в схеме объявлен с nillable="true, в данных он может прийти с атрибутом xsi:nil="true" — в этом случае значение свойства объекта XDTO будет Неопределено, а не пустая строка. Проверяйте это перед использованием значения в сравнениях и запросах.

Проверка XML по схеме и обработка ошибок

Фабрика XDTO при чтении сама контролирует соответствие данных схеме, но для явной валидации используйте метод Проверить объекта XDTO или чтение с последующей проверкой. Типичный защитный шаблон:

Попытка

ОбъектXDTO = МояФабрика.ПрочитатьXML(ЧтениеДанных);

ОбъектXDTO.Проверить();

Исключение

ТекстОшибки = ОписаниеОшибки();

ЗаписьЖурналаРегистрации("Обмен XML",

УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);

ВызватьИсключение "Файл не соответствует схеме: " + ТекстОшибки;

КонецПопытки;

Текст ошибки валидации обычно содержит путь к проблемному элементу и ожидаемый тип — этого достаточно, чтобы локализовать несоответствие. Частые причины отказа: несовпадение пространства имён в XML и схеме, нарушение порядка элементов в xs:sequence, дата не в формате ISO, лишний элемент, не описанный в схеме.

Контрольные точки

Как проверить результат

Чтение XML прошло без исключения
Норма

Объект XDTO создан, свойства доступны по именам из схемы

Тревожный признак

Ошибка о неизвестном типе или несовпадении пространства имён

Обязательные поля заполнены
Норма

Метод Проверить() объекта XDTO не выбрасывает исключение

Тревожный признак

Сообщение о нарушении ограничения minOccurs или типа значения

Даты и числа интерпретированы верно
Норма

Дата соответствует исходному XML, числа без потери разрядов

Тревожный признак

Сдвиг даты на часовой пояс или обрезание дробной части

Типичные ошибки и ограничения

Самая распространённая проблема — несовпадение пространств имён. Если в XML-документе элементы объявлены в пространстве «http://example.org/doc», а пакет XDTO импортирован с другим URI, фабрика не сможет сопоставить типы. Сверяйте targetNamespace схемы, атрибут xmlns корневого элемента XML и URI пакета.

Вторая группа ошибок связана с составными схемами: xs:import и xs:include требуют загрузки всех связанных файлов, причём xs:include работает только внутри одного пространства имён, а xs:import — между разными. При программном построении набора схем добавляйте файлы в правильном порядке.

Третья ловушка — необязательные и множественные элементы. Если maxOccurs="unbounded", свойство объекта XDTO будет списком (XDTOСписок), даже если в конкретном файле пришёл один элемент. Обращайтесь к таким свойствам через ПолучитьСписок() или проверяйте тип перед обходом.

Типичные ошибки
01
Поиск элементов по строке «xs:element» вместо поиска по URI пространства имён — код ломается при смене префикса в схеме
02
Игнорирование зависимых XSD из xs:import — ошибки о неразрешённых типах при чтении данных
03
Обращение к множественному элементу как к одиночному — исключение или потеря всех строк, кроме первой
04
Создание фабрики XDTO из схемы на каждую итерацию цикла — заметная деградация производительности
05
Отсутствие обработки xsi:nil — значение Неопределено попадает в запрос или сравнение и даёт неочевидную ошибку

Частые вопросы

Можно ли прочитать XSD-схему без конфигуратора, только кодом?

Да. Загрузите файл через ЧтениеXML и ПостроительDOM, постройте из него схему XML объектом ПостроительСхемXML, добавьте в НаборСхемXML и создайте собственную ФабрикаXDTO. Всё это выполняется кодом встроенного языка, в том числе из внешней обработки или расширения.

Чем чтение через XDTO отличается от чтения через ЧтениеXML?

ЧтениеXML — потоковый разбор «как есть»: вы сами обходите узлы и приводите значения к типам. XDTO даёт типизированный объект по контракту схемы: платформа проверяет структуру, типы и обязательность, а вы обращаетесь к данным по именам свойств. Для разового простого файла достаточно ЧтениеXML, для регулярного обмена по контракту — XDTO.

Почему ФабрикаXDTO.ПрочитатьXML выдаёт ошибку «Неизвестный тип»?

Почти всегда причина в несовпадении пространства имён: URI в XML-документе не совпадает с URI пакета XDTO или схемы, либо не загружена зависимая схема из xs:import. Сверьте targetNamespace схемы, xmlns корневого элемента XML и пространство имён пакета.

Как узнать список всех полей, описанных в схеме, программно?

Разберите XSD через ПостроительDOM и найдите узлы element в пространстве имён «http://www.w3.org/2001/XMLSchema». У каждого узла атрибуты name, type, minOccurs и maxOccurs дадут имя поля, тип и кардинальность. Для сложных типов рекурсивно обходите вложенные xs:complexType.

Что делать, если элемент приходит с xsi:nil="true"?

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

Подходит ли этот подход для схем ФНС и форматов электронных документов?

Да, официальные XSD-схемы фискальных и отчётных форматов импортируются в XDTO-пакеты так же, как любые другие. Учитывайте только, что такие схемы часто состоят из нескольких связанных файлов и периодически обновляются — при смене версии формата пакет нужно переимпортировать и проверить код обмена.

Итог

Что важно запомнить

Для обмена по контракту импортируйте XSD в пакет XDTO или стройте фабрику программно через НаборСхемXML; для разбора самой схемы читайте её как XML через ПостроительDOM с поиском по пространству имён. Контролируйте совпадение URI пространств имён, обрабатывайте xsi:nil и множественные элементы, а чтение всегда оборачивайте в Попытка/Исключение.