From 609698b00d7dd59e0335a84a0a67bd0fc4a74d01 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 24 May 2026 20:38:10 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd):=20multi-value=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20(valueListAllowed=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE?= =?UTF-8?q?=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Параметр с valueListAllowed=true может иметь несколько элементов подряд — список значений по умолчанию (например список счетов плана). Раньше decompile читал только первый (SelectSingleNode), compile эмитил один → терялись все остальные значения. DSL: value в параметре может быть массивом строк (или native bool/int/double). decompile: SelectNodes("r:value") → если >1 элемент, value = array. compile (PS+Py): если value — array, эмитим каждый отдельным через Emit-ParamValue. Альт-indent корпус: 18009 → 17946 строк diff. --- .../skd-compile/scripts/skd-compile.ps1 | 10 +++++++- .../skills/skd-compile/scripts/skd-compile.py | 6 ++++- .../skd-decompile/scripts/skd-decompile.ps1 | 23 +++++++++++++++---- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index 68f38e1a..80f01234 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.100 — Compile 1C DCS from JSON +# skd-compile v1.101 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -1298,6 +1298,10 @@ function Emit-SingleParam { # Value — for valueListAllowed params Designer omits when empty $vla = [bool]$parsed.valueListAllowed + # Multi-value (массив значений по умолчанию для valueListAllowed-параметра) — эмитим + # каждый отдельным . Различаем массив значений от composite type (тоже array, + # но в parsed.type). + $valIsArray = ($parsed.value -is [array]) -or ($parsed.value -is [System.Collections.IList] -and $parsed.value -isnot [string]) if ($parsed.type -is [array] -or $parsed.type -is [System.Collections.IList]) { # Composite type — Designer writes xsi:nil for any empty composite; # non-empty composite values are uncommon and would need per-type tagging. @@ -1307,6 +1311,10 @@ function Emit-SingleParam { } elseif ($parsed.nilValue -eq $true) { # Принудительный xsi:nil даже когда тип известен (для bit-perfect round-trip). if (-not $vla) { X "`t`t" } + } elseif ($valIsArray) { + foreach ($v in @($parsed.value)) { + Emit-ParamValue -type $parsed.type -val $v -indent "`t`t" -valueListAllowed $false + } } else { Emit-ParamValue -type $parsed.type -val $parsed.value -indent "`t`t" -valueListAllowed $vla } diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 4bfdcd30..d3e855fe 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.100 — Compile 1C DCS from JSON +# skd-compile v1.101 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -1122,6 +1122,10 @@ def emit_single_param(lines, p, parsed): # Принудительный xsi:nil даже когда тип известен (для bit-perfect round-trip). if not vla: lines.append('\t\t') + elif isinstance(parsed.get('value'), list): + # Multi-value (массив значений по умолчанию для valueListAllowed-параметра). + for v in parsed['value']: + emit_param_value(lines, p_type, v, '\t\t', False) else: emit_param_value(lines, p_type, parsed.get('value'), '\t\t', vla) diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index b85a4ed5..8c3f9625 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.84 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.85 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -758,11 +758,26 @@ function Build-Parameter { $valueTypeNode = $pNode.SelectSingleNode("r:valueType", $ns) $typeShort = Get-ValueTypeShorthand $valueTypeNode - # value - $valueNode = $pNode.SelectSingleNode("r:value", $ns) + # value — может быть несколько (valueListAllowed: список значений по умолчанию). + $valueNodes = $pNode.SelectNodes("r:value", $ns) $valueDisplay = $null $valueIsNil = $false - if ($valueNode) { + if ($valueNodes.Count -gt 1) { + # Multi-value (список значений по умолчанию для параметра-списка) + $valueArr = @() + foreach ($vn in $valueNodes) { + $vt = Get-LocalXsiType $vn + $vTxt = $vn.InnerText + if ($vt -eq 'boolean') { $valueArr += ($vTxt -eq 'true') } + elseif ($vt -eq 'decimal') { + if ($vTxt -match '^-?\d+$') { $valueArr += [int]$vTxt } + else { $valueArr += [double]$vTxt } + } else { $valueArr += $vTxt } + } + $valueDisplay = $valueArr + } + elseif ($valueNodes.Count -eq 1) { + $valueNode = $valueNodes[0] $nil = $valueNode.GetAttribute("nil", $NS_XSI) if ($nil -eq 'true') { $valueIsNil = $true } else {