Как исправить ошибку 'Атомарная модель содержания не соответствует определению типа значения' при создании фабрики XDTO в 1С?

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

Когда мы работаем с интеграциями в 1С, часто возникает необходимость обмениваться данными в формате XML. Для этого в 1С используется механизм XDTO, который позволяет создавать объекты на основе XSD-схем, а затем сериализовать их в XML и десериализовать из XML. Однако процесс создания фабрики XDTO может быть сопряжен с определенными сложностями, особенно когда дело доходит до валидации XSD-схемы платформой 1С. В данной статье мы подробно рассмотрим одну из распространенных ошибок при вызове функции СоздатьФабрикуXDTO() и предложим эффективное решение.

Представим ситуацию: вы пытаетесь выполнить строку кода ФабрикаБЭБ = СоздатьФабрикуXDTO(ИмяФайлаСхемы);, но вместо успешного создания фабрики получаете следующее сообщение об ошибке:


Ошибка проверки модели XDTO: xdto-valueType-6.1    тип: contract_et_NSD    пакет: VTBC.IM.RDC.Types
Атомарная модель содержания не соответствует определению типа значения

Эта ошибка указывает на то, что платформа 1С не может корректно интерпретировать или проверить структуру вашей XSD-схемы, а именно, тип contract_et_NSD в пакете VTBC.IM.RDC.Types. Давайте разберемся, что именно вызывает эту проблему и как ее устранить.

Анализ структуры XSD-схемы и причины ошибки

Для начала, давайте внимательно рассмотрим фрагменты XSD-схемы, которые, судя по сообщению об ошибке, являются проблемными. В нашем случае, ошибка возникает при проверке типа contract_et_NSD. Этот тип используется внутри сложного типа document_t и определен как простой тип с перечислением.

Определение сложного типа (complexType) "document_t"

Мы видим, что document_t содержит несколько элементов, среди которых ndc_code ссылается на тип contract_et_NSD:


<xsd:complexType name="document_t">
    <xsd:sequence>
        <xsd:element name="ndc_code" type="contract_et_NSD" minOccurs="1" maxOccurs="1">
            <xsd:annotation>
                <xsd:documentation>код НРД</xsd:documentation>
            </xsd:annotation>
        </xsd:element>
        <xsd:element name="partad_code" type="contract_et_PARTAD" minOccurs="1" maxOccurs="1">
            <xsd:annotation>
                <xsd:documentation>код ПАРТАД</xsd:documentation>
            </xsd:annotation>
        </xsd:element>
        <xsd:element name="doc_name" type="string128" minOccurs="0" maxOccurs="1">
            <xsd:annotation>
                <xsd:documentation>наименование документа</xsd:documentation>
            </xsd:annotation>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

Определение простого типа (simpleType) "contract_et_NSD"

Тип contract_et_NSD является перечислением и основан на другом простом типе – text_t:


<xsd:simpleType name="contract_et_NSD">
    <xsd:annotation>
        <xsd:documentation>код НРД вида договора / иного основания</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="text_t">
        <xsd:enumeration value="AGTC">
            <xsd:annotation>
                <xsd:documentation>агентский договор</xsd:documentation>
            </xsd:annotation>
        </xsd:enumeration>
        <!-- ... другие значения перечисления ... -->
        <xsd:enumeration value="TRSA">
            <xsd:annotation>
                <xsd:documentation>договор доверительного управления</xsd:documentation>
            </xsd:annotation>
        </xsd:enumeration>
    </xsd:restriction>
</xsd:simpleType>

Определение простого типа (simpleType) "text_t"

А тип text_t, в свою очередь, представляет собой строку с минимальной длиной в один символ:


<xsd:simpleType name="text_t">
    <xsd:annotation>
        <xsd:documentation>произвольная строка текста</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
        <xsd:minLength value="1" />
    </xsd:restriction>
</xsd:simpleType>

На первый взгляд, все определения типов выглядят вполне корректно с точки зрения стандарта XSD. Однако ошибка "Атомарная модель содержания не соответствует определению типа значения" (xdto-valueType-6.1) часто указывает на специфику работы XDTO-движка 1С с пространствами имен.

Ключевая проблема: атрибут targetNamespace

Давайте посмотрим на заголовок вашей XSD-схемы, который был представлен:


<?xml version="1.0" encoding="windows-1251"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema" targetNamespace="VTBC.IM.RDC.Types">

Здесь присутствует атрибут targetNamespace="VTBC.IM.RDC.Types". Атрибут targetNamespace определяет пространство имен, к которому принадлежат все компоненты схемы (элементы, атрибуты, типы), если они не имеют явного префикса. Когда targetNamespace указан, 1С ожидает, что типы, определенные в этой схеме, будут принадлежать этому пространству имен.

В определенных сценариях, особенно при работе с простыми типами, которые являются перечислениями или расширениями базовых типов, и их использовании внутри сложных типов, XDTO-фабрика 1С может быть чувствительна к наличию или отсутствию targetNamespace. Возможно, в данном конкретном контексте или из-за особенностей внутренних механизмов XDTO-валидации 1С, явное указание targetNamespace привело к конфликту или неправильной интерпретации "атомарной модели содержания" для типа contract_et_NSD.

