From e007233c91aa670b5612792be623b597b1eb1150 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 12 Jun 2026 13:43:55 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-decompile,form-compile):=20Table=20re?= =?UTF-8?q?freshRequest=20+=20=D1=84=D0=BE=D1=80=D0=BC.=20collapseItemsByI?= =?UTF-8?q?mportanceVariant/groupList=20(pass-through)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раундтрип терял три скаляра (чистые двусторонние пробелы — не ловились ни декомпилятором, ни компилятором): - Table (запрос обновления дин-списка; корпус acc+erp 8.3.24 — 33, всегда PullFromTop) - форм-уровень (сворачивание по важности; 27: DontUse 26/Use 1) - форм-уровень (ссылка на группу списка, значение 2:/имя; 30) Все три — pass-through (захват «как есть», зеркало платформы). RefreshRequest — в Emit-Table рядом с currentRowUse; форм-уровневые — через KNOWN_FORM_PROPS (decompile) + generic Emit-Properties (авто-PascalCase, compile ps1+py). Верификация: таргет-раундтрип 68 форм с этими тегами → три категории закрыты (0 LOST; остаток — другие категории valueType/HorizontalSpacing). Регресс form-compile 43/43 (ps1+py); 1С-cert кейса dynamic-list-form (все три тега, включая GroupList с GUID, грузятся в платформу). spec обновлён. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../skills/form-compile/scripts/form-compile.ps1 | 4 +++- .claude/skills/form-compile/scripts/form-compile.py | 5 ++++- .../form-decompile/scripts/form-decompile.ps1 | 6 ++++-- docs/form-dsl-spec.md | 3 +++ .../cases/form-compile/dynamic-list-form.json | 4 ++-- .../Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml | 13 ++++++++----- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index 5c1830aa..26801c0c 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.129 — Compile 1C managed form from JSON or object metadata +# form-compile v1.130 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -4326,6 +4326,8 @@ function Emit-Table { Emit-PictureRef -val $el.rowsPicture -picTag 'RowsPicture' -indent $inner # Использование текущей строки таблицы (pass-through; в корпусе соседствует с блоком дин-списка) if ($el.currentRowUse) { X "$inner$($el.currentRowUse)" } + # Запрос обновления дин-списка (pass-through; в корпусе всегда PullFromTop) + if ($el.refreshRequest) { X "$inner$($el.refreshRequest)" } # Блок свойств дин-список-таблицы (помечена эвристикой 11b.4) if ($el.PSObject.Properties["_dynList"] -and $el._dynList) { Emit-DynListTableBlock -el $el -indent $inner } if ($el.viewStatusLocation) { X "$inner$($el.viewStatusLocation)" } diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 1ae2c398..79972c46 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.129 — Compile 1C managed form from JSON or object metadata +# form-compile v1.130 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -4062,6 +4062,9 @@ def emit_table(lines, el, name, eid, indent): # Использование текущей строки таблицы (pass-through; в корпусе соседствует с блоком дин-списка) if el.get('currentRowUse'): lines.append(f'{inner}{el["currentRowUse"]}') + # Запрос обновления дин-списка (pass-through; в корпусе всегда PullFromTop) + if el.get('refreshRequest'): + lines.append(f'{inner}{el["refreshRequest"]}') # Блок свойств дин-список-таблицы (помечена эвристикой) if el.get('_dynList'): emit_dynlist_table_block(lines, el, inner) diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index f799319c..dbea6847 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.103 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.104 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -1781,6 +1781,8 @@ function Decompile-Element { $fh = Get-Child $node 'FooterHeight'; if ($null -ne $fh) { $obj['footerHeight'] = [int]$fh } # Использование текущей строки (Table-уровень; ≠ command-level CurrentRowUse) — pass-through $cru = Get-Child $node 'CurrentRowUse'; if ($cru) { $obj['currentRowUse'] = $cru } + # Запрос обновления дин-списка (всегда PullFromTop в корпусе) — pass-through + $rr = Get-Child $node 'RefreshRequest'; if ($rr) { $obj['refreshRequest'] = $rr } # CommandBarLocation: для дин-список-таблицы компилятор авто-инжектит "None" → инвертируем # (нет тега → суппресс-маркер ""; "None" → опускаем = авто-дефолт; иначе → захват). $cbl = Get-Child $node 'CommandBarLocation' @@ -2207,7 +2209,7 @@ $titleNode = $root.SelectSingleNode("lf:Title", $ns) if ($titleNode) { $t = Get-LangText $titleNode; if ($null -ne $t) { $dsl['title'] = $t } } # properties (прямые скаляры под
, PascalCase → camelCase) -$KNOWN_FORM_PROPS = @('AutoTitle','ReportResult','DetailsData','ReportFormType','AutoShowState','ReportResultViewMode','ViewModeApplicationOnSetReportResult','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings','ScalingMode','VerticalSpacing','VariantAppearance','ShowCloseButton','HorizontalAlign','ChildrenAlign','ShowTitle','ConversationsRepresentation') +$KNOWN_FORM_PROPS = @('AutoTitle','ReportResult','DetailsData','ReportFormType','AutoShowState','ReportResultViewMode','ViewModeApplicationOnSetReportResult','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings','ScalingMode','VerticalSpacing','VariantAppearance','ShowCloseButton','HorizontalAlign','ChildrenAlign','ShowTitle','ConversationsRepresentation','CollapseItemsByImportanceVariant','GroupList') $props = [ordered]@{} foreach ($pn in $KNOWN_FORM_PROPS) { $v = Get-Child $root $pn diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index 39bf0899..6c8df28d 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -79,6 +79,8 @@ | `childrenAlign` | `` | Выравнивание элементов/заголовков (`ItemsLeftTitlesLeft`, `ItemsRightTitlesLeft`, `None`, …) | | `showTitle` | `` | `true` / `false` — показывать заголовок формы | | `conversationsRepresentation` | `` | `Auto`, `Show`, `DontShow` — отображение панели обсуждений; pass-through (редкое) | +| `collapseItemsByImportanceVariant` | `` | `DontUse`, `Use` — сворачивание элементов по важности; pass-through (редкое) | +| `groupList` | `` | Ссылка на группу списка (`2:` или имя), pass-through verbatim (редкое) | Нераспознанные ключи преобразуются с автоматическим PascalCase (первая буква в верхний регистр). @@ -566,6 +568,7 @@ companion-панели с собственным контентом. Оба не | `headerHeight` | int | Высота шапки в строках (``); pass-through (редкое, ~35 форм в корпусе) | | `footerHeight` | int | Высота подвала в строках (``); pass-through (редкое, ~6 форм) | | `currentRowUse` | string | Использование текущей строки таблицы (``): `DontUse`, `Use`, `SelectionPresentation`, `SelectionPresentationAndChoice`, `Choice`; pass-through (≠ одноимённое свойство команды) | +| `refreshRequest` | string | Запрос обновления дин-списка (``): `PullFromTop` (потяни-обнови). Pass-through | | `commandBarLocation` | string | `None`, `Top`, `Bottom`, `Auto` | | `searchStringLocation` | string | `None`, `Top`, `Bottom`, `CommandBar`, `Auto` | | `viewStatusLocation` | string | `None`, `Top`, `Bottom`, `Auto` | diff --git a/tests/skills/cases/form-compile/dynamic-list-form.json b/tests/skills/cases/form-compile/dynamic-list-form.json index 0804d445..8210e303 100644 --- a/tests/skills/cases/form-compile/dynamic-list-form.json +++ b/tests/skills/cases/form-compile/dynamic-list-form.json @@ -15,7 +15,7 @@ "validatePath": "Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml", "input": { "title": "Товары", - "properties": { "saveWindowSettings": false }, + "properties": { "saveWindowSettings": false, "collapseItemsByImportanceVariant": "DontUse", "groupList": "2:02023637-7868-4a5f-8576-835a76e0c9ba" }, "attributes": [ { "name": "Список", "type": "DynamicList", "useAlways": ["~Артикул", "Список.Code", "Description"], "settings": { "mainTable": "Catalog.Товары", "dynamicDataRead": true, "autoSaveUserSettings": false, @@ -25,7 +25,7 @@ } } ], "elements": [ - { "table": "Список", "path": "Список", + { "table": "Список", "path": "Список", "refreshRequest": "PullFromTop", "additions": { "viewStatus": { "horizontalLocation": "left" } }, "commandBar": [ { "searchString": "ПоискСписка", "source": "Список", "width": 15, "horizontalStretch": true } diff --git a/tests/skills/cases/form-compile/snapshots/dynamic-list-form/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/dynamic-list-form/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml index 2c3633c5..fdb205d7 100644 --- a/tests/skills/cases/form-compile/snapshots/dynamic-list-form/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml +++ b/tests/skills/cases/form-compile/snapshots/dynamic-list-form/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml @@ -8,12 +8,15 @@ false false + DontUse + 2:UUID-001 СписокNoneСписок.DefaultPicture + PullFromTopfalse60 @@ -105,10 +108,10 @@ false Артикул Equal - UUID-001 + UUID-002 Normal - UUID-002 + UUID-003 @@ -120,7 +123,7 @@ Desc Normal - UUID-003 + UUID-004 @@ -139,10 +142,10 @@ Normal - UUID-004 + UUID-005 Normal - UUID-005 + UUID-006