diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1
index 9e89acc7..69c975ee 100644
--- a/.claude/skills/skd-compile/scripts/skd-compile.ps1
+++ b/.claude/skills/skd-compile/scripts/skd-compile.ps1
@@ -1,4 +1,4 @@
-# skd-compile v1.44 — Compile 1C DCS from JSON
+# skd-compile v1.45 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$DefinitionFile,
@@ -1957,10 +1957,8 @@ function Emit-FilterItem {
if ($item.presentation) {
Emit-MLText -tag "dcsset:presentation" -text $item.presentation -indent "$indent`t"
}
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if ($item.viewMode -or $item.userSettingID) {
- $gvm = if ($item.viewMode) { "$($item.viewMode)" } else { 'Normal' }
- X "$indent`t$(Esc-Xml $gvm)"
+ if ($item.viewMode) {
+ X "$indent`t$(Esc-Xml "$($item.viewMode)")"
}
if ($item.userSettingID) {
$guid = if ("$($item.userSettingID)" -eq "auto") { New-Guid-String } else { "$($item.userSettingID)" }
@@ -2009,10 +2007,9 @@ function Emit-FilterItem {
Emit-MLText -tag "dcsset:presentation" -text $item.presentation -indent "$indent`t"
}
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if ($item.viewMode -or $item.userSettingID) {
- $vm = if ($item.viewMode) { "$($item.viewMode)" } else { 'Normal' }
- X "$indent`t$(Esc-Xml $vm)"
+ # viewMode эмитим только если явно задан — присутствие в XML контекстно
+ if ($item.viewMode) {
+ X "$indent`t$(Esc-Xml "$($item.viewMode)")"
}
if ($item.userSettingID) {
@@ -2191,10 +2188,8 @@ function Emit-ConditionalAppearance {
X "$indent`t`t$(Esc-Xml "$($ca.presentation)")"
}
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if ($ca.viewMode -or $ca.userSettingID) {
- $cvm = if ($ca.viewMode) { "$($ca.viewMode)" } else { 'Normal' }
- X "$indent`t`t$(Esc-Xml $cvm)"
+ if ($ca.viewMode) {
+ X "$indent`t`t$(Esc-Xml "$($ca.viewMode)")"
}
# UserSettingID
@@ -2314,10 +2309,8 @@ function Emit-DataParameters {
}
}
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if ($dp.viewMode -or $dp.userSettingID) {
- $dvm = if ($dp.viewMode) { "$($dp.viewMode)" } else { 'Normal' }
- X "$indent`t`t$(Esc-Xml $dvm)"
+ if ($dp.viewMode) {
+ X "$indent`t`t$(Esc-Xml "$($dp.viewMode)")"
}
if ($dp.userSettingID) {
diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py
index 97f6e267..0b79ceb7 100644
--- a/.claude/skills/skd-compile/scripts/skd-compile.py
+++ b/.claude/skills/skd-compile/scripts/skd-compile.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# skd-compile v1.44 — Compile 1C DCS from JSON
+# skd-compile v1.45 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import json
@@ -1628,10 +1628,8 @@ def emit_filter_item(lines, item, indent):
emit_filter_item(lines, sub, f'{indent}\t')
if item.get('presentation'):
emit_mltext(lines, f'{indent}\t', 'dcsset:presentation', item['presentation'])
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if item.get('viewMode') or item.get('userSettingID'):
- gvm = str(item['viewMode']) if item.get('viewMode') else 'Normal'
- lines.append(f'{indent}\t{esc_xml(gvm)}')
+ if item.get('viewMode'):
+ lines.append(f'{indent}\t{esc_xml(str(item["viewMode"]))}')
if item.get('userSettingID'):
guid = new_uuid() if str(item['userSettingID']) == 'auto' else str(item['userSettingID'])
lines.append(f'{indent}\t{esc_xml(guid)}')
@@ -1673,10 +1671,8 @@ def emit_filter_item(lines, item, indent):
if item.get('presentation'):
emit_mltext(lines, f'{indent}\t', 'dcsset:presentation', item["presentation"])
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if item.get('viewMode') or item.get('userSettingID'):
- vm = str(item['viewMode']) if item.get('viewMode') else 'Normal'
- lines.append(f'{indent}\t{esc_xml(vm)}')
+ if item.get('viewMode'):
+ lines.append(f'{indent}\t{esc_xml(str(item["viewMode"]))}')
if item.get('userSettingID'):
uid = new_uuid() if str(item['userSettingID']) == 'auto' else str(item['userSettingID'])
@@ -1827,10 +1823,8 @@ def emit_conditional_appearance(lines, items, indent, block_view_mode=None):
if ca.get('presentation'):
lines.append(f'{indent}\t\t{esc_xml(str(ca["presentation"]))}')
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if ca.get('viewMode') or ca.get('userSettingID'):
- cvm = str(ca['viewMode']) if ca.get('viewMode') else 'Normal'
- lines.append(f'{indent}\t\t{esc_xml(cvm)}')
+ if ca.get('viewMode'):
+ lines.append(f'{indent}\t\t{esc_xml(str(ca["viewMode"]))}')
# UserSettingID
if ca.get('userSettingID'):
@@ -1921,10 +1915,8 @@ def emit_data_parameters(lines, items, indent):
else:
lines.append(f'{indent}\t\t{esc_xml(str(val))}')
- # Platform always emits viewMode when userSettingID is present (implicit Normal).
- if dp.get('viewMode') or dp.get('userSettingID'):
- dvm = str(dp['viewMode']) if dp.get('viewMode') else 'Normal'
- lines.append(f'{indent}\t\t{esc_xml(dvm)}')
+ if dp.get('viewMode'):
+ lines.append(f'{indent}\t\t{esc_xml(str(dp["viewMode"]))}')
if dp.get('userSettingID'):
uid = new_uuid() if str(dp['userSettingID']) == 'auto' else str(dp['userSettingID'])
diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1
index d8535391..370cf53b 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.29 — Decompile 1C DCS Template.xml to JSON DSL (draft)
+# skd-decompile v0.30 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -1297,9 +1297,9 @@ function Build-FilterItem {
$gObj = [ordered]@{ group = $groupName; items = $items }
$gPres = Get-Text $itemNode "dcsset:presentation"
if ($gPres) { $gObj['presentation'] = $gPres }
- $gVM = Get-Text $itemNode "dcsset:viewMode"
- # Normal — implicit when userSettingID present; skip unless non-default
- if ($gVM -and $gVM -ne 'Normal') { $gObj['viewMode'] = $gVM }
+ # viewMode: сохраняем даже Normal если node присутствует (для bit-perfect)
+ $gVMNode = $itemNode.SelectSingleNode("dcsset:viewMode", $ns)
+ if ($gVMNode) { $gObj['viewMode'] = $gVMNode.InnerText }
$gUSID = Get-Text $itemNode "dcsset:userSettingID"
if ($gUSID) { $gObj['userSettingID'] = 'auto' }
$gUSPN = $itemNode.SelectSingleNode("dcsset:userSettingPresentation", $ns)
@@ -1322,7 +1322,9 @@ function Build-FilterItem {
$use = Get-Text $itemNode "dcsset:use"
$userId = Get-Text $itemNode "dcsset:userSettingID"
- $viewMode = Get-Text $itemNode "dcsset:viewMode"
+ # viewMode: detect presence (даже = 'Normal') чтобы compile сделал bit-perfect
+ $vmNode = $itemNode.SelectSingleNode("dcsset:viewMode", $ns)
+ $viewMode = if ($vmNode) { $vmNode.InnerText } else { $null }
$userPresNode = $itemNode.SelectSingleNode("dcsset:userSettingPresentation", $ns)
$flags = @()
@@ -1330,19 +1332,20 @@ function Build-FilterItem {
if ($userId) { $flags += '@user' }
if ($viewMode -eq 'QuickAccess') { $flags += '@quickAccess' }
elseif ($viewMode -eq 'Inaccessible') { $flags += '@inaccessible' }
- # Normal is the default — do not emit @normal
+ # Normal сохраняется только если node присутствовал — переходит в object form
# nullity ops have no value
$noValueOps = @('filled','notFilled')
- if ($userPresNode) {
- # object form
+ # Переход в object form: userSettingPresentation ИЛИ явный viewMode=Normal
+ # (Normal не выразим в shorthand, а отсутствие тоже нужно сохранить)
+ if ($userPresNode -or $viewMode -eq 'Normal') {
$obj = [ordered]@{ field = $field; op = $op }
if ($op -notin $noValueOps -and $null -ne $value) { $obj['value'] = $value }
if ($use -eq 'false') { $obj['use'] = $false }
if ($userId) { $obj['userSettingID'] = 'auto' }
- if ($viewMode -and $viewMode -ne 'Normal') { $obj['viewMode'] = $viewMode }
- $obj['userSettingPresentation'] = Get-MLText $userPresNode
+ if ($viewMode) { $obj['viewMode'] = $viewMode }
+ if ($userPresNode) { $obj['userSettingPresentation'] = Get-MLText $userPresNode }
return $obj
}
@@ -1376,12 +1379,11 @@ function Build-SelectionItem {
$fName = Get-Text $item "dcsset:field"
$titleNode = $item.SelectSingleNode("dcsset:lwsTitle", $ns)
$title = Get-MLText $titleNode
- $vm = Get-Text $item "dcsset:viewMode"
- $hasVM = $vm -and $vm -ne 'Normal'
- if ($title -or $hasVM) {
+ $vmN = $item.SelectSingleNode("dcsset:viewMode", $ns)
+ if ($title -or $vmN) {
$obj = [ordered]@{ field = $fName }
if ($title) { $obj['title'] = $title }
- if ($hasVM) { $obj['viewMode'] = $vm }
+ if ($vmN) { $obj['viewMode'] = $vmN.InnerText }
return $obj
}
return $fName
@@ -1428,11 +1430,11 @@ function Build-Order {
'OrderItemField' {
$fn = Get-Text $it "dcsset:field"
$ot = Get-Text $it "dcsset:orderType"
- $vm = Get-Text $it "dcsset:viewMode"
- if ($vm -and $vm -ne 'Normal') {
+ $vmN = $it.SelectSingleNode("dcsset:viewMode", $ns)
+ if ($vmN) {
$obj = [ordered]@{ field = $fn }
if ($ot -eq 'Desc') { $obj['direction'] = 'desc' }
- $obj['viewMode'] = $vm
+ $obj['viewMode'] = $vmN.InnerText
$out += $obj
} else {
if ($ot -eq 'Desc') { $out += "$fn desc" } else { $out += $fn }
@@ -1493,8 +1495,8 @@ function Build-ConditionalAppearance {
if ($ap -and $ap.Count -gt 0) { $entry['appearance'] = $ap }
$pres = Get-Text $it "dcsset:presentation"
if ($pres) { $entry['presentation'] = $pres }
- $vm = Get-Text $it "dcsset:viewMode"
- if ($vm -and $vm -ne 'Normal') { $entry['viewMode'] = $vm }
+ $vmN = $it.SelectSingleNode("dcsset:viewMode", $ns)
+ if ($vmN) { $entry['viewMode'] = $vmN.InnerText }
$usid = Get-Text $it "dcsset:userSettingID"
if ($usid) { $entry['userSettingID'] = 'auto' }
$out += $entry
@@ -1640,8 +1642,9 @@ function Build-TableAxisBlock {
$op = Build-OutputParameters -opNode $opNode
if ($op -and $op.Count -gt 0) { $entry['outputParameters'] = $op }
# user-settings on the axis itself
- $avm = Get-Text $node "dcsset:viewMode"
- if ($avm -and $avm -ne 'Normal') { $entry['viewMode'] = $avm }
+ # viewMode: сохраняем даже Normal если node присутствует
+ $avmNode = $node.SelectSingleNode("dcsset:viewMode", $ns)
+ if ($avmNode) { $entry['viewMode'] = $avmNode.InnerText }
$ausid = Get-Text $node "dcsset:userSettingID"
if ($ausid) { $entry['userSettingID'] = 'auto' }
$ausPresNode = $node.SelectSingleNode("dcsset:userSettingPresentation", $ns)
diff --git a/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml b/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml
index 65aafe37..f2fcec94 100644
--- a/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml
+++ b/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml
@@ -165,7 +165,6 @@
0001-01-01T00:00:00
0001-01-01T00:00:00
- Normal
UUID-001
@@ -176,44 +175,37 @@
0001-01-01T00:00:00
0001-01-01T00:00:00
- Normal
UUID-002
Флаг
true
- Normal
UUID-003
Сумма
0
- Normal
UUID-004
Ставка
13.5
- Normal
UUID-005
Метка
ТестовоеЗначение
- Normal
UUID-006
false
ПустаяСтрока
- Normal
UUID-007
Валюта
Справочник.Валюты.EmptyRef
- Normal
UUID-008
diff --git a/tests/skills/cases/skd-compile/snapshots/full-example/Template.xml b/tests/skills/cases/skd-compile/snapshots/full-example/Template.xml
index e4e6409f..3e9f5d4b 100644
--- a/tests/skills/cases/skd-compile/snapshots/full-example/Template.xml
+++ b/tests/skills/cases/skd-compile/snapshots/full-example/Template.xml
@@ -132,7 +132,6 @@
false
Организация
Equal
- Normal
UUID-001
@@ -144,7 +143,6 @@
0001-01-01T00:00:00
0001-01-01T00:00:00
- Normal
UUID-002
diff --git a/tests/skills/cases/skd-compile/snapshots/with-filters/Template.xml b/tests/skills/cases/skd-compile/snapshots/with-filters/Template.xml
index f8d8ead5..69d27f95 100644
--- a/tests/skills/cases/skd-compile/snapshots/with-filters/Template.xml
+++ b/tests/skills/cases/skd-compile/snapshots/with-filters/Template.xml
@@ -130,7 +130,6 @@
false
Организация
Equal
- Normal
UUID-001
@@ -151,7 +150,6 @@
0001-01-01T00:00:00
0001-01-01T00:00:00
- Normal
UUID-002
diff --git a/tests/skills/cases/skd-decompile/snapshots/variant-full/Template.xml b/tests/skills/cases/skd-decompile/snapshots/variant-full/Template.xml
index fbbe0ab1..331424d5 100644
--- a/tests/skills/cases/skd-decompile/snapshots/variant-full/Template.xml
+++ b/tests/skills/cases/skd-decompile/snapshots/variant-full/Template.xml
@@ -297,7 +297,6 @@
false
Организация
Equal
- Normal
UUID-001
@@ -360,13 +359,11 @@
0001-01-01T00:00:00
0001-01-01T00:00:00
- Normal
UUID-003
Активные
true
- Normal
UUID-004
diff --git a/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json
index 1aa11c1c..38ea1c28 100644
--- a/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json
+++ b/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json
@@ -11,7 +11,7 @@
"selection": ["Организация", { "folder": "Объёмы", "items": ["Сумма", "Количество"] }],
"filter": ["Организация = _ @off @user", { "group": "Or", "items": ["Статус = Активен", "Сумма > 1000"] }],
"order": ["Сумма desc"],
- "conditionalAppearance": [{ "filter": ["Сумма > 10000"], "appearance": { "ЦветТекста": "style:НегативныйТекстЦвет" }, "presentation": "Большие суммы", "userSettingID": "auto" }],
+ "conditionalAppearance": [{ "filter": ["Сумма > 10000"], "appearance": { "ЦветТекста": "style:НегативныйТекстЦвет" }, "presentation": "Большие суммы", "viewMode": "Normal", "userSettingID": "auto" }],
"outputParameters": { "Заголовок": "Сводка по организациям" },
"dataParameters": "auto",
"structure": "Организация > Номенклатура > details"