При работе с механизмами обмена данными в 1С, особенно при использовании стандартных форматов, таких как EnterpriseData, разработчики часто сталкиваются с проблемой: при экспорте XDTO-пакета в XSD-файл, внесении изменений и последующем импорте обратно в 1С, часть данных теряется. Обычно "пропадают" конструкции, отвечающие за наследование типов, например, теги <xs:complexContent> и <xs:extension>. Это делает невозможным простой перенос доработок между пакетами через файлы.
Рассмотрим, почему это происходит и какие существуют способы решения этой проблемы.
Основная причина потери данных кроется в том, как платформа 1С обрабатывает импортируемые (зависимые) XSD-схемы. Часто одна XSD-схема ссылается на типы, описанные в другой схеме, используя для этого пространства имен.
Проанализируем конкретный пример из обсуждения. При импорте следующего фрагмента XSD-схемы в 1С пропадали отмеченные строки:
<xs:complexType name="Документ.АвизоПоМПЗВходящее">
<xs:complexContent> <!-- вот эти строки теряются -->
<xs:extension base="ns1:Object"> <!-- вот эти строки теряются -->
<xs:sequence>
<xs:element name="КлючевыеСвойства" type="tns:КлючевыеСвойстваАвизоПоМПЗВходящее"/>
<xs:element name="ДанныеВходящегоДокумента" type="tns:ОбщиеСвойстваДанныеВходящегоДокумента" minOccurs="0"/>
<!-- ... другие элементы ... -->
</xs:sequence>
<xs:anyAttribute namespace="##any" processContents="lax"/>
</xs:extension> <!-- вот эти строки теряются -->
</xs:complexContent> <!-- вот эти строки теряются -->
</xs:complexType>
Здесь тип Документ.АвизоПоМПЗВходящее наследуется от базового типа Object, который находится в другом пространстве имен, обозначенном префиксом ns1. В заголовке XSD-файла этот префикс связан с пространством имен через объявление и директиву импорта:
<xs:schema xmlns:ns1="http://www.1c.ru/SSL/Exchange/Message" ... >
<xs:import namespace="http://www.1c.ru/SSL/Exchange/Message"/>
...
</xs:schema>
Проблема в том, что директива <xs:import> сообщает парсеру 1С, что нужно использовать типы из пространства имен http://www.1c.ru/SSL/Exchange/Message, но не указывает, где физически находится файл XSD, описывающий это пространство. Платформа 1С не пытается автоматически загрузить его по веб-адресу. Не найдя описание базового типа ns1:Object, она не может построить структуру наследования и просто игнорирует теги <xs:extension> и <xs:complexContent>, что и приводит к потере данных.
Важно помнить, что механизм XDTO в 1С — это не полная реализация спецификации XSD от W3C, что и приводит к подобному поведению, требующему явных указаний от разработчика.
Чтобы решить проблему, нужно явно подсказать парсеру 1С, где найти файл с описанием импортируемого пространства имен. Для этого используется атрибут schemaLocation в теге <xs:import>.
Разберем по шагам, как исправить XSD-файл перед импортом в 1С:
http://www.1c.ru/SSL/Exchange/Message. Обычно это стандартные схемы, которые можно найти в составе типовых конфигураций или в дистрибутивах платформы. Сохраните этот файл локально, например, как F:\Projects\Message.xsd.<xs:import>. Найдите строку, которая импортирует нужное пространство имен. В нашем случае это:
<xs:import namespace="http://www.1c.ru/SSL/Exchange/Message"/>
schemaLocation. Добавьте в этот тег атрибут schemaLocation, указав в нем путь к ранее сохраненному файлу.
<xs:import namespace="http://www.1c.ru/SSL/Exchange/Message" schemaLocation = "F:\Projects\Message.xsd"/>
Важно: не путайте атрибут schemaLocation с изменением самого пространства имен (xmlns:ns1). Пространство имен — это логический идентификатор, его менять не нужно. Атрибут schemaLocation — это физическая подсказка для парсера.
ns1:Object и правильно построит структуру наследования без потери данных.Если ваша задача — не исправить сторонний XSD-файл, а просто перенести доработки XDTO-пакета из одной конфигурации 1С в другую, есть гораздо более простой и надежный способ, не требующий экспорта в файлы.
Этот метод заключается в прямом копировании объекта метаданных через буфер обмена в режиме конфигуратора. Он гарантирует сохранение всех внутренних связей и зависимостей.
Рассмотрим по шагам:
Общие -> XDTO-пакеты.Ctrl+C).XDTO-пакеты и выберите пункт «Вставить» (или нажмите Ctrl+V).При таком способе платформа 1С корректно переносит весь объект метаданных со всеми его свойствами и зависимостями, полностью исключая проблемы, связанные с парсингом XML. Этот способ рекомендуется использовать во всех случаях, когда у вас есть одновременный доступ к обеим конфигурациям.