From 0636ac68774d8a660315249b02d924078eae9552 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 7 Jun 2026 16:46:52 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-decompile):=20=D0=BD=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=BF=D0=BF=D1=8B=20=E2=80=94=20''=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8=20?= =?UTF-8?q?=20(=D0=BA=D0=BB=D0=B0=D1=81=D1=82=D0=B5=D1=80=20UsualGr?= =?UTF-8?q?oup/ColumnGroup>Group)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Декомпилятор при отсутствии подставлял дефолт (vertical у UsualGroup, horizontal у ColumnGroup), и компилятор его эмитил → додумывался там, где в оригинале тега нет (ADDED: ColumnGroup>Group=103, UsualGroup>Group=65). «Опустить дефолт» не подходит: на корпусе Vertical у UsualGroup в двух ролях — явный Vertical (51205, 36%, хранить) и опускаемый дефолт (10%, тега нет). 1C сериализует «Группировку», только если задана в конфигураторе, даже Vertical. По значению неразличимы → нужен отдельный маркер «тега не было». Ключ group/columnGroup — тип-дискриминатор, опустить нельзя. Поэтому нет → значение '' (тип сохраняется, направление не эмитим). Компилятор уже опускает при пустом/нераспознанном значении — правка только в декомпиляторе. spec для group/columnGroup обновлён. TOTAL diff lines выборки 2.17: 1750 → 1582 (−168); match 23 → 31. Co-Authored-By: Claude Opus 4.8 --- .../skills/form-decompile/scripts/form-decompile.ps1 | 11 ++++++++--- docs/form-dsl-spec.md | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 7fed5922..39429da6 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.43 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.44 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -1016,9 +1016,12 @@ function Decompile-Element { switch ($tag) { 'UsualGroup' { # group = направление (); behavior = (Авто = нет тега → ключ опускаем). + # group = направление (). Нет тега → '' (тип-маркер сохраняется, направление + # не эмитим). Платформа явно пишет Vertical в большинстве случаев, поэтому '' ≠ 'vertical' + # — иначе компилятор додумает Vertical там, где его нет. $g = Get-Child $node 'Group' $gmap = @{ 'Horizontal'='horizontal'; 'Vertical'='vertical'; 'AlwaysHorizontal'='alwaysHorizontal'; 'AlwaysVertical'='alwaysVertical' } - if ($g -and $gmap.ContainsKey($g)) { $obj[$key] = $gmap[$g] } else { $obj[$key] = 'vertical' } + if ($g -and $gmap.ContainsKey($g)) { $obj[$key] = $gmap[$g] } else { $obj[$key] = '' } $behavior = Get-Child $node 'Behavior' if ($behavior) { $bmap = @{ 'Usual'='usual'; 'Collapsible'='collapsible'; 'PopUp'='popup' } @@ -1035,9 +1038,11 @@ function Decompile-Element { if ($kids) { $obj['children'] = $kids } } 'ColumnGroup' { + # columnGroup = направление (). Нет тега → '' (тип-маркер сохраняется, направление + # не эмитим). Иначе компилятор додумает Horizontal там, где его нет. $g = Get-Child $node 'Group' $gmap = @{ 'Horizontal'='horizontal'; 'Vertical'='vertical'; 'InCell'='inCell' } - if ($g -and $gmap.ContainsKey($g)) { $obj[$key] = $gmap[$g] } else { $obj[$key] = 'horizontal' } + if ($g -and $gmap.ContainsKey($g)) { $obj[$key] = $gmap[$g] } else { $obj[$key] = '' } $obj['name'] = $name Add-CommonProps $obj $node $name if ((Get-Child $node 'ShowTitle') -eq 'false') { $obj['showTitle'] = $false } diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index 09f11282..2188da73 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -277,7 +277,7 @@ companion-панели с собственным контентом. Оба не | Свойство | Тип | Описание | |----------|-----|----------| -| `group` | string | Ориентация: `horizontal`, `vertical`, `alwaysHorizontal`, `alwaysVertical`. (Legacy: `collapsible` = `vertical` + `behavior:'collapsible'`) | +| `group` | string | Ориентация: `horizontal`, `vertical`, `alwaysHorizontal`, `alwaysVertical`. **`""`** → `` не эмитится (тег отсутствовал в исходнике; платформа сериализует «Группировку», только если она задана в конфигураторе — даже явный `Vertical` хранится, поэтому `""` ≠ `vertical`). Ключ обязателен как тип-маркер группы. (Legacy: `collapsible` = `vertical` + `behavior:'collapsible'`) | | `behavior` | string | Поведение (``): `usual`, `collapsible`, `popup`. **Отсутствие = Авто** (дефолт, не эмитится). Свёртываемая/всплывающая несут доп. свойства | | `collapsed` | bool | Свёрнута (у `collapsible`/`popup`) | | `children` | array | Вложенные элементы | @@ -462,7 +462,7 @@ companion-панели с собственным контентом. Оба не | Свойство | Тип | Описание | |----------|-----|----------| -| `columnGroup` | string | Ориентация: `horizontal`, `vertical`, `inCell` (склейка колонок в одной ячейке шапки) | +| `columnGroup` | string | Ориентация: `horizontal`, `vertical`, `inCell` (склейка колонок в одной ячейке шапки). **`""`** → `` не эмитится (тега не было в исходнике). Ключ обязателен как тип-маркер | | `name` | string | Имя элемента (рекомендуется задавать явно) | | `title` | string/object | Заголовок группы | | `showTitle` | bool | Показывать заголовок |