feat(skd-decompile): чтение availableValues на полях dataSet

Build-Field теперь читает <availableValue> на DataSetFieldField,
типизирует value по xsi:type (boolean/decimal/string/dateTime),
сохраняет presentation как multilang dict если возможно.

Поле переходит в object form если есть availableValues.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-22 17:25:18 +03:00
parent b58f9aa6a2
commit e5e6392b8c
@@ -1,4 +1,4 @@
# skd-decompile v0.25 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# skd-decompile v0.26 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -540,10 +540,33 @@ function Build-Field {
$appNode = $fieldNode.SelectSingleNode("r:appearance", $ns)
$appearance = Get-AppearanceDict $appNode
$presExpr = Get-Text $fieldNode "r:presentationExpression"
# availableValues on dataset field
$avNodes = $fieldNode.SelectNodes("r:availableValue", $ns)
$availableValues = @()
foreach ($av in $avNodes) {
$avVN = $av.SelectSingleNode("r:value", $ns)
$avPN = $av.SelectSingleNode("r:presentation", $ns)
$avEntry = [ordered]@{}
if ($avVN) {
$avType = Get-LocalXsiType $avVN
$avText = $avVN.InnerText
if ($avType -eq 'boolean') { $avEntry['value'] = ($avText -eq 'true') }
elseif ($avType -eq 'decimal') {
if ($avText -match '^-?\d+$') { $avEntry['value'] = [int]$avText }
else { $avEntry['value'] = [double]$avText }
}
else { $avEntry['value'] = $avText }
}
if ($avPN) {
$avPres = Get-MLText $avPN
if ($avPres) { $avEntry['presentation'] = $avPres }
}
$availableValues += $avEntry
}
# Можно ли роль положить в shorthand-строку?
$roleInString = $roleRendered -and $roleRendered.isString
$needsObject = $title -or $appearance -or $presExpr -or ($typeShort -is [array]) -or ($roleRendered -and -not $roleInString) -or $orderExpression -or $inputParameters
$needsObject = $title -or $appearance -or $presExpr -or ($typeShort -is [array]) -or ($roleRendered -and -not $roleInString) -or $orderExpression -or $inputParameters -or ($availableValues.Count -gt 0)
if (-not $needsObject) {
# shorthand: "Name: type @role K=V #restrict"
@@ -575,6 +598,7 @@ function Build-Field {
if ($inputParameters) { $obj['inputParameters'] = $inputParameters }
if ($restrictTokens) { $obj['restrict'] = ($restrictTokens | ForEach-Object { $_ -replace '^#','' }) }
if ($presExpr) { $obj['presentationExpression'] = $presExpr }
if ($availableValues.Count -gt 0) { $obj['availableValues'] = $availableValues }
if ($appearance) { $obj['appearance'] = $appearance }
return $obj
}