Как правильно импортировать XSD-схему в пакет XDTO 1С, чтобы не терялись вложенные свойства?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с интеграциями в 1С:Предприятие программисты часто сталкиваются с ситуацией, когда при импорте внешней XSD-схемы в дерево метаданных (пакет XDTO) часть структуры «теряется» или отображается некорректно. В частности, вложенные свойства элементов могут просто не загрузиться. Разберем подробно, почему это происходит, какие стандарты XSD необходимо соблюдать и как обойти ограничения платформы 1С при работе со сложными схемами.

Анализ структуры XSD и правила вложенности

Первая и самая распространенная причина проблем — нарушение структуры самого XSD-файла. Рассмотрим основные моменты, на которые стоит обратить внимание:

  1. Недопустимость прямого вложения элементов: По стандарту XSD xs:element не может содержать внутри себя другой xs:element напрямую. Если вам нужно описать вложенную структуру, необходимо использовать конструктор xs:complexType. Внутри него уже можно определить последовательность (xs:sequence) или выбор (xs:choice) других элементов.
  2. Использование именованных типов вместо анонимных: Платформа 1С гораздо стабильнее обрабатывает схемы, где типы данных определены отдельно и имеют имена. Проанализируем разницу: вместо того чтобы описывать структуру прямо внутри элемента (анонимный тип), лучше создать complexType на верхнем уровне схемы и сослаться на него через атрибут type.
  3. Правила работы со ссылками (ref): Если в схеме используется атрибут ref, то элемент, на который ссылаются, обязательно должен быть описан на верхнем уровне вложенности (быть прямым потомком корневого тега xs:schema). В противном случае парсер 1С не сможет сопоставить ссылку с определением.

Корректное использование пространств имен (Namespaces)

Для того чтобы 1С корректно распознала пакет XDTO, необходимо правильно настроить пространства имен. Проверим следующие параметры:

TargetNamespace: В XSD-файле обязательно должен быть заполнен атрибут targetNamespace. Если он отсутствует, 1С импортирует схему, но вы не сможете корректно обращаться к типам через ФабрикаXDTO.Тип(). Убедитесь, что URI пространства имен в файле совпадает с тем, что указано в свойствах пакета XDTO в конфигураторе.

Префиксы в ссылках: При использовании ref необходимо указывать префикс локального пространства имен, например: ref="tns:MyElement". Без указания tns: (или другого заданного префикса) система может искать определение в глобальном пространстве имен XML, где его, очевидно, нет.

Ограничения платформы 1С и пути их решения

Разберем технические нюансы работы 1С:Предприятие 8 с XSD, которые важно учитывать при проектировании обмена:

1. Поддержка стандарта XSD 1.0: 1С поддерживает версию 1.0. Если ваша схема использует элементы из XSD 1.1 (например, сложные проверки assert), они будут проигнорированы или вызовут ошибку при импорте. Проанализируем схему на наличие таких элементов перед загрузкой.

2. Проблема атрибутов и элементов: Помните, что в XDTO-пакете свойство может быть либо элементом, либо атрибутом. Атрибуты (xs:attribute) всегда являются простыми типами и не могут иметь вложенности. Если вам нужно передать сложный объект, используйте только xs:element.

3. Порядок следования (sequence vs all): 1С строго следует порядку, заданному в xs:sequence. При программном заполнении объекта ОбъектXDTO через код, важно добавлять свойства именно в том порядке, в котором они описаны в схеме, иначе XML-сериализатор может выдать ошибку или сформировать невалидный файл.

Программное создание фабрики XDTO

Если XSD-схема слишком сложная, содержит много перекрестных ссылок или внешних импортов (xs:import), визуальный конструктор 1С может с ней не справиться. В этом случае рассмотрим альтернативный вариант — динамическое создание фабрики в коде. Это позволяет работать со схемами «на лету», не добавляя их в дерево метаданных.

Для этого воспользуемся следующим методом:


// Путь к файлу схемы на диске
ПутьКСхеме = "C:\Schemas\MyExchange.xsd";
ЧтениеСхемы = Новый ЧтениеXML;
ЧтениеСхемы.ОткрытьФайл(ПутьКСхеме);

// Создаем построитель схем XML
ПостроительСхем = Новый ПостроительСхемXML;
Схема = ПостроительСхем.Прочитать(ЧтениеСхемы);

// Создаем фабрику на основании набора схем
СписокСхем = Новый Массив;
СписокСхем.Добавить(Схема);
МояФабрика = СоздатьФабрикуXDTO(СписокСхем);

Этот способ обходит ограничения визуального редактора и позволяет работать даже с теми схемами, которые конфигуратор считает «неправильными» из-за глубокой вложенности.

Валидация и проверка данных

Для проверки корректности заполнения данных по схеме в 1С предусмотрен встроенный механизм валидации. Выясним, как им пользоваться. После того как объект ОбъектXDTO заполнен, мы можем вызвать метод Проверить():


Попытка
    МойОбъектXDTO.Проверить();
    Сообщить("Объект соответствует схеме XSD");
Исключение
    Сообщить("Ошибка валидации: " + ОписаниеОшибки());
КонецПопытки;

Этот метод выдает подробное описание: какой именно элемент отсутствует или какой тип данных нарушен. Это гораздо эффективнее, чем пытаться найти ошибку в структуре визуально.

Рекомендации по подготовке XSD для 1С

Проанализируем шаги, которые помогут успешно импортировать схему с первого раза:

  1. Объединение файлов (Flat XSD): Если схема ссылается на другие файлы через xs:include или xs:import, 1С может потерять пути. Рекомендуется собрать все зависимости в один файл.
  2. Уход от анонимности: Выносите все xs:complexType на верхний уровень. Дайте им понятные имена. Это сделает дерево XDTO в конфигураторе читаемым.
  3. Проверка внешними инструментами: Перед импортом в 1С проверьте схему в любом онлайн-валидаторе XSD. Если валидатор показывает ошибки в структуре (например, неправильную вложенность), 1С тем более не сможет ее обработать.
  4. Использование строгого порядка: В конструкциях xs:sequence следите за тем, чтобы все обязательные элементы имели minOccurs="1", а необязательные — minOccurs="0".

Соблюдение этих правил позволит вам создавать надежные механизмы обмена данными, которые будут корректно работать даже при обновлении версий платформы или изменении структуры передаваемых сообщений.

← На главную