fix(skd-edit): realistic multilang fixture (ERP-style appearance block)

multilang-base/Template.xml содержал <editFormat xsi:type="v8:LocalStringType">
на <field xsi:type="DataSetFieldField">, что нелегально по XDTO-схеме DCS —
1С Designer падал с "Исключение XDTO" при загрузке через
LoadExternalDataProcessorOrReportFromFiles. Snapshot-тесты этого не ловили
(только byte-equality), а platform-verify (tests/skills/verify-snapshots.mjs)
ронялся на трёх кейсах с этой фикстурой.

Заменил <editFormat> на реалистичный <appearance> блок с вложенным
<dcscor:item xsi:type="dcsset:SettingsParameterValue"> и многоязычным
<dcscor:value> (ru + en) — структура взята из типовой ERP-выгрузки. Это
даёт более правильный test для preserve-unknown-children: <appearance>
содержит вложенный multi-lang xsi:type-узел, который точно прошёл бы
через DOM round-trip с искажениями, если бы _unknownChildren не работал.

preserve-unknown-children-modify-field: shorthand изменён с
"@ignoreNullsInGroups" на "@dimension" (no-op по составу role, но
триггерит rebuild). Прежний @ignoreNullsInGroups без @dimension давал
комбинацию, которую Designer отвергает (ignoreNullsInGroups валиден
только в контексте resource-роли).

39/39 snapshot suite (PS+PY) + 39/39 platform verify через erf-build →
Designer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-19 15:19:13 +03:00
parent 79db5de6ee
commit fb67b1b80d
5 changed files with 66 additions and 27 deletions
@@ -36,12 +36,21 @@
<v8:AllowedLength>Variable</v8:AllowedLength> <v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers> </v8:StringQualifiers>
</valueType> </valueType>
<editFormat xsi:type="v8:LocalStringType"> <appearance>
<v8:item> <dcscor:item xsi:type="dcsset:SettingsParameterValue">
<v8:lang>ru</v8:lang> <dcscor:parameter>Формат</dcscor:parameter>
<v8:content>L=ru_RU</v8:content> <dcscor:value xsi:type="v8:LocalStringType">
</v8:item> <v8:item>
</editFormat> <v8:lang>ru</v8:lang>
<v8:content>ЧДЦ=2</v8:content>
</v8:item>
<v8:item>
<v8:lang>en</v8:lang>
<v8:content>NFD=2</v8:content>
</v8:item>
</dcscor:value>
</dcscor:item>
</appearance>
</field> </field>
<dataSource>ИсточникДанных1</dataSource> <dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query> <query>ВЫБРАТЬ 1 КАК Контрагент</query>
@@ -1,10 +1,13 @@
{ {
"name": "modify-field сохраняет неизвестные дочерние элементы (editFormat, appearance и т.п.)", "name": "modify-field сохраняет неизвестные дочерние элементы (<appearance> со всеми вложениями) — структура из ERP",
"setup": "fixture:multilang-base", "setup": "fixture:multilang-base",
"params": { "params": {
"templatePath": "Template.xml", "templatePath": "Template.xml",
"operation": "modify-field", "operation": "modify-field",
"value": "Контрагент @ignoreNullsInGroups" "value": "Контрагент @dimension"
},
"expect": {
"stdoutContains": "Field \"Контрагент\" modified"
}, },
"idempotent": true "idempotent": true
} }
@@ -36,12 +36,21 @@
<v8:AllowedLength>Variable</v8:AllowedLength> <v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers> </v8:StringQualifiers>
</valueType> </valueType>
<editFormat xsi:type="v8:LocalStringType"> <appearance>
<v8:item> <dcscor:item xsi:type="dcsset:SettingsParameterValue">
<v8:lang>ru</v8:lang> <dcscor:parameter>Формат</dcscor:parameter>
<v8:content>L=ru_RU</v8:content> <dcscor:value xsi:type="v8:LocalStringType">
</v8:item> <v8:item>
</editFormat> <v8:lang>ru</v8:lang>
<v8:content>ЧДЦ=2</v8:content>
</v8:item>
<v8:item>
<v8:lang>en</v8:lang>
<v8:content>NFD=2</v8:content>
</v8:item>
</dcscor:value>
</dcscor:item>
</appearance>
</field> </field>
<dataSource>ИсточникДанных1</dataSource> <dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query> <query>ВЫБРАТЬ 1 КАК Контрагент</query>
@@ -36,12 +36,21 @@
<v8:AllowedLength>Variable</v8:AllowedLength> <v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers> </v8:StringQualifiers>
</valueType> </valueType>
<editFormat xsi:type="v8:LocalStringType"> <appearance>
<v8:item> <dcscor:item xsi:type="dcsset:SettingsParameterValue">
<v8:lang>ru</v8:lang> <dcscor:parameter>Формат</dcscor:parameter>
<v8:content>L=ru_RU</v8:content> <dcscor:value xsi:type="v8:LocalStringType">
</v8:item> <v8:item>
</editFormat> <v8:lang>ru</v8:lang>
<v8:content>ЧДЦ=2</v8:content>
</v8:item>
<v8:item>
<v8:lang>en</v8:lang>
<v8:content>NFD=2</v8:content>
</v8:item>
</dcscor:value>
</dcscor:item>
</appearance>
</field> </field>
<dataSource>ИсточникДанных1</dataSource> <dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query> <query>ВЫБРАТЬ 1 КАК Контрагент</query>
@@ -27,7 +27,7 @@
</v8:item> </v8:item>
</title> </title>
<role> <role>
<dcscom:ignoreNullsInGroups>true</dcscom:ignoreNullsInGroups> <dcscom:dimension>true</dcscom:dimension>
</role> </role>
<valueType> <valueType>
<v8:Type>xs:string</v8:Type> <v8:Type>xs:string</v8:Type>
@@ -36,12 +36,21 @@
<v8:AllowedLength>Variable</v8:AllowedLength> <v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers> </v8:StringQualifiers>
</valueType> </valueType>
<editFormat xsi:type="v8:LocalStringType"> <appearance>
<v8:item> <dcscor:item xsi:type="dcsset:SettingsParameterValue">
<v8:lang>ru</v8:lang> <dcscor:parameter>Формат</dcscor:parameter>
<v8:content>L=ru_RU</v8:content> <dcscor:value xsi:type="v8:LocalStringType">
</v8:item> <v8:item>
</editFormat> <v8:lang>ru</v8:lang>
<v8:content>ЧДЦ=2</v8:content>
</v8:item>
<v8:item>
<v8:lang>en</v8:lang>
<v8:content>NFD=2</v8:content>
</v8:item>
</dcscor:value>
</dcscor:item>
</appearance>
</field> </field>
<dataSource>ИсточникДанных1</dataSource> <dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query> <query>ВЫБРАТЬ 1 КАК Контрагент</query>