При интеграции систем 1С с сервисами Федеральной налоговой службы (ФНС) разработчики часто сталкиваются с необходимостью импорта официальных XSD-схем. Однако попытка загрузить схему, скачанную с сайта nalog.ru, в дерево конфигурации или создать на её основе фабрику XDTO программно часто заканчивается ошибкой: «Ошибка проверки модели XDTO: xdto-valueType-6.1. Атомарная модель содержания не соответствует определению типа значения». Рассмотрим подробнее, почему это происходит и как адаптировать налоговые схемы под требования платформы 1С.
Проанализируем ситуацию: ошибка xdto-valueType-6.1 возникает из-за того, что парсер XDTO в 1С предъявляет очень строгие требования к описанию типов данных. В схемах ФНС часто встречаются элементы, которые объявлены как имеющие простое (атомарное) значение (например, строка или число), но структура их описания внутри XML-схемы кажется 1С избыточной или противоречивой.
Выясним основные причины:
xs:restriction (ограничениях) не указан атрибут base, из-за чего 1С не может понять, на основе чего строится «атомарный» тип.Разберем по шагам методики исправления этих проблем.
Это самая частая причина ошибки при работе со схемами ФНС. В файле XSD обычно объявлено целевое пространство имен targetNamespace. Если при этом для типов текущей схемы назначен префикс (например, xmlns:ns1), но внутри элементов ссылки на типы (такие как ДатаТип, ИННТип, КНДТип) идут без этого префикса, 1С не может сопоставить их.
Рассмотрим, как это исправить. Откроем XSD-файл в текстовом редакторе и найдем заголовок схемы. Проанализируем типичную структуру:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://example.com/schema"
targetNamespace="http://example.com/schema">
Для того чтобы 1С корректно распознала типы без префиксов внутри схемы, нам нужно назначить это же пространство имен как пространство имен по умолчанию. Удалим префикс ns1 и оставим только xmlns. Исправленный заголовок должен выглядеть так:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://example.com/schema"
targetNamespace="http://example.com/schema">
Важно: значение xmlns (без префикса) должно в точности совпадать с targetNamespace. Это заставляет 1С искать все типы, указанные в атрибутах type, «внутри себя», если они не имеют префикса xs:.
Иногда ошибка возникает в элементах типа «Индекс» или «ВерсияПрог». Посмотрим на пример некорректного (с точки зрения 1С) описания типа:
<xs:element name="Индекс">
<xs:simpleType>
<xs:restriction>
<xs:pattern value="\d{6}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
В данном случае в теге xs:restriction пропущено указание, от какого типа мы наследуем ограничение. Платформа 1С требует обязательного наличия атрибута base. Исправим ситуацию, явно указав строковый тип:
<xs:element name="Индекс">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="\d{6}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Проанализируем все вхождения xs:restriction в файле и убедимся, что везде прописан base="xs:string", base="xs:decimal" или другой подходящий стандартный тип xs.
Если схема содержит вспомогательные описания, которые не критичны для формирования структуры XML, но вызывают ошибку валидации, их можно закомментировать. Часто это касается кода формы по КНД или справочных полей.
Пример комментирования блока, вызывающего ошибку:
<!--
<xs:attribute name="КодКНД" type="КНДТип" use="required">
<xs:annotation>
<xs:documentation>Код формы по КНД</xs:documentation>
</xs:annotation>
</xs:attribute>
-->
Однако используйте этот метод с осторожностью: если это поле обязательно для принимающего шлюза налоговой, файл, сформированный по такой «урезанной» схеме, может не пройти форматный контроль на стороне ФНС.
Заметим важную особенность: импорт схемы непосредственно в конфигуратор (объекты XDTO-пакеты) работает гораздо жестче, чем создание фабрики в коде. Если вам нужно просто прочитать или записать файл, попробуйте создать фабрику динамически, минуя дерево конфигурации. Это может позволить «проскочить» некоторые мелкие несоответствия.
Посмотрим на пример кода для динамической загрузки:
ПутьКФайлуСхемы = "C:\Schemas\FNS_Sved.xsd";
Попытка
МояФабрика = СоздатьФабрикуXDTO(ПутьКФайлуСхемы);
Сообщить("Схема успешно загружена в память!");
Исключение
Сообщить("Ошибка при создании фабрики: " + ОписаниеОшибки());
КонецПопытки;
Если даже динамическая фабрика выдает ошибку xdto-valueType-6.1, значит, правка текста XSD (как описано в Способах 1 и 2) неизбежна.
Чтобы не тратить часы на ручной поиск ошибок, рекомендуем придерживаться следующего алгоритма подготовки схем:
xs:documentation в сочетании с неправильной кодировкой (например, ANSI вместо UTF-8) сбивает парсер 1С. Удалите аннотации или перекодируйте файл в UTF-8 (без BOM).xs: или xsd:, и он правильно определен в заголовке (xmlns:xs="http://www.w3.org/2001/XMLSchema").fixed="1.0". Проверьте, чтобы у таких элементов тип был явно указан как xs:string.Резюмируем: Основной секрет успеха при работе с XSD от ФНС в 1С заключается в приведении пространств имен к единому знаменателю (xmlns = targetNamespace) и строгом соблюдении типизации в блоках restriction. Выполнив эти действия, вы сможете использовать всю мощь XDTO-модели для обмена данными с государственными системами.