feat(form-decompile,form-compile): Planner design-time Settings из ring-3 (Фаза 1 кластера Chart-Settings)

Реквизит planner-типа несёт <Settings xsi:type="pl:Planner"> — встроенный конфиг
поля-планировщика (элементы расписания + оформление/поведение + шкала времени).
Раньше декомпилятор делал fail-ring3 (третий вид Settings после TypeDescription/
DynamicList). Корпус 8.3.24: Planner Settings = 1 реальная форма (КонтактныеЛица/
ФормаЛиды), всё chart-семейство = 38 форм. Решение (с пользователем): структурный
DSL ради возможности модели СОЗДАВАТЬ дашборды/планировщики, не только раундтрипить.

DSL: ключ planner:{…} на реквизите (docs/form-dsl-spec.md):
- items[] (элементы расписания) + appearance/поведение-скаляры + timeScale
  (placement/levels[]/colors) + period;
- цвета verbatim, шрифт {kind:AutoFont}/ref, граница {width,style}, ML-форматы;
- компилятор подставляет дефолты для пропущенных ключей (краткий авторинг),
  декомпилятор — полный захват (раундтрип бит-в-бит).

Снят fail-ring3 для pl:Planner (Chart/GanttChart остаются — Фазы 2/3).
Заодно фикс: d5p1:Dendrogram отсутствовал в specialTypeNs (эмитился без
xmlns-префикса) — добавлен в карту (ps1+py).

Раундтрип бит-в-бит: синтетика upload/epf/Диаграммы (с items+period) +
реальная ФормаЛиды (без items/period, иные значения скаляров). Зеркало py
(ps1==py байт-в-байт). Кейс chart-fields расширен (+planner +dendrogram),
сертифицирован загрузкой в 1С. Регресс 41/41 (ps1+py).

