mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-04 01:00:52 +03:00
fix(meta-decompile,meta-compile): пустая ссылка в ChoiceParameters теряла тип
Раундтрип по справочникам УТ 11.5.27 вскрыл: <app:value xsi:type="xr:DesignTimeRef"/>
с пустым содержимым декомпилировался в "value": "", и компилятор законно
эмитил свой дефолт xs:string — тип ссылки терялся.
Конвенция для этого случая уже была (маркер {emptyRef: true} у fillValue),
пробел был только в ChoiceParameters. Декомпилятор теперь ставит маркер,
компилятор его понимает — и в скалярном значении, и внутри FixedArray.
Форма редкая, поэтому прежние кампании её не поймали: в acc она встречается
1 раз, в erp — ни разу, в УТ — 7 раз.
Is-EmptyRef в PS явно отсекает коллекции: у массива $v.emptyRef разворачивается
в свойства элементов (member enumeration), и массив с одним таким элементом
схлопывал FixedArray в скаляр. В py-порте isinstance(v, dict) такого не допускает —
расхождение поймано снэпшотом.
Проверка: справочники УТ 519/519 без расхождений (было 519 diff),
сюита meta-compile 76/76 на обоих портах, 1С-сертификация кейса пройдена.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2067778ba3
commit
75e861da6e
@@ -1,4 +1,4 @@
|
||||
# meta-compile v1.69 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.70 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -1612,6 +1612,15 @@ function ConvertFrom-ChLinkShorthand {
|
||||
|
||||
# <ChoiceParameters> — [{name, value?}]. Значение ПРЯМО на app:value (xsi:type=тип); массив → v8:FixedArray
|
||||
# с детьми v8:Value; без value → app:value nil.
|
||||
# Маркер пустой ссылки от декомпилятора: {emptyRef: true}. Работает и на Hashtable, и на PSCustomObject.
|
||||
# Массивы отсекаем ЯВНО: у коллекции `$v.emptyRef` разворачивается в свойства элементов (member
|
||||
# enumeration), и массив с одним таким элементом дал бы -eq $true → FixedArray схлопнулся бы в скаляр.
|
||||
function Is-EmptyRef($v) {
|
||||
if ($null -eq $v -or $v -is [string]) { return $false }
|
||||
if (($v -is [System.Array]) -or ($v -is [System.Collections.IList])) { return $false }
|
||||
return ($v.emptyRef -eq $true)
|
||||
}
|
||||
|
||||
function Emit-ChoiceParameters {
|
||||
param([string]$indent, $cp, [string]$tag = 'ChoiceParameters')
|
||||
if (-not $cp -or @($cp).Count -eq 0) { X "$indent<$tag/>"; return }
|
||||
@@ -1632,9 +1641,13 @@ function Emit-ChoiceParameters {
|
||||
X "$indent`t<app:item name=`"$(Esc-Xml "$name")`">"
|
||||
if (-not $hasVal) {
|
||||
X "$indent`t`t<app:value xsi:nil=`"true`"/>"
|
||||
} elseif ((Is-EmptyRef $val)) {
|
||||
# Пустая ссылка (маркер декомпилятора emptyRef) — тип обязан остаться DesignTimeRef.
|
||||
X "$indent`t`t<app:value xsi:type=`"xr:DesignTimeRef`"/>"
|
||||
} elseif ($valIsArray) {
|
||||
X "$indent`t`t<app:value xsi:type=`"v8:FixedArray`">"
|
||||
foreach ($v in $val) {
|
||||
if (Is-EmptyRef $v) { X "$indent`t`t`t<v8:Value xsi:type=`"xr:DesignTimeRef`"/>"; continue }
|
||||
$norm = Normalize-ChoiceValueT $v $ptype
|
||||
if ([string]::IsNullOrEmpty($norm.Text)) { X "$indent`t`t`t<v8:Value xsi:type=`"$($norm.XsiType)`"/>" }
|
||||
else { X "$indent`t`t`t<v8:Value xsi:type=`"$($norm.XsiType)`">$(Esc-Xml $norm.Text)</v8:Value>" }
|
||||
|
||||
Reference in New Issue
Block a user