fix(skd): empty xs:string placeholder в SettingsParameterValue use=false

Параметр типа DateTime в dataParameters внутри settings с use=false и
без значения сохраняется оригиналом как <dcscor:value xsi:type="xs:string"/>
(пустой placeholder), а не xsi:nil. См. АнализПлановыхНачислений @1506
для ОкончаниеПериода.

decompile: detect-ит empty xs:string + use=false → object form
{parameter, use:false, value:'', valueType:'xs:string'}.
compile: Emit-EmptyValue нормализует префикс xs: (xs:string → ^string),
теперь корректно эмитит пустой xs:string вместо fallback xsi:nil.

PS и Py синхронизированы.
This commit is contained in:
Nick Shirokov
2026-05-24 15:56:28 +03:00
parent abca61da66
commit 2ad35f484c
3 changed files with 25 additions and 12 deletions
@@ -1868,12 +1868,21 @@ function Build-DataParameters {
# Compare to top-level default
if ($tp -and $tp.valueDisplay -ne $vDisplay) { $canAuto = $false }
if (-not $tp) { $canAuto = $false } # extra param not in top-level
# Object form требуется если есть viewMode / userSettingPresentation / StandardPeriod-с-датами
if ($stdPeriodObj -or $vmN -or $uspN) {
# Empty xs:string + use=false — оригинальный placeholder для disabled-параметра
# (используется для типа DateTime в settings; см. АнализПлановыхНачислений @1506).
# Сохраняем явный valueType чтобы compile эмитил <value xsi:type="xs:string"/>
# вместо xsi:nil.
$isEmptyStringPlaceholder = ($vt -eq 'string') -and (-not $valNode.InnerText) -and ($use -eq 'false')
if ($isEmptyStringPlaceholder) { $canAuto = $false }
# Object form требуется если есть viewMode / userSettingPresentation / StandardPeriod-с-датами / xs:string-placeholder
if ($stdPeriodObj -or $vmN -or $uspN -or $isEmptyStringPlaceholder) {
$obj = [ordered]@{ parameter = $pn }
if ($stdPeriodObj) {
$obj['value'] = $stdPeriodObj
# valueType не нужен — compile определит StandardPeriod по value.variant
} elseif ($isEmptyStringPlaceholder) {
$obj['value'] = ''
$obj['valueType'] = 'xs:string'
} elseif ($null -ne $vDisplay -and $vDisplay -ne '') {
# Конвертация для типизированных значений (compile различает по типу JSON)
if ($vt -eq 'boolean') { $obj['value'] = ($vDisplay -eq 'true') }