feat(skd): StandardBeginningDate в dataParameters через shape inference

Раньше StandardBeginningDate (используется когда top-level param имеет
тип xs:dateTime + UI выбор "Начало дня"/"Custom") декомпилировалась
через InnerText: variant+date конкатенировались в "Custom2022-10-25..."
и compile эмитил как xs:string.

Cross-reference на корпусе (671 отчёт):
  608 v8:StandardPeriod → v8:StandardPeriod
  180 xs:dateTime       → v8:StandardBeginningDate
  120 xs:dateTime       → xs:dateTime (raw)

Decompile теперь сохраняет SBD как объект {variant, date} (без @type marker).
Compile различает SP/SBD по форме value:
  {variant, date}                 → SBD
  {variant, startDate, endDate}   → SP с датами
  {variant} only                  → инференс по имени (BeginningOf* → SBD)

В корпусе ни одного ambiguous (variant=Custom без полей) не существует:
все 33 SBD/Custom имеют date, все 93 SP/Custom — startDate/endDate.

sample30: −22 строки (932 → 910).
This commit is contained in:
Nick Shirokov
2026-05-23 22:29:34 +03:00
parent f642f673d9
commit a7344a1397
3 changed files with 81 additions and 30 deletions
@@ -1,4 +1,4 @@
# skd-decompile v0.68 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# skd-decompile v0.69 — Decompile 1C DCS Template.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -1807,6 +1807,8 @@ function Build-DataParameters {
$vDisplay = $null
$stdPeriodObj = $null
if ($vt -eq 'StandardPeriod') {
# Shape inference в compile: {variant, startDate, endDate} → SP с датами,
# {variant} only с SP-вариантом (ThisMonth/Custom/etc) → SP без дат.
$variant = Get-Text $valNode "v8:variant"
$sd = Get-Text $valNode "v8:startDate"
$ed = Get-Text $valNode "v8:endDate"
@@ -1817,14 +1819,23 @@ function Build-DataParameters {
if ($ed) { $stdPeriodObj['endDate'] = $ed }
$canAuto = $false
} elseif ($variant) {
# Для shorthand эмитим как строку "Period = ThisMonth"; для object form —
# объектом {variant: ThisMonth}, чтобы compile сгенерировал <v8:variant>
# вместо плоского <value xsi:type="v8:StandardPeriod">ThisMonth</value>.
$vDisplay = $variant
if ($vmN -or $uspN) {
$stdPeriodObj = [ordered]@{ variant = $variant }
}
}
} elseif ($vt -eq 'StandardBeginningDate') {
# Shape inference в compile: {variant, date} → SBD, либо variant начинается с BeginningOf*.
$variant = Get-Text $valNode "v8:variant"
$d = Get-Text $valNode "v8:date"
$hasExplicitDate = $d -and $d -ne '0001-01-01T00:00:00'
if ($hasExplicitDate) {
$stdPeriodObj = [ordered]@{ variant = $variant; date = $d }
$canAuto = $false
} elseif ($variant) {
$stdPeriodObj = [ordered]@{ variant = $variant }
$canAuto = $false
}
} elseif ($vt -eq 'DesignTimeValue') {
$vDisplay = $valNode.InnerText
} elseif ($vt -eq 'LocalStringType') {