Почему 1С теряет данные при импорте XDTO-пакета и как это исправить?

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

При работе с механизмами обмена данными в 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

Чтобы решить проблему, нужно явно подсказать парсеру 1С, где найти файл с описанием импортируемого пространства имен. Для этого используется атрибут schemaLocation в теге <xs:import>.

Разберем по шагам, как исправить XSD-файл перед импортом в 1С:

  1. Найдите и сохраните зависимые схемы. В нашем примере нужно найти XSD-схему, которая описывает пространство имен http://www.1c.ru/SSL/Exchange/Message. Обычно это стандартные схемы, которые можно найти в составе типовых конфигураций или в дистрибутивах платформы. Сохраните этот файл локально, например, как F:\Projects\Message.xsd.
  2. Отредактируйте основной XSD-файл. Откройте ваш основной XSD-файл (который вы пытаетесь импортировать) в любом текстовом редакторе.
  3. Найдите директиву <xs:import>. Найдите строку, которая импортирует нужное пространство имен. В нашем случае это: <xs:import namespace="http://www.1c.ru/SSL/Exchange/Message"/>
  4. Добавьте атрибут schemaLocation. Добавьте в этот тег атрибут schemaLocation, указав в нем путь к ранее сохраненному файлу.
    
    <xs:import namespace="http://www.1c.ru/SSL/Exchange/Message" schemaLocation = "F:\Projects\Message.xsd"/>
    

    Важно: не путайте атрибут schemaLocation с изменением самого пространства имен (xmlns:ns1). Пространство имен — это логический идентификатор, его менять не нужно. Атрибут schemaLocation — это физическая подсказка для парсера.

  5. Импортируйте файл в 1С. После сохранения изменений попробуйте снова импортировать основной XSD-файл в XDTO-пакет. Теперь платформа 1С сможет найти и загрузить зависимую схему по локальному пути, корректно распознает базовый тип ns1:Object и правильно построит структуру наследования без потери данных.

Решение 2: Перенос XDTO-пакета через буфер обмена

Если ваша задача — не исправить сторонний XSD-файл, а просто перенести доработки XDTO-пакета из одной конфигурации 1С в другую, есть гораздо более простой и надежный способ, не требующий экспорта в файлы.

Этот метод заключается в прямом копировании объекта метаданных через буфер обмена в режиме конфигуратора. Он гарантирует сохранение всех внутренних связей и зависимостей.

Рассмотрим по шагам:

  1. Откройте исходную конфигурацию (откуда копируем) в режиме «Конфигуратор».
  2. В дереве метаданных найдите ветку Общие -> XDTO-пакеты.
  3. Выделите нужный пакет, нажмите на него правой кнопкой мыши и выберите пункт «Копировать» (или просто нажмите сочетание клавиш Ctrl+C).
  4. Откройте целевую конфигурацию (куда вставляем) в другом окне «Конфигуратора».
  5. В дереве метаданных целевой конфигурации нажмите правой кнопкой мыши на ветку XDTO-пакеты и выберите пункт «Вставить» (или нажмите Ctrl+V).

При таком способе платформа 1С корректно переносит весь объект метаданных со всеми его свойствами и зависимостями, полностью исключая проблемы, связанные с парсингом XML. Этот способ рекомендуется использовать во всех случаях, когда у вас есть одновременный доступ к обеим конфигурациям.

← На главную