From 670a5742496a76b994dc7a86739dc33e94f27bfc Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 13 Jun 2026 13:48:19 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-decompile,form-compile):=20=D0=BE?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B0=20+=20CurrentR?= =?UTF-8?q?owUse=20=D0=BD=D0=B0=20Pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Контейнер вкладок может нести оформление заголовка (TitleFont/TitleTextColor/ TitleBackColor/…) и . Декомпилятор оформление УЖЕ захватывал (через Add-CommonProps→Add-Appearance), но Emit-Pages не вызывал Emit-Appearance → терялось. CurrentRowUse не ловился у Pages (только Table). Компилятор: Emit-Appearance (профиль field, как у Page) после Emit-Layout + CurrentRowUse после PagesRepresentation (порядок XSD). Декомпилятор: захват currentRowUse в обработчике Pages. Зеркало py. currentRowUse → allowlist (ps1+py). Корпус 8.3.24: Pages title-appearance ~5, CurrentRowUse ~3. Выборка 8 форм (КлиентБанк/ЗагрузкаВыписки, Контрагенты/ФормаНовогоЭлемента, … acc+erp): match 0→8, TOTAL→0. ps1==py байт-в-байт. Регресс 43/43. Spec обновлён. Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/skills/form-compile/scripts/form-compile.ps1 | 9 +++++++-- .claude/skills/form-compile/scripts/form-compile.py | 10 ++++++++-- .../skills/form-decompile/scripts/form-decompile.ps1 | 3 ++- docs/form-dsl-spec.md | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 6a3b4485..b318ca08 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.154 — Compile 1C managed form from JSON or object metadata +# form-compile v1.155 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -2917,7 +2917,7 @@ function Emit-Element { "wrap"=1;"openButton"=1;"listChoiceMode"=1;"showInFooter"=1 "extendedEditMultipleValues"=1;"chooseType"=1;"autoCellHeight"=1 "choiceButtonRepresentation"=1;"footerHorizontalAlign"=1;"headerHorizontalAlign"=1 - "headerDataPath"=1;"headerFormat"=1 + "headerDataPath"=1;"headerFormat"=1;"currentRowUse"=1 "format"=1;"editFormat"=1;"choiceParameters"=1;"choiceParameterLinks"=1;"typeLink"=1 # label/hyperlink "hyperlink"=1;"formatted"=1 @@ -4611,10 +4611,15 @@ function Emit-Pages { if ($el.pagesRepresentation) { X "$inner$($el.pagesRepresentation)" } + # Использование текущей строки (после PagesRepresentation, порядок XSD) + if ($el.currentRowUse) { X "$inner$($el.currentRowUse)" } Emit-CommonFlags -el $el -indent $inner Emit-Layout -el $el -indent $inner + # Оформление (цвета/шрифты/граница) заголовка группы страниц — TitleFont/TitleTextColor/… (как у Page) + Emit-Appearance -el $el -indent $inner -profile 'field' + # Companion Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner -content $el.extendedTooltip diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 0afced2e..d8113dff 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.154 — Compile 1C managed form from JSON or object metadata +# form-compile v1.155 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -2034,7 +2034,7 @@ KNOWN_KEYS = { "wrap", "openButton", "listChoiceMode", "showInHeader", "showInFooter", "extendedEditMultipleValues", "chooseType", "autoCellHeight", "choiceButtonRepresentation", "footerHorizontalAlign", "headerHorizontalAlign", - "headerDataPath", "headerFormat", + "headerDataPath", "headerFormat", "currentRowUse", "format", "editFormat", "choiceParameters", "choiceParameterLinks", "typeLink", "hyperlink", "formatted", "collapsedTitle", "showTitle", "united", "collapsed", "behavior", @@ -4350,10 +4350,16 @@ def emit_pages(lines, el, name, eid, indent): if el.get('pagesRepresentation'): lines.append(f'{inner}{el["pagesRepresentation"]}') + # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u043f\u043e\u0441\u043b\u0435 PagesRepresentation, \u043f\u043e\u0440\u044f\u0434\u043e\u043a XSD) + if el.get('currentRowUse'): + lines.append(f'{inner}{el["currentRowUse"]}') emit_common_flags(lines, el, inner) emit_layout(lines, el, inner) + # \u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 (\u0446\u0432\u0435\u0442\u0430/\u0448\u0440\u0438\u0444\u0442\u044b/\u0433\u0440\u0430\u043d\u0438\u0446\u0430) \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0433\u0440\u0443\u043f\u043f\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u2014 TitleFont/TitleTextColor/\u2026 (\u043a\u0430\u043a \u0443 Page) + emit_appearance(lines, el, inner, 'field') + # Companion emit_companion(lines, 'ExtendedTooltip', f'{name}\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430', inner, el.get('extendedTooltip')) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index b3e33116..b2a9cea9 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.129 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.130 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -2090,6 +2090,7 @@ function Decompile-Element { $obj[$key] = $name Add-CommonProps $obj $node $name $pr = Get-Child $node 'PagesRepresentation'; if ($pr) { $obj['pagesRepresentation'] = $pr } + $cru = Get-Child $node 'CurrentRowUse'; if ($cru) { $obj['currentRowUse'] = $cru } $kids = Decompile-Children $node if ($kids) { $obj['children'] = $kids } } diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index c2f23c9a..e061a264 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -223,7 +223,7 @@ companion-панели с собственным контентом. Оба не ### 4.1e. Оформление элемента (цвета / шрифты / граница) -Прямые свойства оформления элемента. Ключи — англ. camelCase 1:1 с тегами; **принимаются рус. синонимы** (forgiving). Применимо к полям (input/check/radio/labelField/picField/calendar), декорациям (label/picture), кнопкам (button), группам (group/columnGroup), **страницам (page: `backColor`/`titleTextColor`/`titleFont`)**, **попапам (popup: `titleTextColor`/`titleFont`)** и таблицам (table); порядок тегов в XML — по базовому типу (профиль), компилятор расставляет сам (1С толерантна к порядку оформления внутри элемента). +Прямые свойства оформления элемента. Ключи — англ. camelCase 1:1 с тегами; **принимаются рус. синонимы** (forgiving). Применимо к полям (input/check/radio/labelField/picField/calendar), декорациям (label/picture), кнопкам (button), группам (group/columnGroup), **страницам (page/pages: `backColor`/`titleTextColor`/`titleFont`)**, **попапам (popup: `titleTextColor`/`titleFont`)** и таблицам (table); порядок тегов в XML — по базовому типу (профиль), компилятор расставляет сам (1С толерантна к порядку оформления внутри элемента). | Ключ | Тег | Рус. синоним | |------|-----|--------------| @@ -667,7 +667,7 @@ companion-панели с собственным контентом. Оба не Page поддерживает `group` для задания ориентации содержимого и `children` для вложенных элементов. Также `picture` — картинка-иконка вкладки (формат «картинка-ссылка» из §4.1: скаляр-Ref/`abs:X` или объект `{src, loadTransparent?, transparentPixel?}`, дефолт `loadTransparent=false`). -Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `TabsOnBottom`, `TabsOnLeft`, `TabsOnRight`. +Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `TabsOnBottom`, `TabsOnLeft`, `TabsOnRight`; `currentRowUse` (`Auto`/`DontUse`/…); оформление заголовка вкладок (`titleFont`/`titleTextColor`/`titleBackColor`/… — как у `page`). #### button — Button