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:StringQualifiers>
</valueType>
<editFormat xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>L=ru_RU</v8:content>
</v8:item>
</editFormat>
<appearance>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Формат</dcscor:parameter>
<dcscor:value xsi:type="v8:LocalStringType">
<v8:item>
<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>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query>
@@ -1,10 +1,13 @@
{
"name": "modify-field сохраняет неизвестные дочерние элементы (editFormat, appearance и т.п.)",
"name": "modify-field сохраняет неизвестные дочерние элементы (<appearance> со всеми вложениями) — структура из ERP",
"setup": "fixture:multilang-base",
"params": {
"templatePath": "Template.xml",
"operation": "modify-field",
"value": "Контрагент @ignoreNullsInGroups"
"value": "Контрагент @dimension"
},
"expect": {
"stdoutContains": "Field \"Контрагент\" modified"
},
"idempotent": true
}
@@ -36,12 +36,21 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<editFormat xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>L=ru_RU</v8:content>
</v8:item>
</editFormat>
<appearance>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Формат</dcscor:parameter>
<dcscor:value xsi:type="v8:LocalStringType">
<v8:item>
<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>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query>
@@ -36,12 +36,21 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<editFormat xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>L=ru_RU</v8:content>
</v8:item>
</editFormat>
<appearance>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Формат</dcscor:parameter>
<dcscor:value xsi:type="v8:LocalStringType">
<v8:item>
<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>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query>
@@ -27,7 +27,7 @@
</v8:item>
</title>
<role>
<dcscom:ignoreNullsInGroups>true</dcscom:ignoreNullsInGroups>
<dcscom:dimension>true</dcscom:dimension>
</role>
<valueType>
<v8:Type>xs:string</v8:Type>
@@ -36,12 +36,21 @@
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</valueType>
<editFormat xsi:type="v8:LocalStringType">
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>L=ru_RU</v8:content>
</v8:item>
</editFormat>
<appearance>
<dcscor:item xsi:type="dcsset:SettingsParameterValue">
<dcscor:parameter>Формат</dcscor:parameter>
<dcscor:value xsi:type="v8:LocalStringType">
<v8:item>
<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>
<dataSource>ИсточникДанных1</dataSource>
<query>ВЫБРАТЬ 1 КАК Контрагент</query>