feat(form-decompile,form-compile): измерения планировщика (dimensions) — Planner Phase 1

Расширение Phase 1 кластера Chart-Settings: реквизит pl:Planner теперь несёт
измерения планировщика (<pl:dimension> — «Измерения» в конфигураторе) с элементами.

DSL planner.dimensions[]: объект разреза (value — ссылка xr:DesignTimeRef или nil,
text-заголовок, цвета, font) + elements[] (элементы измерения, РЕКУРСИВНЫ — могут
нести вложенные elements, как показывает UI колонкой «Элементы»; поле
showOnlySubordinatesAreas). Тип value авто-выводится: ссылочный вид →
xsi:type="xr:DesignTimeRef", иначе xs:string. Пустой текст → самозакрывающийся
<pl:text/> (как в выгрузке). Общие хелперы Emit/Get-PlannerValue/Text применены
и к элементам расписания (items).

Раундтрип бит-в-бит: синтетика upload/epf/Диаграммы (items + 2 dimensions +
вложенные elements + period). Зеркало py (ps1==py байт-в-байт). Кейс chart-fields
расширен измерением (nil-разрез + xs:string-элемент + showOnlySubordinatesAreas),
сертифицирован загрузкой в 1С. Регресс 41/41 (ps1+py).

Ограничение: item.dimensionValues (привязка элемента расписания к элементам
измерений) пока всегда пустой.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-10 13:57:54 +03:00
co-authored by Claude Opus 4.8
parent f064d53eb2
commit f534add7b4
6 changed files with 192 additions and 21 deletions
@@ -1,4 +1,4 @@
# form-decompile v0.80 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.81 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -1838,6 +1838,13 @@ function Decompile-Element {
# Полный захват каждого поля (раундтрип бит-в-бит); зеркало Emit-PlannerSettings.
function PLD-Bool { param($v) if ($null -eq $v) { return $null } return ($v -eq 'true') }
function PLD-Int { param($v) if ($null -eq $v) { return $null } return [int]$v }
# <pl:value> → текст (тип xr:DesignTimeRef/xs:string выводится компилятором из вида значения); nil → $null.
function Get-PlannerValue {
param($node)
if (-not $node) { return $null }
if ($node.GetAttribute('nil', $NS_XSI) -eq 'true') { return $null }
if ($node.InnerText) { return $node.InnerText } else { return $null }
}
function Build-PlannerFont {
param($node)
if (-not $node) { return $null }
@@ -1877,6 +1884,37 @@ function Build-PlannerItem {
$o['editMode'] = (Get-Child $itn 'editMode')
return $o
}
function Build-PlannerDimElement {
param($eln)
$o = [ordered]@{}
$v = Get-PlannerValue ($eln.SelectSingleNode("*[local-name()='value']")); if ($null -ne $v) { $o['value'] = $v }
$o['text'] = (Get-Child $eln 'text')
$o['borderColor'] = (Get-Child $eln 'borderColor')
$o['backColor'] = (Get-Child $eln 'backColor')
$o['textColor'] = (Get-Child $eln 'textColor')
$fnt = Build-PlannerFont ($eln.SelectSingleNode("*[local-name()='font']")); if ($fnt) { $o['font'] = $fnt }
$subs = New-Object System.Collections.ArrayList
foreach ($s in @($eln.SelectNodes("*[local-name()='item']"))) { [void]$subs.Add((Build-PlannerDimElement $s)) }
if ($subs.Count -gt 0) { $o['elements'] = @($subs) }
$sos = Get-Child $eln 'showOnlySubordinatesAreas'; if ($null -ne $sos) { $o['showOnlySubordinatesAreas'] = ($sos -eq 'true') }
$o['textFormatted'] = (PLD-Bool (Get-Child $eln 'textFormatted'))
return $o
}
function Build-PlannerDimension {
param($dn)
$o = [ordered]@{}
$v = Get-PlannerValue ($dn.SelectSingleNode("*[local-name()='value']")); if ($null -ne $v) { $o['value'] = $v }
$o['text'] = (Get-Child $dn 'text')
$o['borderColor'] = (Get-Child $dn 'borderColor')
$o['backColor'] = (Get-Child $dn 'backColor')
$o['textColor'] = (Get-Child $dn 'textColor')
$fnt = Build-PlannerFont ($dn.SelectSingleNode("*[local-name()='font']")); if ($fnt) { $o['font'] = $fnt }
$els = New-Object System.Collections.ArrayList
foreach ($e in @($dn.SelectNodes("*[local-name()='item']"))) { [void]$els.Add((Build-PlannerDimElement $e)) }
if ($els.Count -gt 0) { $o['elements'] = @($els) }
$o['textFormatted'] = (PLD-Bool (Get-Child $dn 'textFormatted'))
return $o
}
function Build-PlannerLevel {
param($lvn)
$o = [ordered]@{}
@@ -1924,6 +1962,12 @@ function Build-PlannerSettings {
foreach ($itn in $itemNodes) { [void]$items.Add((Build-PlannerItem $itn)) }
$pl['items'] = @($items)
}
$dimNodes = @($setNode.SelectNodes("*[local-name()='dimension']"))
if ($dimNodes.Count -gt 0) {
$dims = New-Object System.Collections.ArrayList
foreach ($dn in $dimNodes) { [void]$dims.Add((Build-PlannerDimension $dn)) }
$pl['dimensions'] = @($dims)
}
$pl['borderColor'] = (Get-Child $setNode 'borderColor')
$pl['backColor'] = (Get-Child $setNode 'backColor')
$pl['textColor'] = (Get-Child $setNode 'textColor')