From 6857ad50603d711bc5c78bdcd839bfd7d43f3e7e Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 5 Jun 2026 16:35:11 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-decompile,form-compile):=20formatted?= =?UTF-8?q?=20=D1=83=20LabelDecoration=20=D0=BD=D0=B5=D0=B7=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B8=D0=BC=20=D0=BE=D1=82=20hyperlink=20(=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=82=D0=B5=D1=80=20formatted)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Компилятор выводил из hyperlink (formatted = hyperlink), но это неверно: атрибут formatted НЕЗАВИСИМ. По корпусу acc+erp: - 9080 label'ов: hyperlink есть, formatted=false (компилятор давал true); - 6545: formatted=true без hyperlink (компилятор давал false). Итого ~15625 расхождений. Введён отдельный ключ formatted (bool, выводится при true): - декомпилятор: захват атрибута <Title formatted> у LabelDecoration (независимо от <Hyperlink>); - компилятор Emit-Label: formatted из ключа, не из hyperlink. Декомпилятор (ps1) + компилятор (ps1+py) + spec (label.formatted). Снэпшот events обновлён: label с hyperlink:true теперь даёт formatted="false" (фиксирует развязку) — сертифицирован в 1С 8.3.24. Регресс ps+py 33/33. Остаток <Title formatted> в раундтрипе принадлежит ExtendedTooltip-с-контентом и PictureDecoration — отдельные кластеры (в BACKLOG). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --- .claude/skills/form-compile/scripts/form-compile.ps1 | 7 ++++--- .claude/skills/form-compile/scripts/form-compile.py | 7 ++++--- .claude/skills/form-decompile/scripts/form-decompile.ps1 | 5 ++++- docs/form-dsl-spec.md | 1 + .../events/DataProcessors/События/Forms/Форма/Ext/Form.xml | 2 +- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 69f8fbbe..80339fa0 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -1,4 +1,4 @@ -# form-compile v1.37 — Compile 1C managed form from JSON or object metadata +# form-compile v1.38 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -1974,7 +1974,7 @@ function Emit-Element { "spinButton"=1;"dropListButton"=1;"markIncomplete"=1;"skipOnInput"=1;"inputHint"=1 "textEdit"=1 # label/hyperlink - "hyperlink"=1 + "hyperlink"=1;"formatted"=1 # group-specific "showTitle"=1;"united"=1;"collapsed"=1 # hierarchy @@ -2527,7 +2527,8 @@ function Emit-Label { $hasTitleKey = $null -ne $el.PSObject.Properties['title'] $labelTitle = if ($hasTitleKey) { $el.title } else { Title-FromName -name $name } if ($labelTitle) { - $formatted = if ($el.hyperlink -eq $true) { "true" } else { "false" } + # formatted — независимое свойство (НЕ выводится из hyperlink): ссылка может быть не-форматированной и наоборот. + $formatted = if ($el.formatted -eq $true) { "true" } else { "false" } X "$inner<Title formatted=`"$formatted`">" Emit-MLItems -val $labelTitle -indent "$inner`t" X "$inner" diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index cdc235dd..a5ab5c1a 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-compile v1.37 — Compile 1C managed form from JSON or object metadata +# form-compile v1.38 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -1367,7 +1367,7 @@ KNOWN_KEYS = { "multiLine", "passwordMode", "choiceButton", "clearButton", "spinButton", "dropListButton", "markIncomplete", "skipOnInput", "inputHint", "textEdit", - "hyperlink", + "hyperlink", "formatted", "showTitle", "united", "collapsed", "children", "columns", "changeRowSet", "changeRowOrder", "header", "footer", @@ -2177,7 +2177,8 @@ def emit_label(lines, el, name, eid, indent): label_title = el['title'] if 'title' in el else title_from_name(name) if label_title: - formatted = 'true' if el.get('hyperlink') is True else 'false' + # formatted — независимое свойство (НЕ выводится из hyperlink). + formatted = 'true' if el.get('formatted') is True else 'false' lines.append(f'{inner}') emit_ml_items(lines, f'{inner}\t', label_title) lines.append(f'{inner}') diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 085578c3..475eb44f 100644 --- a/.claude/skills/form-decompile/scripts/form-decompile.ps1 +++ b/.claude/skills/form-decompile/scripts/form-decompile.ps1 @@ -1,4 +1,4 @@ -# form-decompile v0.17 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.18 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -399,6 +399,9 @@ function Decompile-Element { $obj[$key] = $name Add-CommonProps $obj $node $name if ((Get-Child $node 'Hyperlink') -eq 'true') { $obj['hyperlink'] = $true } + # formatted — атрибут , НЕЗАВИСИМ от hyperlink (true → ключ, false → опускаем) + $tiNode = $node.SelectSingleNode("lf:Title", $ns) + if ($tiNode -and $tiNode.GetAttribute('formatted') -eq 'true') { $obj['formatted'] = $true } } 'LabelField' { $obj[$key] = $name diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index 00ad093a..5edd8de4 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -276,6 +276,7 @@ |----------|-----|----------| | `title` | string | Текст надписи | | `hyperlink` | bool | Режим гиперссылки | +| `formatted` | bool | Форматированный текст (`<Title formatted="true">`). **Независим от `hyperlink`** — выводится только при `true` | | `width` | int | Ширина | | `height` | int | Высота | | `autoMaxWidth` | bool | Автомаксимальная ширина | diff --git a/tests/skills/cases/form-compile/snapshots/events/DataProcessors/События/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/events/DataProcessors/События/Forms/Форма/Ext/Form.xml index 95304b6c..18c07411 100644 --- a/tests/skills/cases/form-compile/snapshots/events/DataProcessors/События/Forms/Форма/Ext/Form.xml +++ b/tests/skills/cases/form-compile/snapshots/events/DataProcessors/События/Forms/Форма/Ext/Form.xml @@ -31,7 +31,7 @@ </Events> </InputField> <LabelDecoration name="Подсказка" id="7"> - <Title formatted="true"> + <Title formatted="false"> <v8:item> <v8:lang>ru</v8:lang> <v8:content>Нажмите для перехода</v8:content>