mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-11 16:34:57 +03:00
feat(skd): multi-value параметры (valueListAllowed список значений по умолчанию)
Параметр с valueListAllowed=true может иметь несколько <value> элементов
подряд — список значений по умолчанию (например список счетов плана).
Раньше decompile читал только первый (SelectSingleNode), compile эмитил
один <value> → терялись все остальные значения.
DSL: value в параметре может быть массивом строк (или native bool/int/double).
decompile: SelectNodes("r:value") → если >1 элемент, value = array.
compile (PS+Py): если value — array, эмитим каждый отдельным <value>
через Emit-ParamValue.
Альт-indent корпус: 18009 → 17946 строк diff.
This commit is contained in:
@@ -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 <value> when empty
|
||||
$vla = [bool]$parsed.valueListAllowed
|
||||
# Multi-value (массив значений по умолчанию для valueListAllowed-параметра) — эмитим
|
||||
# каждый отдельным <value>. Различаем массив значений от 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<value xsi:nil=`"true`"/>" }
|
||||
} 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
|
||||
}
|
||||
|
||||
@@ -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<value xsi:nil="true"/>')
|
||||
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)
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user