feat(form-decompile): пустой <Presentation/> в choiceList → presentation:"" (суппресс-маркер)

Декомпилятор фиксирует пустой <Presentation/> элемента choiceList как
presentation:"" вместо опускания ключа. Раньше пустота терялась →
компилятор додумывал presentation из значения (Title-FromName для
DesignTimeRef) → LOST <Presentation/> + ADDED непустой <Presentation>.

Паттерн B (суппресс-маркер ""): компилятор УЖЕ обрабатывал presentation:""
корректно (hasPres=true → авто-вывод пропускается; Emit-ChoicePresentation
на "" → пустой <Presentation/>). Правка только в декомпиляторе.

Presentation ушёл из diff на Билеты/КлассификаторПАТСАТУРН/ОстаткиПартийСАТУРН
(подтверждено round-trip). Decompiler-only → регресс через harness.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-07 22:32:25 +03:00
co-authored by Claude Opus 4.8
parent f9ae24a678
commit d0bb26b068
@@ -1,4 +1,4 @@
# form-decompile v0.48 — Decompile 1C managed Form.xml to JSON DSL (draft) # form-decompile v0.49 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param( param(
@@ -1173,7 +1173,12 @@ function Decompile-ChoiceList {
$xsiType = $valNode.GetAttribute("type", $NS_XSI) $xsiType = $valNode.GetAttribute("type", $NS_XSI)
$ci['value'] = Convert-TypedValue $valNode.InnerText $xsiType $ci['value'] = Convert-TypedValue $valNode.InnerText $xsiType
} }
if ($presNode) { $p = Get-LangText $presNode; if ($p) { $ci['presentation'] = $p } } # Presentation: непустой → текст/мультиязык; пустой <Presentation/> → "" — суппресс-маркер,
# подавляет авто-вывод компилятора (иначе компилятор додумает presentation из значения).
if ($presNode) {
$p = Get-LangText $presNode
if ($null -ne $p -and $p -ne '') { $ci['presentation'] = $p } else { $ci['presentation'] = '' }
}
[void]$items.Add($ci) [void]$items.Add($ci)
} }
if ($items.Count -gt 0) { return ,@($items) } if ($items.Count -gt 0) { return ,@($items) }