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`