fix(xdto-compile,xdto-validate): не терять конструкции молча; вычитать инструкции

xdto-compile терял свойства без единого слова: на реалистичной чужой схеме
из шести объявленных доезжало одно. Вложенные xs:sequence/xs:choice теперь
уплощаются (модель хранит плоский список), xs:all трактуется как
последовательность, xs:group и xs:attributeGroup раскрываются по ссылке —
и о каждом приближении навык пишет предупреждение. Молчаливая потеря — тот же
класс дефекта, что мы ловим у платформы, лечится так же: сообщением, не отказом.

xdto-validate получил проверки на грабли, найденные при разработке: порядок
элементов верхнего уровня (платформа отвергает пакет, не называя причины),
конфликты объявлений (name+ref, type+вложенный тип, тип без разновидности),
несовпадение рода базового типа, дубли имён свойств.

Новые правила прогнаны по всем 760 пакетам выгрузок: всё, что породила
платформа, валидно по определению, поэтому каждая ошибка там — ошибка правила.
Первый прогон дал 7, и все три класса оказались реальным поведением платформы:
length вместе с minLength/maxLength встречается, два пакета делят один
targetNamespace (Envelope и SOAP_Envelope_1_1 в БП), form="Text" называется
не только __content. Правила понижены до предупреждений либо сняты. Заодно
убран шум: предупреждение о неиспользуемом import срабатывало на четверти
корпуса — теперь только вместе с anyType, где оно и означает проблему.
Итог: 0 ошибок на корпусе, предупреждений 53 вместо 242.

Инструкции переписаны под читателя-исполнителя: убраны детали реализации
и наши мерки, каталог проверок валидатора (его вывод самодостаточен),
локальные пути в примерах заменены нейтральными. Таблица соответствий
XSD и справочник аннотаций вынесены в xdto-compile/xsd-reference.md.

Round-trip 760/760 сохранён, паритет PS/PY сохранён.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-25 21:48:48 +03:00
co-authored by Claude Opus 5
parent d05aef54b4
commit 7ca6dfa6b2
24 changed files with 1156 additions and 132 deletions
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:v8="http://v8.1c.ru/8.1/data/core" version="2.17">
<XDTOPackage uuid="11111111-2222-3333-4444-555555555555">
<Properties>
<Name>badorder</Name>
<Synonym><v8:item><v8:lang>ru</v8:lang><v8:content>badorder</v8:content></v8:item></Synonym>
<Comment/>
<Namespace>urn:test:badorder</Namespace>
</Properties>
</XDTOPackage>
</MetaDataObject>
@@ -0,0 +1,6 @@
<package xmlns="http://v8.1c.ru/8.1/xdto" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="urn:test:badorder">
<objectType name="Документ">
<property name="Поле" type="xs:string"/>
</objectType>
<property xmlns:d2p1="urn:test:badorder" name="Корень" type="d2p1:Документ"/>
</package>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:v8="http://v8.1c.ru/8.1/data/core" version="2.17">
<XDTOPackage uuid="11111111-2222-3333-4444-555555555555">
<Properties>
<Name>conflict</Name>
<Synonym><v8:item><v8:lang>ru</v8:lang><v8:content>conflict</v8:content></v8:item></Synonym>
<Comment/>
<Namespace>urn:test:conflict</Namespace>
</Properties>
</XDTOPackage>
</MetaDataObject>
@@ -0,0 +1,11 @@
<package xmlns="http://v8.1c.ru/8.1/xdto" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="urn:test:conflict">
<valueType name="Простой" base="xs:string"/>
<objectType name="Документ" xmlns:d2p1="urn:test:conflict" base="d2p1:Простой">
<property xmlns:d3p1="urn:test:conflict" name="Поле" ref="d3p1:Поле" type="xs:string"/>
<property name="Дубль" type="xs:string"/>
<property name="Дубль" type="xs:string"/>
<property name="СВложенным" type="xs:string">
<typeDef base="xs:string"/>
</property>
</objectType>
</package>
@@ -8,7 +8,7 @@
"expect": {
"stdoutContains": [
"тихая деградация",
"ни один тип из этого пространства имён не используется"
"признак неразрешённой зависимости"
]
},
"noSnapshot": "навык только читает — сравнивать нечего, проверка через stdoutContains"
@@ -0,0 +1,18 @@
{
"name": "конфликты объявлений: name+ref, дубль свойства, typeDef без xsi:type, база другого рода",
"caseFiles": [
"pkg-conflict/XDTOPackages/conflict.xml",
"pkg-conflict/XDTOPackages/conflict/Ext/Package.bin"
],
"params": { "packagePath": "pkg-conflict/XDTOPackages/conflict" },
"expectError": true,
"expect": {
"stdoutContains": [
"заданы одновременно name и ref",
"дублирующееся имя свойства",
"не задан xsi:type",
"ссылается на valueType"
]
},
"noSnapshot": "навык только читает — проверка через stdoutContains"
}
@@ -0,0 +1,13 @@
{
"name": "нарушен порядок верхнего уровня — платформа отвергнет пакет",
"caseFiles": [
"pkg-badorder/XDTOPackages/badorder.xml",
"pkg-badorder/XDTOPackages/badorder/Ext/Package.bin"
],
"params": { "packagePath": "pkg-badorder/XDTOPackages/badorder" },
"expectError": true,
"expect": {
"stdoutContains": ["Нарушен порядок элементов верхнего уровня"]
},
"noSnapshot": "навык только читает — проверка через stdoutContains"
}