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`