From a07a10502465aaad5f609a65f68ce13c89aa7d3d Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 22 May 2026 20:06:47 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd-decompile):=20inputParameters=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=85=20+=20multilang=20presentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Три связанных закрытия: - Build-Parameter вызывает Read-InputParameters (раньше только Field) - Read-InputParameters читает LocalStringType value как multilang dict (ФорматРедактирования и т.п.) - Build-FilterItem (FilterItemComparison) читает с поддержкой multilang (Get-MLText + fallback InnerText); item переходит в object form при наличии presentation. Эффект на sample30: −533 строки diff. Co-Authored-By: Claude Opus 4.7 --- .../skd-decompile/scripts/skd-decompile.ps1 | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index ca4b54dd..8afcef12 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.37 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.38 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -488,6 +488,10 @@ function Read-InputParameters { $cpl += $cplEntry } $entry['choiceParameterLinks'] = $cpl + } elseif ($vType -eq 'LocalStringType') { + # Multilang dict {ru, en, ...} + $ml = Get-MLText $val + if ($ml) { $entry['value'] = $ml } else { $entry['value'] = '' } } else { # Simple typed value $txt = $val.InnerText @@ -714,6 +718,7 @@ function Build-Parameter { $useAttr = Get-Text $pNode "r:use" $useRestriction = (Get-Text $pNode "r:useRestriction") -eq 'true' $expression = Get-Text $pNode "r:expression" + $inputParameters = Read-InputParameters -parentNode $pNode # hidden — combo: availableAsField=false + useRestriction=true (как эмитит compile @hidden) $notAField = ($availableAsField -eq 'false') $hidden = $notAField -and $useRestriction @@ -746,6 +751,7 @@ function Build-Parameter { useRestriction = $useRestriction expression = $expression availableValues = $availableValues + inputParameters = $inputParameters } return $result } @@ -771,6 +777,7 @@ function Render-Parameter { # explicit denyIncomplete/use without @autoDates, useRestriction without autoDates, expression set $needsObject = $false if ($p.availableValues -and $p.availableValues.Count -gt 0) { $needsObject = $true } + if ($p.inputParameters) { $needsObject = $true } if ($titleNeedsObject) { $needsObject = $true } if ($typeIsArray) { $needsObject = $true } if ($valueIsDict) { $needsObject = $true } @@ -804,6 +811,7 @@ function Render-Parameter { if ($p.autoDates) { $obj['autoDates'] = $true } if ($p.expression) { $obj['expression'] = $p.expression } if ($p.availableValues -and $p.availableValues.Count -gt 0) { $obj['availableValues'] = $p.availableValues } + if ($p.inputParameters) { $obj['inputParameters'] = $p.inputParameters } return $obj } @@ -1373,6 +1381,13 @@ function Build-FilterItem { $vmNode = $itemNode.SelectSingleNode("dcsset:viewMode", $ns) $viewMode = if ($vmNode) { $vmNode.InnerText } else { $null } $userPresNode = $itemNode.SelectSingleNode("dcsset:userSettingPresentation", $ns) + # presentation (multilang or string) на самом filter item + $fiPresNode = $itemNode.SelectSingleNode("dcsset:presentation", $ns) + $fiPres = $null + if ($fiPresNode) { + $fiPres = Get-MLText $fiPresNode + if (-not $fiPres) { $fiPres = $fiPresNode.InnerText } + } $flags = @() if ($use -eq 'false') { $flags += '@off' } @@ -1389,9 +1404,10 @@ function Build-FilterItem { # Переход в object form: # - userSettingPresentation, - # - массивное value (multi-right или пустой ValueList), - # - явный valueType (например, dcscor:Field — field-to-field comparison) - if ($userPresNode -or $valueIsArrayFlag -or $valueTypeAttr) { + # - massivное value (multi-right или пустой ValueList), + # - явный valueType (например, dcscor:Field — field-to-field comparison), + # - presentation на item (multilang или просто текст) + if ($userPresNode -or $valueIsArrayFlag -or $valueTypeAttr -or $fiPres) { $obj = [ordered]@{ field = $field; op = $op } if ($op -notin $noValueOps -and $null -ne $value) { if ($valueIsArrayFlag) { @@ -1406,6 +1422,7 @@ function Build-FilterItem { if ($valueTypeAttr) { $obj['valueType'] = $valueTypeAttr } if ($use -eq 'false') { $obj['use'] = $false } if ($userId) { $obj['userSettingID'] = 'auto' } + if ($fiPres) { $obj['presentation'] = $fiPres } if ($viewMode) { $obj['viewMode'] = $viewMode } if ($userPresNode) { $obj['userSettingPresentation'] = Get-MLText $userPresNode } return $obj