Ограничение Phase 1: dimensions/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:35:10 +03:00
parent 29f288fe1d
commit f064d53eb2
6 changed files with 664 additions and 19 deletions
@@ -1,5 +1,5 @@
{
"name": "Форма с полями диаграмм (без design-time Settings)",
"name": "Форма с полями диаграмм + design-time Settings планировщика",
"preRun": [
{
"script": "meta-compile/scripts/meta-compile",
@@ -20,14 +20,23 @@
{ "graphicalSchema": "Схема", "path": "Схема", "titleLocation": "none", "edit": false },
{ "periodField": "Период", "path": "Период", "titleLocation": "none" },
{ "ganttChart": "Ганта", "path": "Ганта", "titleLocation": "none",
"ganttTable": { "table": "ТаблицаГанта", "path": "Ганта", "height": 3 } }
"ganttTable": { "table": "ТаблицаГанта", "path": "Ганта", "height": 3 } },
{ "dendrogram": "Дендро", "path": "Дендро", "titleLocation": "none" },
{ "planner": "Планировщик", "path": "Планировщик", "titleLocation": "none" }
],
"attributes": [
{ "name": "Объект", "type": "DataProcessorObject.Диаграммы", "main": true },
{ "name": "Диаграмма", "type": "d5p1:Chart" },
{ "name": "Схема", "type": "d5p1:FlowchartContextType" },
{ "name": "Период", "type": "v8:StandardPeriod" },
{ "name": "Ганта", "type": "d5p1:GanttChart" }
{ "name": "Ганта", "type": "d5p1:GanttChart" },
{ "name": "Дендро", "type": "d5p1:Dendrogram" },
{ "name": "Планировщик", "type": "pl:Planner", "planner": {
"items": [
{ "text": "Встреча", "begin": "2026-06-09T01:00:00", "end": "2026-06-09T04:00:00" }
],
"period": { "begin": "2026-06-09T00:00:00", "end": "2026-06-09T23:59:59" }
} }
]
}
}
@@ -65,15 +65,27 @@
</SearchControlAddition>
</Table>
</GanttChartField>
<DendrogramField name="Дендро" id="26">
<DataPath>Дендро</DataPath>
<TitleLocation>None</TitleLocation>
<ContextMenu name="ДендроКонтекстноеМеню" id="27"/>
<ExtendedTooltip name="ДендроРасширеннаяПодсказка" id="28"/>
</DendrogramField>
<PlannerField name="Планировщик" id="29">
<DataPath>Планировщик</DataPath>
<TitleLocation>None</TitleLocation>
<ContextMenu name="ПланировщикКонтекстноеМеню" id="30"/>
<ExtendedTooltip name="ПланировщикРасширеннаяПодсказка" id="31"/>
</PlannerField>
</ChildItems>
<Attributes>
<Attribute name="Объект" id="26">
<Attribute name="Объект" id="32">
<Type>
<v8:Type>cfg:DataProcessorObject.Диаграммы</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Диаграмма" id="27">
<Attribute name="Диаграмма" id="33">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -84,7 +96,7 @@
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.2/data/chart">d5p1:Chart</v8:Type>
</Type>
</Attribute>
<Attribute name="Схема" id="28">
<Attribute name="Схема" id="34">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -95,7 +107,7 @@
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.2/data/graphscheme">d5p1:FlowchartContextType</v8:Type>
</Type>
</Attribute>
<Attribute name="Период" id="29">
<Attribute name="Период" id="35">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -106,7 +118,7 @@
<v8:Type>v8:StandardPeriod</v8:Type>
</Type>
</Attribute>
<Attribute name="Ганта" id="30">
<Attribute name="Ганта" id="36">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
@@ -117,5 +129,123 @@
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.2/data/chart">d5p1:GanttChart</v8:Type>
</Type>
</Attribute>
<Attribute name="Дендро" id="37">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Дендро</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type xmlns:d5p1="http://v8.1c.ru/8.2/data/chart">d5p1:Dendrogram</v8:Type>
</Type>
</Attribute>
<Attribute name="Планировщик" id="38">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Планировщик</v8:content>
</v8:item>
</Title>
<Type>
<v8:Type xmlns:pl="http://v8.1c.ru/8.3/data/planner">pl:Planner</v8:Type>
</Type>
<Settings xmlns:pl="http://v8.1c.ru/8.3/data/planner" xsi:type="pl:Planner">
<pl:item>
<pl:value xsi:nil="true"/>
<pl:text>Встреча</pl:text>
<pl:tooltip/>
<pl:begin>2026-06-09T01:00:00</pl:begin>
<pl:end>2026-06-09T04:00:00</pl:end>
<pl:borderColor>auto</pl:borderColor>
<pl:backColor>auto</pl:backColor>
<pl:textColor>auto</pl:textColor>
<pl:font kind="AutoFont"/>
<pl:dimensionValues/>
<pl:replacementDate>0001-01-01T00:00:00</pl:replacementDate>
<pl:deleted>false</pl:deleted>
<pl:id>UUID-001</pl:id>
<pl:textFormatted>false</pl:textFormatted>
<pl:border width="1">
<v8ui:style xsi:type="v8ui:ControlBorderType">Single</v8ui:style>
</pl:border>
<pl:editMode>EnableEdit</pl:editMode>
</pl:item>
<pl:borderColor>auto</pl:borderColor>
<pl:backColor>auto</pl:backColor>
<pl:textColor>auto</pl:textColor>
<pl:lineColor>auto</pl:lineColor>
<pl:font kind="AutoFont"/>
<pl:beginOfRepresentationPeriod>0001-01-01T00:00:00</pl:beginOfRepresentationPeriod>
<pl:endOfRepresentationPeriod>0001-01-01T00:00:00</pl:endOfRepresentationPeriod>
<pl:alignElementsOfTimeScale>true</pl:alignElementsOfTimeScale>
<pl:displayTimeScaleWrapHeaders>true</pl:displayTimeScaleWrapHeaders>
<pl:displayWrapHeaders>true</pl:displayWrapHeaders>
<pl:timeScaleWrapHeadersFormat>
<v8:item>
<v8:lang>#</v8:lang>
<v8:content>DLF="DD"</v8:content>
</v8:item>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>DLF="DD"</v8:content>
</v8:item>
</pl:timeScaleWrapHeadersFormat>
<pl:periodicVariantUnit>Day</pl:periodicVariantUnit>
<pl:periodicVariantRepetition>1</pl:periodicVariantRepetition>
<pl:timeScaleWrapBeginIndent>0</pl:timeScaleWrapBeginIndent>
<pl:timeScaleWrapEndIndent>0</pl:timeScaleWrapEndIndent>
<pl:timeScale>
<placement xmlns="http://v8.1c.ru/8.2/data/chart">Left</placement>
<level xmlns="http://v8.1c.ru/8.2/data/chart">
<measure>Hour</measure>
<interval>1</interval>
<show>true</show>
<line width="1" gap="false">
<v8ui:style xsi:type="v8ui:ChartLineType">Solid</v8ui:style>
</line>
<scaleColor>auto</scaleColor>
<dayFormatRule>MonthDayWeekDay</dayFormatRule>
<format>
<v8:item>
<v8:lang>#</v8:lang>
<v8:content>DF="HH:mm"</v8:content>
</v8:item>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>DF="HH:mm"</v8:content>
</v8:item>
</format>
<labels>
<ticks>0</ticks>
</labels>
<backColor>auto</backColor>
<textColor>auto</textColor>
<showPereodicalLabels>true</showPereodicalLabels>
</level>
<transparent xmlns="http://v8.1c.ru/8.2/data/chart">false</transparent>
<backColor xmlns="http://v8.1c.ru/8.2/data/chart">auto</backColor>
<textColor xmlns="http://v8.1c.ru/8.2/data/chart">auto</textColor>
<currentLevel xmlns="http://v8.1c.ru/8.2/data/chart">0</currentLevel>
</pl:timeScale>
<pl:period>
<pl:begin>2026-06-09T00:00:00</pl:begin>
<pl:end>2026-06-09T23:59:59</pl:end>
</pl:period>
<pl:displayCurrentDate>true</pl:displayCurrentDate>
<pl:itemsTimeRepresentation>BeginTime</pl:itemsTimeRepresentation>
<pl:itemsBehaviorWhenSpaceInsufficient>CollapseItems</pl:itemsBehaviorWhenSpaceInsufficient>
<pl:autoMinColumnWidth>true</pl:autoMinColumnWidth>
<pl:autoMinRowHeight>true</pl:autoMinRowHeight>
<pl:minColumnWidth>0</pl:minColumnWidth>
<pl:minRowHeight>0</pl:minRowHeight>
<pl:fixDimensionsHeader>auto</pl:fixDimensionsHeader>
<pl:fixTimeScaleHeader>auto</pl:fixTimeScaleHeader>
<pl:border width="1">
<v8ui:style xsi:type="v8ui:ControlBorderType">Single</v8ui:style>
</pl:border>
<pl:newItemsTextType>String</pl:newItemsTextType>
</Settings>
</Attribute>
</Attributes>
</Form>