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
+39 -5
View File
@@ -777,11 +777,11 @@ flags/layout/оформление/companions/события общий), плю
Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и рус. (`ПолеТабличногоДокумента`, `ПолеИндикатора`, `ПолеДиаграммы`, `ПолеДиаграммыГанта`, …).
Скаляры `output`/`protection`/… — generic pass-through; bool как `true`/`false`, enum verbatim.
> **Ограничение — design-time конфигурация диаграмм/планировщика.** Реквизит chart-типа может нести
> `<Settings xsi:type="d4p1:GanttChart"/"pl:Planner"/…>` — встроенный конфиг диаграммы (серии/оси/цвета/планировщик).
> Planner несёт Settings ВСЕГДА (даже дефолтный), Chart/Gantt — при design-time настройке. Этот блок пока НЕ
> воспроизводится → декомпилятор делает честный fail-ring3 (не теряет молча). Поля без Settings (диаграмма,
> заполняемая в коде; график-схема; период) роундтрипятся полностью.
> **Design-time конфигурация диаграмм/планировщика.** Реквизит chart-типа может нести
> `<Settings xsi:type="d4p1:GanttChart"/"pl:Planner"/…>` — встроенный конфиг (серии/оси/цвета/планировщик).
> **Planner** (`pl:Planner`) — поддержан, см. ключ `planner` ниже. **Chart/GanttChart** (`d4p1:Chart`/`GanttChart`)
> при design-time настройке — пока НЕ воспроизводятся → декомпилятор делает честный fail-ring3 (не теряет молча).
> Поля без Settings (диаграмма, заполняемая в коде; график-схема; период; дендрограмма) роундтрипятся полностью.
#### autoCmdBar — командная панель формы
@@ -833,6 +833,40 @@ Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и
| `columns` | array | Колонки для ValueTable/ValueTree (`{ name, type, title?, functionalOptions?, useAlways? }`) |
| `additionalColumns` | array | Доп. колонки табличных частей объекта: `[{ table: "Объект.ТабЧасть", columns: [<col>] }]`. У главного реквизита-объекта; `<col>` — та же грамматика, что у `columns`. Эмитятся в `<Columns>` после прямых колонок |
| `settings` | object | Настройки динамического списка (только `type: "DynamicList"`) |
| `planner` | object | Design-time конфигурация планировщика (только `type: "pl:Planner"`, `<Settings xsi:type="pl:Planner">`). См. ниже |
### planner — design-time конфигурация планировщика
Для реквизита `type: "pl:Planner"` объект `planner` описывает встроенный конфиг поля-планировщика (элементы расписания + оформление/поведение + шкала времени). Платформа эмитит блок **всегда** (даже дефолтный); компилятор подставляет умолчания для пропущенных ключей — авторинг может быть кратким (`{ "items": [{ "text": "Встреча", "begin": "...", "end": "..." }] }`), декомпилятор делает полный захват (раундтрип бит-в-бит). Цвета verbatim (`auto`/`style:X`/`web:Red`/`#hex`); шрифт `{ kind: "AutoFont" }` или ref-строка; граница `{ width, style }`; ML-форматы — строка или `{ "#": ..., "ru": ... }`.
```json
{ "name": "Планировщик", "type": "pl:Planner", "planner": {
"items": [{ "text": "Встреча", "begin": "2026-06-09T01:00:00", "end": "2026-06-09T04:00:00",
"borderColor": "auto", "backColor": "auto", "deleted": false, "editMode": "EnableEdit" }],
"period": { "begin": "2026-06-09T00:00:00", "end": "2026-06-09T23:59:59" },
"displayCurrentDate": true, "itemsTimeRepresentation": "BeginTime",
"timeScale": { "placement": "Left", "levels": [{ "measure": "Hour", "interval": 1 }] }
} }
```
| Ключ planner | Тип | Назначение |
|---|---|---|
| `items` | array | Элементы планировщика (`<pl:item>`): `value`(nil по умолч.)/`text`/`tooltip`/`begin`/`end`/`borderColor`/`backColor`/`textColor`/`font`/`replacementDate`/`deleted`/`id`(авто-GUID)/`textFormatted`/`border`/`editMode` |
| `borderColor`/`backColor`/`textColor`/`lineColor` | color | Цвета планировщика (умолч. `auto`) |
| `font` | font | Шрифт (умолч. `{kind:"AutoFont"}`) |
| `beginOfRepresentationPeriod`/`endOfRepresentationPeriod` | dateTime | Период представления |
| `alignElementsOfTimeScale`/`displayTimeScaleWrapHeaders`/`displayWrapHeaders`/`displayCurrentDate` | bool | Флаги отображения |
| `timeScaleWrapHeadersFormat` | ML | Формат перенесённых заголовков шкалы |
| `periodicVariantUnit`/`periodicVariantRepetition` | value/int | Единица/кратность периодического варианта |
| `timeScaleWrapBeginIndent`/`timeScaleWrapEndIndent` | int | Отступы переноса шкалы |
| `timeScale` | object | Шкала времени: `placement`, `levels:[{measure,interval,show,line:{width,gap,style},scaleColor,dayFormatRule,format(ML),labels:{ticks},backColor,textColor,showPereodicalLabels}]`, `transparent`, `backColor`, `textColor`, `currentLevel` |
| `period` | object | `{ begin, end }` — отображаемый период (опционально) |
| `itemsTimeRepresentation`/`itemsBehaviorWhenSpaceInsufficient`/`newItemsTextType`/`fixDimensionsHeader`/`fixTimeScaleHeader` | value | Поведение элементов/заголовков |
| `autoMinColumnWidth`/`autoMinRowHeight` | bool | Авто-минимум размеров |
| `minColumnWidth`/`minRowHeight` | int | Минимальные размеры |
| `border` | border | Рамка планировщика (`{ width, style }`) |
> **Ограничение Phase 1:** `dimensions` (измерения планировщика) и `item.dimensionValues` пока всегда пустые (захват только пустого блока). Конфиг Chart/GanttChart (`d4p1:*`) — отдельная фаза.
### settings — динамический список