Когда мы работаем с интеграциями в 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-схемы, которые, судя по сообщению об ошибке, являются проблемными. В нашем случае, ошибка возникает при проверке типа contract_et_NSD. Этот тип используется внутри сложного типа 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>
Тип 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>
А тип 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-модели для простых типов с перечислениями.
Если вы столкнулись с аналогичной ошибкой, предлагаем вам выполнить следующие шаги:
СоздатьФабрикуXDTO().<xsd:schema>: Обычно он находится в начале файла.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">
В большинстве случаев, это простое изменение помогает успешно создать фабрику XDTO и продолжить работу с вашими XML-данными.
Хотя удаление targetNamespace решило проблему в данном конкретном случае, при работе с XDTO и XSD-схемами в 1С полезно учитывать несколько общих рекомендаций, которые могут предотвратить подобные ошибки или помочь в их диагностике:
xdto-valueType-6.1, могут быть вызваны использованием устаревшей версии технологической платформы 1С. Разработчики 1С регулярно выпускают обновления, которые исправляют ошибки и улучшают совместимость. Обновление платформы до актуального релиза может решить проблему.complexType (например, contract_et_NSD), корректно определены в той же схеме или в импортируемых схемах. Внимательно проверяйте, как используются префиксы пространств имен (например, xsd:string, tns:MyType), и соответствуют ли они объявленным пространствам имен.xs:import): Механизм XDTO в 1С может иметь свои особенности при работе с конструкцией xs:import для импорта типов из других пространств имен или схем. Если ваша основная схема импортирует другие схемы, убедитесь, что все пути к файлам корректны и что 1С может разрешить эти импортируемые схемы. Иногда проблемы возникают из-за того, что 1С не удается найти или обработать импортируемую схему.document_t, contract_et_NSD, text_t), и протестируйте ее. Это поможет изолировать проблему и определить, какие именно части схемы вызывают сбой.Ошибка "Атомарная модель содержания не соответствует определению типа значения" (xdto-valueType-6.1) при создании фабрики XDTO в 1С, хоть и выглядит довольно абстрактно, часто имеет конкретную причину, связанную с некорректным использованием пространств имен в XSD-схеме. Как мы выяснили, в нашем случае решение заключалось в простом удалении атрибута targetNamespace из корневого элемента <xsd:schema>. Надеемся, что этот подробный разбор и предложенные шаги помогут вам быстро и эффективно решить подобную проблему в вашей разработке на 1С.