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"