feat(form-decompile,form-compile): StandardBeginningDate в значении фильтра — структурно {variant, date?}

Значение фильтра типа v8:StandardBeginningDate (стандартная дата начала) серилизуется
структурно: <v8:variant xsi:type="v8:StandardBeginningDateVariant">Custom</v8:variant>
+ <v8:date>… (Custom несёт дату; именованные варианты — без). Компилятор эмитил
плоскую склейку InnerText (Custom3999-12-31T23:59:59), декомпилятор брал
сцепленный текст. Корпус 8.3.24: 307 случаев (Custom 280 с датой, BeginningOfThisDay
23, …Week 3, …Year 1; StandardEndDate/StandardPeriod как значение фильтра не
встречаются, но обработаны симметрично).

Не «забытый порт» — skd-decompile тоже не структурирует SBD в filter right (только в
dataParameters). DSL: value = {variant, date?} + valueType="v8:StandardBeginningDate".
Декомпилятор Get-FilterValueWithType читает variant/date; компилятор Emit-FilterItem
эмитит структурно (variant xsi:type выводится из valueType). Зеркало py.

Форма УправлениеОбменом (ДатаЗакрытия = SBD, op Equal): SBD-потерь 0 (остаток diff —
несвязанный TitleFont/FooterText). Кейс input-fields (+CA фильтр SBD Custom+date и
именованный вариант) сертифицирован в 1С, round-trip декомпиляции подтверждён.
Регресс 43/43.

ОТДЕЛЬНАЯ НАХОДКА (не в этом коммите): операторы Filled/NotFilled несут
тип-зависимый плейсхолдер <dcsset:right> (пустой xs:string для строк, SBD с дефолт.
датой для дат), который декомпилятор дропает как беззначный — нужен отдельный фикс.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-11 18:25:24 +03:00
co-authored by Claude Opus 4.8
parent 459d3feb69
commit 3ce71d436f
6 changed files with 92 additions and 5 deletions
@@ -1,4 +1,4 @@
# form-decompile v0.92 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.93 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -465,6 +465,15 @@ function Get-FilterValueWithType {
if ($vType -eq 'LocalStringType') {
return @{ value = (Get-MLText $valNode); type = $rawType }
}
# Стандартная дата начала/окончания — структурное значение {variant, date?}
# (Custom несёт <v8:date>; именованные варианты — без даты). Иначе InnerText склеивал variant+date.
if ($vType -eq 'StandardBeginningDate' -or $vType -eq 'StandardEndDate') {
$variantN = $valNode.SelectSingleNode("v8:variant", $ns)
$dateN = $valNode.SelectSingleNode("v8:date", $ns)
$o = [ordered]@{ variant = if ($variantN) { $variantN.InnerText } else { '' } }
if ($dateN) { $o['date'] = $dateN.InnerText }
return @{ value = $o; type = $rawType }
}
$txt = $valNode.InnerText
if (-not $txt) { return @{ value = '_'; type = $rawType } }
if ($vType -eq 'boolean') { return @{ value = ($txt -eq 'true'); type = $rawType } }