From 03cc59d2432dbe211432e39a085077400b647dd9 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 22 May 2026 18:19:20 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd-decompile):=20=D1=87=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20multi-right=20=D0=B8=20ValueListType=20=D0=B2=20?= =?UTF-8?q?filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Build-FilterItem теперь читает все элементы (раньше только первый — терялись значения для InList с несколькими values). Первый типа v8:ValueListType трактуется как пустой list-placeholder (`value: []` в JSON). Item переходит в object form если value — массив (shorthand не выразим для multi-value/empty-list). Shorthand fallback для null/empty value теперь снова `_` (placeholder). Co-Authored-By: Claude Opus 4.7 --- .../skd-decompile/scripts/skd-decompile.ps1 | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index 43236bf3..c6be3e03 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.31 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.32 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1317,8 +1317,27 @@ function Build-FilterItem { $ct = Get-Text $itemNode "dcsset:comparisonType" $op = $script:filterOpMap[$ct] if (-not $op) { $op = $ct } - $rightNode = $itemNode.SelectSingleNode("dcsset:right", $ns) - $value = Get-FilterValue $rightNode + + # Чтение : один, несколько (InList multi-value) или ValueListType (пустой list-placeholder) + $rightNodes = @($itemNode.SelectNodes("dcsset:right", $ns)) + $value = $null + $valueIsArrayFlag = $false + if ($rightNodes.Count -eq 1) { + $rn = $rightNodes[0] + if ((Get-LocalXsiType $rn) -eq 'ValueListType') { + # Пустой список-placeholder для пользовательских настроек InList + $value = @() + $valueIsArrayFlag = $true + } else { + $value = Get-FilterValue $rn + } + } elseif ($rightNodes.Count -gt 1) { + # Несколько значений → массив (InList с конкретными значениями) + $arr = @() + foreach ($rn in $rightNodes) { $arr += (Get-FilterValue $rn) } + $value = $arr + $valueIsArrayFlag = $true + } $use = Get-Text $itemNode "dcsset:use" $userId = Get-Text $itemNode "dcsset:userSettingID" @@ -1337,11 +1356,22 @@ function Build-FilterItem { # nullity ops have no value $noValueOps = @('filled','notFilled') - # Переход в object form: userSettingPresentation ИЛИ явный viewMode=Normal - # (Normal не выразим в shorthand, а отсутствие тоже нужно сохранить) - if ($userPresNode -or $viewMode -eq 'Normal') { + # Переход в object form: + # - userSettingPresentation, + # - явный viewMode=Normal (отсутствие тоже нужно сохранить), + # - массивное value (multi-right или пустой ValueList) + if ($userPresNode -or $viewMode -eq 'Normal' -or $valueIsArrayFlag) { $obj = [ordered]@{ field = $field; op = $op } - if ($op -notin $noValueOps -and $null -ne $value) { $obj['value'] = $value } + if ($op -notin $noValueOps -and $null -ne $value) { + if ($valueIsArrayFlag) { + # Принудительный массив (для empty ValueList тоже) + $arrAsList = New-Object System.Collections.ArrayList + foreach ($vv in @($value)) { [void]$arrAsList.Add($vv) } + $obj['value'] = $arrAsList + } else { + $obj['value'] = $value + } + } if ($use -eq 'false') { $obj['use'] = $false } if ($userId) { $obj['userSettingID'] = 'auto' } if ($viewMode) { $obj['viewMode'] = $viewMode } @@ -1354,7 +1384,8 @@ function Build-FilterItem { if ($op -in $noValueOps) { $s += " $op" } else { - $s += " $op $value" + $vDisplay = if ($null -ne $value -and "$value" -ne '') { "$value" } else { '_' } + $s += " $op $vDisplay" } if ($flags) { $s += ' ' + ($flags -join ' ') } return $s