Разработка и Конфигурация · 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.ТабличнаяЧасть Цикл
Сообщить(Строка.Наименование);
КонецЦикла;
Если схема меняется редко и контракт стабилен, этот способ предпочтителен: платформа сама контролирует типы, а код остаётся читаемым.
- 1Создайте XDTO-пакет в ветке «Общие» конфигуратора
- 2Через диалог импорта укажите XSD-файл схемы
- 3Проверьте URI пространства имён пакета
- 4Импортируйте зависимые схемы из xs:import
- 5Обновите конфигурацию базы данных
- 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, лишний элемент, не описанный в схеме.
Как проверить результат
Объект 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Список), даже если в конкретном файле пришёл один элемент. Обращайтесь к таким свойствам через ПолучитьСписок() или проверяйте тип перед обходом.
Частые вопросы
Можно ли прочитать 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 и множественные элементы, а чтение всегда оборачивайте в Попытка/Исключение.