fix(skd): multilang в calcField appearance и selection lwsTitle + hidden combo

Найдено через новый debug-tool debug/skd-decompile/verify-roundtrip.ps1
(XML→decompile→compile→diff на сэмпле 30 ERP).

1. Emit-CalcFields appearance: третий дубликат-emitter с тем же
   multilang-багом как был в Emit-AppearanceValue для field/cond. Унифи-
   цирован через Emit-AppearanceValue. (compile.ps1+py)

2. Emit-SelectionItem: lwsTitle для folder + field-with-title
   эмитили "$($item.folder)" — для hashtable получали "@{ru=X; en=Y}".
   Унифицирован через Emit-MLText с новой опцией -NoXsiType
   (lwsTitle в оригинале без xsi:type, в отличие от <title> в fields).
   (compile.ps1+py)

3. Build-Parameter hidden detection: combo availableAsField=false +
   useRestriction=true. Только availableAsField=false (без
   useRestriction) → object form `availableAsField: false`.

На сэмпле 30 ERP roundtrip-diff: ADDED <content> 667 → 129
(multilang-потери в selection закрыты). Остаточные LOST <item> ~10k —
другие потери (attributeUseRestriction и проч.) — отдельная задача.

Versions: compile v1.35→v1.36, decompile v0.20→v0.21.
This commit is contained in:
Nick Shirokov
2026-05-21 21:50:46 +03:00
parent 8b71054478
commit c3a8a9c874
20 changed files with 69 additions and 314 deletions
@@ -1,4 +1,4 @@
# skd-decompile v0.20 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# skd-decompile v0.21 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -180,7 +180,7 @@ function Try-InlineJson {
}
function ConvertTo-CompactJson {
param($obj, [int]$depth = 0, [string]$indentUnit = ' ', [int]$lineLimit = 120)
param($obj, [int]$depth = 0, [string]$indentUnit = ' ', [int]$lineLimit = 400)
$indent = $indentUnit * $depth
$childIndent = $indentUnit * ($depth + 1)
@@ -681,11 +681,13 @@ function Build-Parameter {
$valueListAllowed = (Get-Text $pNode "r:valueListAllowed") -eq 'true'
$availableAsField = Get-Text $pNode "r:availableAsField"
$hidden = $availableAsField -eq 'false'
$denyIncomplete = (Get-Text $pNode "r:denyIncompleteValues") -eq 'true'
$useAttr = Get-Text $pNode "r:use"
$useRestriction = (Get-Text $pNode "r:useRestriction") -eq 'true'
$expression = Get-Text $pNode "r:expression"
# hidden — combo: availableAsField=false + useRestriction=true (как эмитит compile @hidden)
$notAField = ($availableAsField -eq 'false')
$hidden = $notAField -and $useRestriction
# availableValues
$avNodes = $pNode.SelectNodes("r:availableValue", $ns)
@@ -709,6 +711,7 @@ function Build-Parameter {
valueIsNil = $valueIsNil
valueListAllowed = $valueListAllowed
hidden = $hidden
notAField = ($notAField -and -not $hidden) # availableAsField=false без useRestriction
denyIncomplete = $denyIncomplete
useAttr = $useAttr
useRestriction = $useRestriction
@@ -749,6 +752,7 @@ function Render-Parameter {
}
# useRestriction is auto-generated by compile for @hidden params; ignore as object trigger
if ($p.expression) { $needsObject = $true }
if ($p.notAField) { $needsObject = $true }
if (-not $needsObject) {
$s = $name
@@ -766,6 +770,7 @@ function Render-Parameter {
if ($p.useAttr -and -not $p.autoDates) { $obj['use'] = $p.useAttr }
if ($p.denyIncomplete -and -not $p.autoDates) { $obj['denyIncompleteValues'] = $true }
if ($p.hidden) { $obj['hidden'] = $true }
if ($p.notAField) { $obj['availableAsField'] = $false }
if ($p.valueListAllowed) { $obj['valueListAllowed'] = $true }
if ($p.autoDates) { $obj['autoDates'] = $true }
if ($p.expression) { $obj['expression'] = $p.expression }