Например, 1С могла ожидать, что типы из этой схемы будут относиться к "пустому" или "безымянному" пространству имен, если они используются без явных префиксов в других схемах или в самом процессе обработки. Когда мы объявляем targetNamespace, все наши типы (document_t, contract_et_NSD, text_t) становятся частью этого пространства имен. Если клиентская сторона или другие части модели XDTO не ожидают такого квалифицированного пространства имен для этих конкретных типов, может возникнуть ошибка валидации.

Решение проблемы: Удаление targetNamespace

Как показал опыт на форуме, эффективным решением этой проблемы стало удаление атрибута targetNamespace из корневого элемента <xsd:schema> вашей XSD-схемы. После этого заголовок схемы будет выглядеть следующим образом:


<?xml version="1.0" encoding="windows-1251"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema">

Почему это работает?

Удаление targetNamespace изменяет поведение схемы таким образом, что все определенные в ней типы становятся частью "no namespace" или "безымянного" пространства имен. Это часто требуется, когда схема предназначена для определения глобальных элементов и атрибутов, которые должны использоваться без префикса, или когда она включается в другую схему, которая определяет собственное пространство имен. Вероятно, платформа 1С в этом конкретном случае ожидала именно такую схему, или же устранение явного targetNamespace позволило избежать внутреннего конфликта при построении XDTO-модели для простых типов с перечислениями.

Пошаговая инструкция по исправлению

Если вы столкнулись с аналогичной ошибкой, предлагаем вам выполнить следующие шаги:

  1. Найдите вашу XSD-схему: Определите физический файл схемы, который вы передаете в функцию СоздатьФабрикуXDTO().
  2. Откройте XSD-файл в текстовом редакторе: Используйте любой удобный редактор (например, Notepad++, VS Code, XMLSpy) для открытия файла.
  3. Найдите корневой элемент <xsd:schema>: Обычно он находится в начале файла.
  4. Удалите атрибут targetNamespace: Аккуратно удалите весь атрибут, включая его значение. Например, если у вас было:
    
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema" targetNamespace="VTBC.IM.RDC.Types">
    
    Вам нужно изменить его на:
    
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema">
    
  5. Сохраните изменения: Убедитесь, что файл сохранен с внесенными изменениями.
  6. Повторите попытку создания фабрики XDTO: Запустите ваш код в 1С еще раз.

В большинстве случаев, это простое изменение помогает успешно создать фабрику XDTO и продолжить работу с вашими XML-данными.

Дополнительные рекомендации и советы

Хотя удаление targetNamespace решило проблему в данном конкретном случае, при работе с XDTO и XSD-схемами в 1С полезно учитывать несколько общих рекомендаций, которые могут предотвратить подобные ошибки или помочь в их диагностике:

  1. Валидация XSD сторонними инструментами: Перед загрузкой схемы в 1С, всегда полезно проверить ее сторонними инструментами валидации XSD (например, Altova XMLSpy, Liquid Studio, онлайн-валидаторы). Если схема валидна для этих инструментов, но не для 1С, это может указывать на специфику реализации XDTO в 1С.
  2. Обновление платформы 1С: В некоторых случаях, ошибки проверки XDTO-модели, включая xdto-valueType-6.1, могут быть вызваны использованием устаревшей версии технологической платформы 1С. Разработчики 1С регулярно выпускают обновления, которые исправляют ошибки и улучшают совместимость. Обновление платформы до актуального релиза может решить проблему.
  3. Проверка ссылок на типы и их пространства имен: Убедитесь, что все типы, на которые ссылаются элементы в вашем complexType (например, contract_et_NSD), корректно определены в той же схеме или в импортируемых схемах. Внимательно проверяйте, как используются префиксы пространств имен (например, xsd:string, tns:MyType), и соответствуют ли они объявленным пространствам имен.
  4. Особенности импорта схем (xs:import): Механизм XDTO в 1С может иметь свои особенности при работе с конструкцией xs:import для импорта типов из других пространств имен или схем. Если ваша основная схема импортирует другие схемы, убедитесь, что все пути к файлам корректны и что 1С может разрешить эти импортируемые схемы. Иногда проблемы возникают из-за того, что 1С не удается найти или обработать импортируемую схему.
  5. Тестирование с минимальной схемой: Если у вас очень большая и сложная XSD-схема, попробуйте создать минимальную схему, которая включает только те типы, которые вызывают ошибку (как в нашем случае, document_t, contract_et_NSD, text_t), и протестируйте ее. Это поможет изолировать проблему и определить, какие именно части схемы вызывают сбой.
  6. Понимание XDTO-модели 1С: Помните, что XDTO в 1С строит свою внутреннюю модель на основе XSD-схем. Ошибки типа "Атомарная модель содержания не соответствует определению типа значения" часто означают, что внутренняя модель 1С, построенная на основе вашей схемы, не соответствует ее собственным правилам или ожиданиям для данной структуры.

Заключение

Ошибка "Атомарная модель содержания не соответствует определению типа значения" (xdto-valueType-6.1) при создании фабрики XDTO в 1С, хоть и выглядит довольно абстрактно, часто имеет конкретную причину, связанную с некорректным использованием пространств имен в XSD-схеме. Как мы выяснили, в нашем случае решение заключалось в простом удалении атрибута targetNamespace из корневого элемента <xsd:schema>. Надеемся, что этот подробный разбор и предложенные шаги помогут вам быстро и эффективно решить подобную проблему в вашей разработке на 1С.

← На главную