fix(form-decompile): не терять заголовок-пробел у параметра динамического списка

Ветка параметра читала заголовок обычным Get-LangText, который схлопывает whitespace-only
в пустую строку; ветка реквизита давно читает его через Get-LangTextWS. Заголовок-пробел —
им гасят подпись — превращался в "" , а компилятор трактует пустую строку как отсутствие
ключа и подставляет авто-вывод из имени: " " молча становилось «Организации ВЕТИС».
Тот же класс, что и потерянный регистр, соседняя ветка той же функции.

В корпусе (13891 узел dcssch:title в четырёх типовых) платформа не пишет ни пустой,
ни whitespace-only заголовок, поэтому на разборе чужих выгрузок правка ничего не меняет —
она чинит наш собственный раундтрип compile → decompile → compile.

Кейс dl-parameter-title-case расширен вторым параметром с заголовком-пробелом; на исходной
версии падает в обоих портах. Снэпшоты приняты платформой (verify-snapshots, 3/3).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SSyRNwSiuAAEQCLSCUGEzQ
This commit is contained in:
Nick Shirokov
2026-09-22 20:42:20 +03:00
co-authored by Claude Opus 5
parent df47d4d34f
commit 9d07b2e20f
5 changed files with 34 additions and 10 deletions
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-decompile v0.151 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.152 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
#
@@ -1677,7 +1677,9 @@ def build_dl_parameter(p_node):
# title — опускаем, если совпадает с авто-выводом из имени (ru-only)
title_node = p_node.find('dcssch:title', NS)
if title_node is not None:
t = get_lang_text(title_node)
# get_lang_text_ws, а не get_lang_text: заголовком-пробелом гасят подпись, а обычное
# чтение схлопывает whitespace-only в '' — и компилятор подставил бы авто-вывод.
t = get_lang_text_ws(title_node)
if t is not None:
# Сравнение байт в байт (в ps1 — [string]::Equals(..., Ordinal)): эталон — компилятор,
# он пишет заголовок как есть. Регистронезависимое сравнение теряло заголовок,