diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1
index a8efd93d..fbdfd3d4 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.77 — Compile 1C DCS from JSON
+# skd-compile v1.79 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$DefinitionFile,
@@ -1982,7 +1982,7 @@ function Emit-SelectionItem {
}
function Emit-Selection {
- param($items, [string]$indent, [switch]$skipAuto, $blockViewMode = $null)
+ param($items, [string]$indent, [switch]$skipAuto, $blockViewMode = $null, $blockUserSettingID = $null)
if (-not $items -or $items.Count -eq 0) { return }
@@ -1994,6 +1994,10 @@ function Emit-Selection {
if ($null -ne $blockViewMode) {
X "$indent`t$(Esc-Xml "$blockViewMode")"
}
+ if ($null -ne $blockUserSettingID) {
+ $uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
+ X "$indent`t$(Esc-Xml $uid)"
+ }
X "$indent"
}
@@ -2124,7 +2128,7 @@ function Emit-FilterItem {
}
function Emit-Filter {
- param($items, [string]$indent, $blockViewMode = $null)
+ param($items, [string]$indent, $blockViewMode = $null, $blockUserSettingID = $null)
if (-not $items -or $items.Count -eq 0) { return }
@@ -2159,6 +2163,10 @@ function Emit-Filter {
if ($null -ne $blockViewMode) {
X "$indent`t$(Esc-Xml "$blockViewMode")"
}
+ if ($null -ne $blockUserSettingID) {
+ $uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
+ X "$indent`t$(Esc-Xml $uid)"
+ }
X "$indent"
}
@@ -2293,7 +2301,7 @@ function Emit-AppearanceValue {
}
function Emit-ConditionalAppearance {
- param($items, [string]$indent, $blockViewMode = $null)
+ param($items, [string]$indent, $blockViewMode = $null, $blockUserSettingID = $null)
if (-not $items -or $items.Count -eq 0) { return }
@@ -2381,6 +2389,10 @@ function Emit-ConditionalAppearance {
if ($null -ne $blockViewMode) {
X "$indent`t$(Esc-Xml "$blockViewMode")"
}
+ if ($null -ne $blockUserSettingID) {
+ $uid = if ("$blockUserSettingID" -eq 'auto') { New-Guid-String } else { "$blockUserSettingID" }
+ X "$indent`t$(Esc-Xml $uid)"
+ }
X "$indent"
}
@@ -2894,6 +2906,20 @@ function Emit-StructureItem {
if ($item.outputParameters) {
Emit-OutputParameters -params $item.outputParameters -indent "$indent`t"
}
+ # viewMode / userSettingID / userSettingPresentation / itemsViewMode на самой таблице
+ if ($item.viewMode) {
+ X "$indent`t$(Esc-Xml "$($item.viewMode)")"
+ }
+ if ($item.userSettingID) {
+ $gid = if ("$($item.userSettingID)" -eq "auto") { New-Guid-String } else { "$($item.userSettingID)" }
+ X "$indent`t$(Esc-Xml $gid)"
+ }
+ if ($item.userSettingPresentation) {
+ Emit-MLText -tag "dcsset:userSettingPresentation" -text $item.userSettingPresentation -indent "$indent`t"
+ }
+ if ($item.itemsViewMode) {
+ X "$indent`t$(Esc-Xml "$($item.itemsViewMode)")"
+ }
X "$indent"
}
@@ -2989,12 +3015,17 @@ function Emit-SettingsVariants {
$s = $v.settings
- # Helper: resolve XViewMode from settings — emit only if explicitly set
+ # Helper: resolve XViewMode/XUserSettingID from settings — emit only if explicitly set
function Get-BlockVM([string]$key) {
$prop = "${key}ViewMode"
if ($s.PSObject.Properties[$prop]) { return "$($s.$prop)" }
return $null
}
+ function Get-BlockUSID([string]$key) {
+ $prop = "${key}UserSettingID"
+ if ($s.PSObject.Properties[$prop]) { return "$($s.$prop)" }
+ return $null
+ }
# userFields — пользовательские вычисляемые поля (Expression / Case)
if ($s.userFields -and $s.userFields.Count -gt 0) {
@@ -3003,22 +3034,22 @@ function Emit-SettingsVariants {
# Selection (Auto items only belong at group level, not top-level settings)
if ($s.selection) {
- Emit-Selection -items $s.selection -indent "`t`t`t" -skipAuto -blockViewMode (Get-BlockVM 'selection')
+ Emit-Selection -items $s.selection -indent "`t`t`t" -skipAuto -blockViewMode (Get-BlockVM 'selection') -blockUserSettingID (Get-BlockUSID 'selection')
}
# Filter
if ($s.filter) {
- Emit-Filter -items $s.filter -indent "`t`t`t" -blockViewMode (Get-BlockVM 'filter')
+ Emit-Filter -items $s.filter -indent "`t`t`t" -blockViewMode (Get-BlockVM 'filter') -blockUserSettingID (Get-BlockUSID 'filter')
}
# Order (Auto items only belong at group level, not top-level settings)
if ($s.order) {
- Emit-Order -items $s.order -indent "`t`t`t" -skipAuto -blockViewMode (Get-BlockVM 'order')
+ Emit-Order -items $s.order -indent "`t`t`t" -skipAuto -blockViewMode (Get-BlockVM 'order') -blockUserSettingID (Get-BlockUSID 'order')
}
# ConditionalAppearance
if ($s.conditionalAppearance) {
- Emit-ConditionalAppearance -items $s.conditionalAppearance -indent "`t`t`t" -blockViewMode (Get-BlockVM 'conditionalAppearance')
+ Emit-ConditionalAppearance -items $s.conditionalAppearance -indent "`t`t`t" -blockViewMode (Get-BlockVM 'conditionalAppearance') -blockUserSettingID (Get-BlockUSID 'conditionalAppearance')
}
# OutputParameters (platform does NOT emit on this block)
diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py
index d2c9386e..1e14ee17 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.77 — Compile 1C DCS from JSON
+# skd-compile v1.79 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import json
@@ -1641,7 +1641,7 @@ def emit_selection_item(lines, item, indent):
lines.append(f'{indent}')
-def emit_selection(lines, items, indent, skip_auto=False, block_view_mode=None):
+def emit_selection(lines, items, indent, skip_auto=False, block_view_mode=None, block_user_setting_id=None):
if not items or len(items) == 0:
return
lines.append(f'{indent}')
@@ -1651,6 +1651,9 @@ def emit_selection(lines, items, indent, skip_auto=False, block_view_mode=None):
emit_selection_item(lines, item, f'{indent}\t')
if block_view_mode is not None:
lines.append(f'{indent}\t{esc_xml(str(block_view_mode))}')
+ if block_user_setting_id is not None:
+ uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
+ lines.append(f'{indent}\t{esc_xml(uid)}')
lines.append(f'{indent}')
@@ -1764,7 +1767,7 @@ def emit_filter_item(lines, item, indent):
lines.append(f'{indent}')
-def emit_filter(lines, items, indent, block_view_mode=None):
+def emit_filter(lines, items, indent, block_view_mode=None, block_user_setting_id=None):
if not items or len(items) == 0:
return
@@ -1791,6 +1794,9 @@ def emit_filter(lines, items, indent, block_view_mode=None):
emit_filter_item(lines, item, f'{indent}\t')
if block_view_mode is not None:
lines.append(f'{indent}\t{esc_xml(str(block_view_mode))}')
+ if block_user_setting_id is not None:
+ uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
+ lines.append(f'{indent}\t{esc_xml(uid)}')
lines.append(f'{indent}')
@@ -1895,7 +1901,7 @@ def emit_appearance_value(lines, key, val, indent):
lines.append(f'{indent}')
-def emit_conditional_appearance(lines, items, indent, block_view_mode=None):
+def emit_conditional_appearance(lines, items, indent, block_view_mode=None, block_user_setting_id=None):
if not items or len(items) == 0:
return
@@ -1964,6 +1970,9 @@ def emit_conditional_appearance(lines, items, indent, block_view_mode=None):
lines.append(f'{indent}\t')
if block_view_mode is not None:
lines.append(f'{indent}\t{esc_xml(str(block_view_mode))}')
+ if block_user_setting_id is not None:
+ uid = new_uuid() if str(block_user_setting_id) == 'auto' else str(block_user_setting_id)
+ lines.append(f'{indent}\t{esc_xml(uid)}')
lines.append(f'{indent}')
@@ -2334,6 +2343,16 @@ def emit_structure_item(lines, item, indent):
emit_conditional_appearance(lines, item['conditionalAppearance'], f'{indent}\t')
if item.get('outputParameters'):
emit_output_parameters(lines, item['outputParameters'], f'{indent}\t')
+ # viewMode / userSettingID / userSettingPresentation / itemsViewMode на самой таблице
+ if item.get('viewMode'):
+ lines.append(f'{indent}\t{esc_xml(str(item["viewMode"]))}')
+ if item.get('userSettingID'):
+ gid = new_uuid() if str(item['userSettingID']) == 'auto' else str(item['userSettingID'])
+ lines.append(f'{indent}\t{esc_xml(gid)}')
+ if item.get('userSettingPresentation'):
+ emit_mltext(lines, f'{indent}\t', 'dcsset:userSettingPresentation', item['userSettingPresentation'])
+ if item.get('itemsViewMode'):
+ lines.append(f'{indent}\t{esc_xml(str(item["itemsViewMode"]))}')
lines.append(f'{indent}')
@@ -2407,7 +2426,10 @@ def emit_settings_variants(lines, defn):
s = v.get('settings', {})
- # Helper: resolve XViewMode from settings — emit only if explicitly set
+ # Helper: resolve XViewMode/XUserSettingID from settings — emit only if explicitly set
+ def _block_usid(key):
+ prop = f'{key}UserSettingID'
+ return str(s[prop]) if prop in s else None
def _block_vm(key):
prop = f'{key}ViewMode'
if prop in s:
@@ -2420,19 +2442,19 @@ def emit_settings_variants(lines, defn):
# Selection
if s.get('selection'):
- emit_selection(lines, s['selection'], '\t\t\t', skip_auto=True, block_view_mode=_block_vm('selection'))
+ emit_selection(lines, s['selection'], '\t\t\t', skip_auto=True, block_view_mode=_block_vm('selection'), block_user_setting_id=_block_usid('selection'))
# Filter
if s.get('filter'):
- emit_filter(lines, s['filter'], '\t\t\t', block_view_mode=_block_vm('filter'))
+ emit_filter(lines, s['filter'], '\t\t\t', block_view_mode=_block_vm('filter'), block_user_setting_id=_block_usid('filter'))
# Order
if s.get('order'):
- emit_order(lines, s['order'], '\t\t\t', skip_auto=True, block_view_mode=_block_vm('order'))
+ emit_order(lines, s['order'], '\t\t\t', skip_auto=True, block_view_mode=_block_vm('order'), block_user_setting_id=_block_usid('order'))
# ConditionalAppearance
if s.get('conditionalAppearance'):
- emit_conditional_appearance(lines, s['conditionalAppearance'], '\t\t\t', block_view_mode=_block_vm('conditionalAppearance'))
+ emit_conditional_appearance(lines, s['conditionalAppearance'], '\t\t\t', block_view_mode=_block_vm('conditionalAppearance'), block_user_setting_id=_block_usid('conditionalAppearance'))
# OutputParameters (platform does NOT emit on this block)
if s.get('outputParameters'):
diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1
index 9c53cf6e..01c38e98 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.63 — Decompile 1C DCS Template.xml to JSON DSL (draft)
+# skd-decompile v0.65 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -1985,6 +1985,17 @@ function Build-Structure {
$tCa = Build-ConditionalAppearance -caNode $tCaN -loc "$loc/$idx/ca"
if ($tCa.Count -gt 0) { $entry['conditionalAppearance'] = $tCa }
}
+ # viewMode / userSettingID / userSettingPresentation на самой таблице (direct child)
+ foreach ($ch in $it.ChildNodes) {
+ if ($ch.NodeType -ne 'Element' -or $ch.NamespaceURI -ne 'http://v8.1c.ru/8.1/data-composition-system/settings') { continue }
+ if ($ch.LocalName -eq 'viewMode' -and -not $entry.Contains('viewMode')) { $entry['viewMode'] = $ch.InnerText }
+ elseif ($ch.LocalName -eq 'userSettingID' -and -not $entry.Contains('userSettingID')) { $entry['userSettingID'] = 'auto' }
+ elseif ($ch.LocalName -eq 'userSettingPresentation' -and -not $entry.Contains('userSettingPresentation')) {
+ $uspV = Get-MLText $ch
+ if ($uspV) { $entry['userSettingPresentation'] = $uspV }
+ }
+ elseif ($ch.LocalName -eq 'itemsViewMode' -and -not $entry.Contains('itemsViewMode')) { $entry['itemsViewMode'] = $ch.InnerText }
+ }
$items += $entry
$idx++
continue
@@ -2427,6 +2438,17 @@ foreach ($sv in $svNodes) {
return $null
}
+ # Block-level userSettingID (direct child of selection/filter/order/conditionalAppearance).
+ function Get-BlockUSID($node) {
+ if (-not $node) { return $null }
+ foreach ($child in $node.ChildNodes) {
+ if ($child.NodeType -eq 'Element' -and $child.LocalName -eq 'userSettingID' -and $child.NamespaceURI -eq 'http://v8.1c.ru/8.1/data-composition-system/settings') {
+ return $child.InnerText
+ }
+ }
+ return $null
+ }
+
# userFields — пользовательские вычисляемые поля (Expression / Case)
$ufNode = $settingsNode.SelectSingleNode("dcsset:userFields", $ns)
if ($ufNode) {
@@ -2500,9 +2522,11 @@ foreach ($sv in $svNodes) {
$selTop = $settingsNode.SelectSingleNode("dcsset:selection", $ns)
$selItems = Build-Selection -selNode $selTop -loc "variant[$vi]/selection"
if ($selItems.Count -gt 0) { $settings['selection'] = $selItems }
- # Block-level viewMode: preserve exact presence (even Normal) for bit-perfect round-trip
+ # Block-level viewMode/userSettingID: preserve exact presence (even Normal) for bit-perfect
$svm = Get-BlockVM $selTop
if ($null -ne $svm) { $settings['selectionViewMode'] = $svm }
+ $susid = Get-BlockUSID $selTop
+ if ($susid) { $settings['selectionUserSettingID'] = 'auto' }
# filter
$fTop = $settingsNode.SelectSingleNode("dcsset:filter", $ns)
@@ -2513,6 +2537,8 @@ foreach ($sv in $svNodes) {
}
$fvm = Get-BlockVM $fTop
if ($null -ne $fvm) { $settings['filterViewMode'] = $fvm }
+ $fusid = Get-BlockUSID $fTop
+ if ($fusid) { $settings['filterUserSettingID'] = 'auto' }
# order
$ordTop = $settingsNode.SelectSingleNode("dcsset:order", $ns)
@@ -2520,6 +2546,8 @@ foreach ($sv in $svNodes) {
if ($ordItems.Count -gt 0) { $settings['order'] = $ordItems }
$ovm = Get-BlockVM $ordTop
if ($null -ne $ovm) { $settings['orderViewMode'] = $ovm }
+ $ousid = Get-BlockUSID $ordTop
+ if ($ousid) { $settings['orderUserSettingID'] = 'auto' }
# conditionalAppearance
$caTop = $settingsNode.SelectSingleNode("dcsset:conditionalAppearance", $ns)
@@ -2529,6 +2557,8 @@ foreach ($sv in $svNodes) {
}
$cavm = Get-BlockVM $caTop
if ($null -ne $cavm) { $settings['conditionalAppearanceViewMode'] = $cavm }
+ $causid = Get-BlockUSID $caTop
+ if ($causid) { $settings['conditionalAppearanceUserSettingID'] = 'auto' }
# outputParameters
$opTop = $settingsNode.SelectSingleNode("dcsset:outputParameters", $ns)