feat(form-decompile,form-compile): userSettingPresentation контейнера ListSettings (filter/order/CA)

Контейнер настроек компоновщика (<dcsset:filter>/<order>/<conditionalAppearance>)
может нести собственный <dcsset:userSettingPresentation> — кастомную подпись
пользовательской настройки (после userSettingID). Декомпилятор кодировал контейнер
только как блок-мету "vu"/"u"/"v" (viewMode/userSettingID), теряя presentation;
компилятор не эмитил.

Дескриптор listSettings[tag] теперь — строка-код "vu" ИЛИ объект
{ meta:"vu", presentation:<текст/{ru,en}> }. Декомпилятор: Get-PresByType сохраняет
форму по xsi:type (ru-only LocalString ≠ xs:string). Компилятор: новый параметр
blockUserSettingPresentation в Emit-Filter/Order/ConditionalAppearance (+ в гейт
hasBlockMeta — иначе контейнер только-с-presentation, без items/viewMode/userSettingID,
не эмитился). Зеркало py.

Корпус 8.3.24: 6 контейнеров-presentation в 6 формах. Выборка 6 форм
(ОтветственныеЗаАктуализацию/ЗаПодписание acc+erp, ПравилаФормированияРезервов,
СтавкиНДСНоменклатуры): match 0→6, TOTAL→0. ps1==py байт-в-байт. Регресс 43/43.
Spec обновлён. Cert: раундтрип (формат платформы, позиция как в оригинале).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-13 13:03:16 +03:00
co-authored by Claude Opus 4.8
parent 9af86b7810
commit 668173121d
4 changed files with 6344 additions and 6318 deletions
@@ -1,4 +1,4 @@
# form-decompile v0.126 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.127 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -134,7 +134,14 @@ function Get-ListSettingsShape {
if ($tag -in @('filter','order','conditionalAppearance')) {
$hasVM = $null -ne $child.SelectSingleNode("dcsset:viewMode", $ns)
$hasUS = $null -ne $child.SelectSingleNode("dcsset:userSettingID", $ns)
$shape[$tag] = "$(if ($hasVM) {'v'})$(if ($hasUS) {'u'})"
$code = "$(if ($hasVM) {'v'})$(if ($hasUS) {'u'})"
# Контейнер может нести собственный <dcsset:userSettingPresentation> (кастомная подпись
# настройки) — сохраняем форму по xsi:type (Get-PresByType: ru-only LocalString ≠ xs:string).
$uspNode = $child.SelectSingleNode("dcsset:userSettingPresentation", $ns)
if ($uspNode) {
$usp = Get-PresByType $uspNode
$shape[$tag] = [ordered]@{ meta = $code; presentation = $usp }
} else { $shape[$tag] = $code }
} elseif ($tag -eq 'itemsViewMode') { $shape['itemsViewMode'] = $true }
elseif ($tag -eq 'itemsUserSettingID') { $shape['itemsUserSettingID'] = $true }
elseif ($tag -eq 'item') { if ($hasGrouping) { $shape['structure'] = $true } else { return $null } }