From 6e3632e5ff57a47df0fb732441ab39a80176242b Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 22 May 2026 18:41:57 +0300 Subject: [PATCH] =?UTF-8?q?revert(skd-decompile):=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D1=8C=20@normal=20shorthand-=D1=84=D0=BB?= =?UTF-8?q?=D0=B0=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше при наличии явного Normal decompile переводил filter item в полноценный object form. Это раздувало JSON без причины — @normal в shorthand функционально эквивалентен "viewMode": "Normal" в object form, и compile уже его парсит. Теперь: object form триггерится только реальными причинами (userSettingPresentation, value-массив, dcscor:Field валуетайп); явный Normal сохраняется как @normal в shorthand. Object form по-прежнему может содержать "viewMode": "Normal" — это равнозначно. Compile-side изменений не требуется. Spec обновлён. Co-Authored-By: Claude Opus 4.7 --- .claude/skills/skd-decompile/scripts/skd-decompile.ps1 | 10 ++++++---- docs/skd-dsl-spec.md | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index 80a2c2bd..d2324ebf 100644 --- a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 +++ b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 @@ -1,4 +1,4 @@ -# skd-decompile v0.33 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.34 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1375,17 +1375,19 @@ function Build-FilterItem { if ($userId) { $flags += '@user' } if ($viewMode -eq 'QuickAccess') { $flags += '@quickAccess' } elseif ($viewMode -eq 'Inaccessible') { $flags += '@inaccessible' } - # Normal сохраняется только если node присутствовал — переходит в object form + # Normal: явное присутствие Normal в XML сохраняется + # через shorthand-флаг @normal (отсутствие — без флага). Это эквивалентно + # object form "viewMode": "Normal" но компактнее. + elseif ($viewMode -eq 'Normal') { $flags += '@normal' } # nullity ops have no value $noValueOps = @('filled','notFilled') # Переход в object form: # - userSettingPresentation, - # - явный viewMode=Normal (отсутствие тоже нужно сохранить), # - массивное value (multi-right или пустой ValueList), # - явный valueType (например, dcscor:Field — field-to-field comparison) - if ($userPresNode -or $viewMode -eq 'Normal' -or $valueIsArrayFlag -or $valueTypeAttr) { + if ($userPresNode -or $valueIsArrayFlag -or $valueTypeAttr) { $obj = [ordered]@{ field = $field; op = $op } if ($op -notin $noValueOps -and $null -ne $value) { if ($valueIsArrayFlag) { diff --git a/docs/skd-dsl-spec.md b/docs/skd-dsl-spec.md index 4a873eb2..204f2d43 100644 --- a/docs/skd-dsl-spec.md +++ b/docs/skd-dsl-spec.md @@ -553,14 +553,14 @@ XML-маппинг — по `` на каждый элемент: ] ``` -Формат: `"<Поле> <оператор> [<значение>] [@off] [@user] [@quickAccess] [@inaccessible]"`. +Формат: `"<Поле> <оператор> [<значение>] [@off] [@user] [@quickAccess] [@normal] [@inaccessible]"`. - Значение `_` — пустое (placeholder, не выводится в XML) - `@off` → `use=false` - `@user` → `userSettingID=auto` (генерировать GUID) - `@quickAccess` → `viewMode=QuickAccess` +- `@normal` → `viewMode=Normal` (явный — для bit-perfect, см. [viewMode](#viewmode-режим-доступности)) - `@inaccessible` → `viewMode=Inaccessible` -- `Normal` (default) — отдельным флагом не задаётся. Если в исходном XML был явный `Normal`, decompile переводит item в object form с `"viewMode": "Normal"`. - Типы значений автоопределяются: `true`/`false` → boolean, `2024-01-01T00:00:00` → dateTime, числа → decimal, `Перечисление.*`/`Справочник.*`/`ПланСчетов.*`/`Документ.*` → DesignTimeValue, прочее → string - OrGroup: `{"group": "Or", "items": ["условие1", "условие2"]}` — объединяет условия через ИЛИ @@ -719,7 +719,7 @@ XML-маппинг — по `` на каждый элемент: ] ``` -Формат: `"<Имя> [= <значение>] [@off] [@user] [@quickAccess] [@inaccessible]"`. +Формат: `"<Имя> [= <значение>] [@off] [@user] [@quickAccess] [@normal] [@inaccessible]"`. - Значения-варианты периодов (`LastMonth`, `ThisYear` и др.) автоматически оборачиваются в `v8:StandardPeriod` - `@off` → `use=false`, `@user` → `userSettingID=auto`