From 09d70974765fb50d2cd96fc0688015ae748a8f55 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 14 Jun 2026 13:16:22 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-compile):=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=81=D0=BA=D0=B8=D0=B5=20references=20+=20=D0=B8=D0=BD?= =?UTF-8?q?=D0=B4=D0=B5=D0=BA=D1=81,=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BD=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B2=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Каскад инструкции: ядро SKILL.md покрывает большинство задач, для редких/нишевых конструкций — 12 тематических файлов в references/ (по индексу в SKILL.md). Контракт references: только «как собрать DSL для задачи» — без механики эмиссии, синонимов, авторезолва и forgiving (это тихая помощь модели); ссылки только внутри навыка; область строго по элементу-владельцу. Корректность ядра (наборы значений выверены по корпусу + доменно, forgiving/legacy исключены из авторских): - group расцеплён: ориентация (vertical/horizontalIfPossible/alwaysHorizontal) + отдельный ключ behavior (collapsible/popup) — popup-группы стали выразимы; - titleLocation: полный набор none/left/right/top/bottom/auto; - commandBarLocation += Bottom; searchStringLocation += Bottom/CommandBar/PullFromTop; - общее свойство tooltip; events: null → авто-имя обработчика; правило уникальности имён. Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/skills/form-compile/SKILL.md | 35 ++++- .../form-compile/references/appearance.md | 123 +++++++++++++++ .../skills/form-compile/references/charts.md | 143 +++++++++++++++++ .../form-compile/references/choice-params.md | 73 +++++++++ .../references/command-interface.md | 86 +++++++++++ .../references/companion-panels.md | 131 ++++++++++++++++ .../form-compile/references/dynamic-list.md | 144 ++++++++++++++++++ .../references/layout-advanced.md | 111 ++++++++++++++ .../form-compile/references/report-form.md | 79 ++++++++++ .../form-compile/references/roles-access.md | 73 +++++++++ .../form-compile/references/special-fields.md | 109 +++++++++++++ .../form-compile/references/table-advanced.md | 132 ++++++++++++++++ .../references/type-system-advanced.md | 77 ++++++++++ docs/form-dsl-spec.md | 2 +- 14 files changed, 1309 insertions(+), 9 deletions(-) create mode 100644 .claude/skills/form-compile/references/appearance.md create mode 100644 .claude/skills/form-compile/references/charts.md create mode 100644 .claude/skills/form-compile/references/choice-params.md create mode 100644 .claude/skills/form-compile/references/command-interface.md create mode 100644 .claude/skills/form-compile/references/companion-panels.md create mode 100644 .claude/skills/form-compile/references/dynamic-list.md create mode 100644 .claude/skills/form-compile/references/layout-advanced.md create mode 100644 .claude/skills/form-compile/references/report-form.md create mode 100644 .claude/skills/form-compile/references/roles-access.md create mode 100644 .claude/skills/form-compile/references/special-fields.md create mode 100644 .claude/skills/form-compile/references/table-advanced.md create mode 100644 .claude/skills/form-compile/references/type-system-advanced.md diff --git a/.claude/skills/form-compile/SKILL.md b/.claude/skills/form-compile/SKILL.md index af35697b..5a5fbdcf 100644 --- a/.claude/skills/form-compile/SKILL.md +++ b/.claude/skills/form-compile/SKILL.md @@ -61,7 +61,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" - | DSL ключ | XML элемент | Значение ключа | |--------------|-------------------|---------------------------------------------------| -| `"group"` | UsualGroup | `"horizontal"` / `"vertical"` / `"alwaysHorizontal"` / `"alwaysVertical"` / `"collapsible"` | +| `"group"` | UsualGroup | ориентация: `"vertical"` / `"horizontalIfPossible"` / `"alwaysHorizontal"` (поведение — отдельный ключ `behavior`) | | `"columnGroup"` | ColumnGroup | `"horizontal"` / `"vertical"` / `"inCell"` — только внутри `columns` таблицы | | `"input"` | InputField | имя элемента | | `"check"` | CheckBoxField | имя | @@ -83,12 +83,13 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" - | Ключ | Описание | |------|----------| -| `name` | Переопределить имя (по умолчанию = значение ключа типа) | +| `name` | Переопределить имя (по умолчанию = значение ключа типа). Имена уникальны во всех коллекциях формы (элементы, реквизиты, команды, колонки) | | `title` | Заголовок элемента | +| `tooltip` | Всплывающая подсказка элемента (строка или `{ru,en}`) | | `visible: false` | Скрыть (синоним: `hidden: true`) | | `enabled: false` | Сделать недоступным (синоним: `disabled: true`) | | `readOnly: true` | Только чтение | -| `events: {...}` | Обработчики событий: `{ "OnChange": "ИмяОбработчика" }`. Тот же формат, что у событий формы | +| `events: {...}` | Обработчики событий: `{ "OnChange": "ИмяОбработчика" }`. Тот же формат, что у событий формы. Значение `null` → имя обработчика сгенерируется автоматически | ### Допустимые имена событий (`events`) @@ -115,7 +116,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" - | Ключ | Описание | Пример | |------|----------|--------| | `path` | DataPath — привязка к данным | `"Объект.Организация"` | -| `titleLocation` | Размещение заголовка | `"none"`, `"left"`, `"top"` | +| `titleLocation` | Размещение заголовка | `"none"`, `"left"`, `"right"`, `"top"`, `"bottom"`, `"auto"` | | `multiLine: true` | Многострочное поле | текстовое поле, комментарий | | `passwordMode: true` | Режим пароля (звёздочки) | поле ввода пароля | | `choiceButton: true` | Кнопка выбора ("...") | ссылочное поле | @@ -178,13 +179,14 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" - ### Группа (group) -Значение ключа задаёт ориентацию: `"horizontal"`, `"vertical"`, `"alwaysHorizontal"`, `"alwaysVertical"`, `"collapsible"`. +Значение ключа задаёт **ориентацию**: `"vertical"`, `"horizontalIfPossible"`, `"alwaysHorizontal"`. | Ключ | Описание | |------|----------| +| `behavior` | Поведение группы: `"collapsible"` (сворачиваемая) / `"popup"` (всплывающая). Опустить = обычная | | `showTitle: true` | Показывать заголовок группы | | `united: false` | Левый край полей ввода выравнивается только в пределах этой группы (по умолчанию `true` — сквозное выравнивание по самому длинному заголовку, в т.ч. с соседними группами) | -| `collapsed: true` | Только для `"group": "collapsible"` — группа создаётся свёрнутой | +| `collapsed: true` | Для `behavior: "collapsible"` / `"popup"` — группа создаётся свёрнутой | | `representation` | `"none"`, `"normal"`, `"weak"`, `"strong"` | | `children: [...]` | Вложенные элементы | @@ -201,8 +203,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" - | `height` | Высота в строках таблицы | | `header: false` | Скрыть шапку | | `footer: true` | Показать подвал | -| `commandBarLocation` | `"None"`, `"Top"`, `"Auto"` | -| `searchStringLocation` | `"None"`, `"Top"`, `"Auto"` | +| `commandBarLocation` | `"None"`, `"Top"`, `"Bottom"`, `"Auto"` | +| `searchStringLocation` | `"None"`, `"Top"`, `"Bottom"`, `"CommandBar"`, `"PullFromTop"`, `"Auto"` | | `choiceMode: true` | Режим выбора (для форм выбора) | | `initialTreeView` | `"ExpandTopLevel"` и др. (иерархические списки) | | `enableDrag: true` | Разрешить перетаскивание | @@ -521,6 +523,23 @@ PictureField, привязанный к булеву/числу, рисует и } ``` +## Продвинутые конструкции (по необходимости) + +Описанного выше хватает для большинства форм. Под конкретную задачу подгрузите файл из `references/`: + +- `dynamic-list.md` — форма списка: источник, отбор, сортировка, группировки, параметры запроса +- `appearance.md` — условное и статическое оформление элементов (цвета/шрифты/рамки) +- `choice-params.md` — параметры и связи выбора у полей ввода +- `command-interface.md` — командный интерфейс формы +- `roles-access.md` — пользовательская видимость и доступ по ролям +- `companion-panels.md` — контент расширенной подсказки и контекстного меню +- `special-fields.md` — поля документа/датчика (HTML, текст, индикатор, ползунок) +- `charts.md` — диаграммы и планировщик +- `report-form.md` — свойства формы отчёта +- `type-system-advanced.md` — наборы и составные типы +- `table-advanced.md` — расширенные свойства таблиц +- `layout-advanced.md` — тонкая компоновка и геометрия + ## Автогенерация - **Companion-элементы**: ContextMenu, ExtendedTooltip и др. создаются автоматически diff --git a/.claude/skills/form-compile/references/appearance.md b/.claude/skills/form-compile/references/appearance.md new file mode 100644 index 00000000..fd0ec463 --- /dev/null +++ b/.claude/skills/form-compile/references/appearance.md @@ -0,0 +1,123 @@ +# Оформление + +Два независимых механизма: **оформление элемента** (постоянные цвета/шрифт/граница на конкретном элементе) и **условное оформление формы** (`conditionalAppearance` — правила, применяемые при выполнении условия). + +## Оформление элемента (цвета / шрифты / граница) + +Свойства задаются прямо на элементе. Применимо к полям (`input`/`check`/`radio`/`labelField`/`picField`/`calendar`), декорациям (`label`/`picture`), кнопкам (`button`), группам (`group`/`columnGroup`), страницам (`page`/`pages`), попапам (`popup`) и таблицам (`table`). Каждое свойство необязательно. + +| Ключ | Что задаёт | +|------|-----------| +| `textColor` | Цвет текста | +| `backColor` | Цвет фона | +| `borderColor` | Цвет рамки | +| `font` | Шрифт | +| `border` | Граница | +| `titleTextColor` / `titleBackColor` / `titleFont` | Цвет текста / цвет фона / шрифт заголовка колонки (`labelField`, колонки таблицы); у `page`/`pages`/`popup` — `titleTextColor`/`titleFont` заголовка страницы/попапа | +| `footerTextColor` / `footerBackColor` / `footerFont` | Цвет текста / цвет фона / шрифт подвала колонки | + +Те же свойства доступны и через словарь `appearance` элемента — под русскими именами параметров платформы: `ЦветТекста`, `ЦветФона`, `ЦветРамки`, `Шрифт`, `Граница`, `ЦветТекстаЗаголовка`, `ЦветФонаЗаголовка`, `ШрифтЗаголовка`, `ЦветТекстаПодвала`, `ЦветФонаПодвала`, `ШрифтПодвала`. Это та же запись, что и в правилах условного оформления (ниже) и в `appearance` поля дин-списка. + +### Цвет + +Строка в одной из форм: + +| Форма | Значение | +|-------|----------| +| `web:Имя` | Цвет из web-палитры, напр. `web:Red`, `web:FireBrick`, `web:HoneyDew` | +| `win:Имя` | Системный цвет Windows, напр. `win:MenuBar`, `win:ButtonText`, `win:DisabledText` | +| `style:ИмяСтиля` | Ссылка на элемент стиля конфигурации/платформы, напр. `style:FormBackColor`, `style:BorderColor` | +| `#RRGGBB` | RGB-hex, напр. `#FF0000` | + +Имя должно существовать в своей палитре (несуществующий web-/win-цвет или ссылка на отсутствующий `style:`-элемент — ошибка загрузки формы). + +### Шрифт (`font` / `titleFont` / `footerFont`) + +- Строка `"style:ИмяСтиля"` — шрифт из элемента стиля. Минимальная форма. +- Объект — задаются только нужные атрибуты: + +| Ключ | Назначение | +|------|-----------| +| `ref` | Ссылка на стиль (`"style:X"`) или системный шрифт (`"sys:…"`) | +| `faceName` | Имя гарнитуры (для собственного шрифта) | +| `height` | Размер | +| `bold` / `italic` / `underline` / `strikeout` | `true`/`false` — начертание | +| `scale` | Масштаб, % | +| `kind` | `Absolute` (собственный шрифт — с `faceName`+`height`) / `WindowsFont` (системный — с `ref:"sys:…"`) | + +```json +{ "label": "Внимание!", "textColor": "web:FireBrick", + "font": { "faceName": "Arial", "height": 12, "bold": true, "kind": "Absolute", "scale": 100 } } +``` + +### Граница (`border`) + +- Строка `"style:ИмяСтиля"` (или объект `{ "ref": "style:X" }`) — граница из стиля. +- Объект `{ "width": N, "style": "..." }` — собственная граница. `style` — один из: `Single`, `Double`, `Underline`, `DoubleUnderline`, `Overline`, `Embossed`, `Indented`, `WithoutBorder`. + +```json +{ "input": "Цена", "path": "Объект.Цена", "textColor": "#FF0000", + "borderColor": "style:BorderColor", "border": { "width": 1, "style": "Single" } } +{ "labelField": "Код", "titleTextColor": "web:HoneyDew", "border": "style:ControlBorder" } +``` + +## Условное оформление формы (`conditionalAppearance`) + +Форменный ключ верхнего уровня — массив правил. Каждое правило применяет оформление к перечисленным полям, когда выполняется его условие. + +```json +"conditionalAppearance": [ + { "selection": ["ОбычноеПоле"], "filter": ["ЧисловоеПоле > 100"], + "appearance": { "ЦветФона": "style:FormBackColor" }, + "presentation": { "ru": "Подсветка", "en": "Highlight" } } +] +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `selection` | array | Имена форматируемых полей формы | +| `filter` | array | Условие применения (грамматика — ниже) | +| `appearance` | object | Словарь «параметр платформы: значение» | +| `presentation` | string / object | Подпись правила в списке настроек | +| `use` | bool | `false` — правило отключено | +| `viewMode` | string | Режим отображения настройки | +| `userSettingID` | string | Идентификатор пользовательской настройки; `"auto"` — сгенерировать | + +### filter + +Та же грамматика, что в отборе списка — shorthand `"Поле оператор значение @флаги"` или объект: + +```json +"filter": [ + "Статус = 3", + { "field": "Сумма", "op": ">=", "value": 1000 }, + { "group": "Or", "items": [ "Просрочено = true", "Заблокирован = true" ] } +] +``` + +- **Операторы:** `=` `<>` `>` `>=` `<` `<=`, `in` / `notIn`, `inHierarchy`, `contains` / `notContains`, `beginsWith` / `notBeginsWith`, `like` / `notLike` (`%`-шаблон), `filled` / `notFilled`. +- **Флаги:** `@off` (отключён), `@user`, `@quickAccess`; `_` = пустое значение. +- **Группа:** `{ "group": "And"|"Or"|"Not", "items": [...], "use"? }`. +- **Дата-значение:** ISO-дата `"2024-01-01T00:00:00"` — фиксированная дата; именованный относительный период — строкой `"BeginningOfThisWeek"` с `"valueType": "v8:StandardBeginningDate"` (варианты `BeginningOfThisDay`/`BeginningOfThisWeek`/`BeginningOfThisMonth`/`BeginningOfThisYear`/…). + +### appearance + +Словарь «параметр платформы: значение». Имена параметров — русские: `ЦветТекста`, `ЦветФона`, `Шрифт`, `Граница`, `Текст`, `Заголовок`, `Формат`, `ВидимостьЭлемента`, `Доступность` и другие параметры оформления компоновки. + +Значения: +- **Цвет** (`ЦветТекста`/`ЦветФона`/…) и **шрифт** (`Шрифт`) — те же формы, что в оформлении элемента выше (`web:`/`win:`/`style:`/`#RRGGBB`; шрифт — строка `"style:X"` или объект). +- **Текстовые параметры** (`Текст`/`Заголовок`/`Формат`) — по форме значения: + - голая строка → нелокализованный литерал (`""` → пустое значение); + - объект `{ "ru": "...", "en": "..." }` → локализуемая строка; + - объект `{ "field": "путь" }` → ссылка на поле компоновки. + +```json +"conditionalAppearance": [ + { "selection": ["Остаток"], "filter": ["Остаток < 0"], + "appearance": { "ЦветТекста": "web:Red", "Шрифт": { "bold": true } } }, + { "selection": ["Комментарий"], "filter": ["Комментарий notFilled"], + "appearance": { "Текст": { "ru": "— нет данных —" }, "ЦветТекста": "win:DisabledText" } } +] +``` + +> Условное оформление **самого дин-списка** задаётся не здесь, а в `settings.conditionalAppearance` реквизита-списка — см. `references/dynamic-list.md`. diff --git a/.claude/skills/form-compile/references/charts.md b/.claude/skills/form-compile/references/charts.md new file mode 100644 index 00000000..0a422022 --- /dev/null +++ b/.claude/skills/form-compile/references/charts.md @@ -0,0 +1,143 @@ +# Диаграммы, диаграмма Ганта, планировщик + +Поле-диаграмма (`chart` / `ganttChart`), поле-планировщик (`planner`) и дендрограмма выводят значение из реквизита соответствующего типа. Конструкция всегда двойная: + +1. **Реквизит** chart/planner-типа (несёт данные и, при необходимости, design-time конфиг). +2. **Элемент** формы, привязанный к реквизиту через `path`. + +Минимум — реквизит нужного типа плюс элемент с тем же `path`: + +```json +"attributes": [ { "name": "Диаграмма", "type": "d5p1:Chart" } ], +"items": [ { "chart": "ПолеДиаграммы", "path": "Диаграмма" } ] +``` + +Реквизит, заполняемый в коде (без встроенной настройки), достаточно объявить типом — элемент привязывается и работает. + +## Типы реквизита и элемента + +| Элемент | Ключ типа | Тип реквизита | Что несёт элемент дополнительно | +|---------|-----------|---------------|---------------------------------| +| Диаграмма | `chart` | `d5p1:Chart` | — | +| Диаграмма Ганта | `ganttChart` | `d5p1:GanttChart` | `ganttTable` — вложенная таблица (см. ниже) | +| Планировщик | `planner` | `pl:Planner` | — | +| График. схема | `graphicalSchema` | `d5p1:FlowchartContextType` | `edit`, `warningOnEditRepresentation` | +| Период | `periodField` | `v8:StandardPeriod` | — | +| Дендрограмма | `dendrogram` | — | — | + +Имя элемента — значение ключа (`"chart": "ПолеДиаграммы"`); `path` — короткое имя реквизита. + +### Элемент диаграммы Ганта (`ganttTable`) + +У поля Ганта внутри лежит полноценная таблица — задаётся ключом `ganttTable` (та же грамматика, что у обычной `table`): + +```json +{ "ganttChart": "Ганта", "path": "Ганта", + "ganttTable": { "table": "ТаблицаГанта", "path": "Ганта", "height": 3 } } +``` + +## Design-time конфиг диаграммы (`chart`) + +Реквизит типа `d5p1:Chart` / `d5p1:GanttChart` может нести встроенную настройку диаграммы — объект `chart` на реквизите. Платформа всегда пишет полный набор свойств (~127: тип, серии, легенда, заголовок, шкалы, цвета, шрифты, оси), поэтому **авторинг с нуля непрактичен** — возьмите рабочую диаграмму за основу и правьте смысловое ядро. + +Ключи `chart` = канонические имена свойств диаграммы; задавайте только те, что меняете: + +```json +{ "name": "Диаграмма", "type": "d5p1:Chart", "chart": { + "chartType": "Line", + "isSeriesDesign": true, "realSeriesCount": "2", + "realSeriesData": [ + { "id": "1", "color": "auto", "line": {"width":2,"gap":false,"style":"Solid"}, + "marker": "Auto", "text": "Серия 1", "strIsChanged": false, "isExpand": false, + "isIndicator": false, "colorPriority": false } + ], + "isShowTitle": true, "title": "Продажи", + "isShowLegend": true, "legendPlacement": "Bottom", + "paletteKind": "Auto" +} } +``` + +Смысловое ядро для правки: + +| Ключ | Назначение | +|------|------------| +| `chartType` | Тип: `Line` / `Pie` / `Bar` / `Histogram` / `Column` / `Area` / … | +| `realSeriesData` | Массив серий — объекты `{ id, text, color, line, marker, … }` | +| `isShowTitle` + `title` | Показ и текст заголовка | +| `isShowLegend` + `legendPlacement` | Показ и расположение легенды (`Bottom` / `Right` / …) | +| `paletteKind` | Палитра (`Auto` / …) | +| `bkgColor` / `labelsColor` / … | Базовые цвета | + +Формы значений внутри `chart`: + +- **Цвета** — verbatim: `auto`, `style:ИмяСтиля`, `web:Red`, `#hex`. +- **`line`** — `{ width, gap, style }` (стиль линии: `Solid` / …). +- **`border`** — `{ width, style }`. +- **`font`** — `{ kind: "AutoFont" }` либо атрибуты шрифта. +- **Локализуемые строки** (`title`, `vsFormat`, `lbFormat`, `labelFormat`, серия `text`, …) — голая строка либо `{ "ru": "…", "en": "…" }`. +- **Области** (`elementsChart` / `elementsLegend` / `elementsTitle`) — `{ left, right, top, bottom }`. +- **Серии** (`realSeriesData` / `realExSeriesData`) — массивы объектов. + +Любое из ~127 свойств переопределяется по каноническому имени; остальное оставляйте дефолтным (не указывайте — берётся из основы). + +### Диаграмма Ганта (`d5p1:GanttChart`) + +Реквизит типа `d5p1:GanttChart` использует **тот же** ключ `chart`. Внутри — вложенный полный `chart`-блок плюс гант-специфика (`points` / `series` / `timeScale` / `drawEmpty` / …). Так же берите рабочую диаграмму Ганта за основу. + +> **Ограничение.** Диаграммы (Chart/Gantt) с заполненными **точками/осями** (`realPointData` / `realDataItems`, заполненные `valuesAxis` / `pointsAxis`) генерик-движком не поддержаны — это редкий вариант. Частые дашборд-диаграммы и диаграммы Ганта (серии / легенда / оформление / шкалы) поддержаны полностью. + +## Design-time конфиг планировщика (`planner`) + +Реквизит типа `pl:Planner` несёт встроенную настройку планировщика — объект `planner`. Компилятор подставляет умолчания для пропущенных ключей, поэтому авторинг может быть кратким: + +```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 } ] } +} } +``` + +Минимум — один `item`: + +```json +"planner": { "items": [ { "text": "Встреча", "begin": "2026-06-09T01:00:00", "end": "2026-06-09T04:00:00" } ] } +``` + +| Ключ `planner` | Тип | Назначение | +|----------------|-----|------------| +| `items` | array | Элементы расписания. Поля элемента: `text`, `tooltip`, `begin`, `end`, `value`, `borderColor`, `backColor`, `textColor`, `font`, `border`, `replacementDate`, `deleted` (bool), `editMode` (`EnableEdit` / …), `id` (необязательно — авто-GUID), `textFormatted` | +| `dimensions` | array | Измерения (разрезы) планировщика. Поля: `value` (объект разреза — ссылка `Enum.X.EnumValue.Y` / `Справочник.X`; опустить → пусто), `text` (заголовок), `borderColor`, `backColor`, `textColor`, `font`, `textFormatted`, `elements`. `elements` — элементы измерения, рекурсивны (могут нести вложенные `elements`): `value`, `text`, цвета, `font`, `showOnlySubordinatesAreas` (bool), `textFormatted` | +| `period` | object | Отображаемый период `{ begin, end }` (необязательно) | +| `timeScale` | object | Шкала времени (см. ниже) | +| `borderColor` / `backColor` / `textColor` / `lineColor` | color | Цвета (умолч. `auto`) | +| `font` | font | Шрифт (умолч. `{ kind: "AutoFont" }`) | +| `border` | border | Рамка `{ width, style }` | +| `beginOfRepresentationPeriod` / `endOfRepresentationPeriod` | dateTime | Период представления | +| `displayCurrentDate` / `displayWrapHeaders` / `displayTimeScaleWrapHeaders` / `alignElementsOfTimeScale` | bool | Флаги отображения | +| `timeScaleWrapHeadersFormat` | ML | Формат перенесённых заголовков шкалы | +| `timeScaleWrapBeginIndent` / `timeScaleWrapEndIndent` | int | Отступы переноса шкалы | +| `periodicVariantUnit` / `periodicVariantRepetition` | value / int | Единица и кратность периодического варианта | +| `itemsTimeRepresentation` | value | Представление времени элементов (`BeginTime` / …) | +| `itemsBehaviorWhenSpaceInsufficient` / `newItemsTextType` / `fixDimensionsHeader` / `fixTimeScaleHeader` | value | Поведение элементов и заголовков | +| `autoMinColumnWidth` / `autoMinRowHeight` | bool | Авто-минимум размеров | +| `minColumnWidth` / `minRowHeight` | int | Минимальные размеры | + +Шкала времени (`timeScale`): + +```json +"timeScale": { + "placement": "Left", + "levels": [ { "measure": "Hour", "interval": 1 } ] +} +``` + +Ключи: `placement`, `levels` (массив уровней), `transparent`, `backColor`, `textColor`, `currentLevel`. Уровень: `measure` (`Hour` / `Day` / …), `interval`, `show`, `line` (`{ width, gap, style }`), `scaleColor`, `dayFormatRule`, `format` (ML), `labels` (`{ ticks }`), `backColor`, `textColor`, `showPereodicalLabels`. + +Формы значений в `planner` те же, что у диаграммы: цвета verbatim (`auto` / `style:X` / `web:Red` / `#hex`); шрифт `{ kind: "AutoFont" }` либо ref-строка; граница `{ width, style }`; ML-форматы — строка или `{ "ru": …, "en": … }`. + +> **Ограничение.** Привязка элемента расписания к элементам измерений (`item.dimensionValues`) пока всегда пустая. Сами измерения (`dimensions`) задавать можно. diff --git a/.claude/skills/form-compile/references/choice-params.md b/.claude/skills/form-compile/references/choice-params.md new file mode 100644 index 00000000..5d5c5c8d --- /dev/null +++ b/.claude/skills/form-compile/references/choice-params.md @@ -0,0 +1,73 @@ +# Параметры выбора и связь по типу + +Свойства поля ввода (`input`), управляющие выбором значения: чем ограничен список выбора и каким будет тип значения. Имена параметров — строки 1С как есть (`"Отбор.Х"`). + +```json +{ "input": "Контрагент", "path": "Объект.Контрагент", + "choiceParameters": [ + { "name": "Отбор.Активный", "value": true }, + { "name": "Отбор.ВидПродукции", "value": ["Enum.Виды.Агрохимикат", "Enum.Виды.Пестицид"] } + ], + "choiceParameterLinks": [ + { "name": "Отбор.Организация", "dataPath": "Объект.Организация" }, + { "name": "Отбор.Тип", "dataPath": "Объект.Тип", "valueChange": "DontChange" } + ], + "typeLink": { "dataPath": "Объект.ЗначениеДата", "linkItem": 0 } +} +``` + +## Параметры выбора (`choiceParameters`) + +Фиксированные значения параметров выбора, отбирающие список значений независимо от данных формы. Массив объектов `{ name, value }`: + +- `name` — имя параметра (`"Отбор.Активный"`). +- `value` — значение. Допустимы: bool, число, строка, ISO-дата (`"2020-01-01T00:00:00"`), ссылка-путь (`Enum.X.Y`, `Catalog.X`). **Массив** значений задаёт фиксированный массив. + +Короткая форма — строки `"name=value"`; значение с запятыми становится массивом, `true`/`false` → bool, число → число, остальное → строка/ссылка: + +```json +"choiceParameters": [ + "Отбор.Активный=true", + "Отбор.ВидПродукции=Enum.Виды.Агрохимикат, Enum.Виды.Пестицид" +] +``` + +## Связи параметров выбора (`choiceParameterLinks`) + +Параметры выбора, значение которых берётся из **другого поля формы** (а не задано фиксированно). Типовой случай — отбор списка договоров по выбранному контрагенту. Массив объектов `{ name, dataPath, valueChange? }`: + +- `name` — имя параметра выбора. +- `dataPath` — путь к полю формы, чьё значение подставляется в параметр. +- `valueChange` — что делать с уже выбранным значением при смене источника: `Clear` (очистить, необязательно — поведение по умолчанию) / `DontChange` (не менять). + +```json +{ "input": "Договор", "path": "Объект.Договор", + "choiceParameterLinks": [ + { "name": "Отбор.Владелец", "dataPath": "Объект.Контрагент" } + ] +} +``` + +Короткая форма — строки `"name=dataPath"`, опциональный хвост `:Clear` / `:DontChange`: + +```json +"choiceParameterLinks": [ "Отбор.Организация=Объект.Организация", "Отбор.Тип=Объект.Тип:DontChange" ] +``` + +## Связь по типу (`typeLink`) + +Тип значения поля определяется другим полем формы (напр. поле «Значение» субконто, тип которого задаётся выбранным видом субконто). Объект `{ dataPath, linkItem }`: + +- `dataPath` — путь к полю, задающему тип. +- `linkItem` — индекс элемента связи (необязательно, по умолчанию `0`). + +```json +"typeLink": { "dataPath": "Объект.ВидСубконто", "linkItem": 0 } +``` + +Короткая форма — строка `"dataPath"` либо `"dataPath#linkItem"`: + +```json +"typeLink": "Объект.ВидСубконто" +"typeLink": "Объект.ВидСубконто#1" +``` diff --git a/.claude/skills/form-compile/references/command-interface.md b/.claude/skills/form-compile/references/command-interface.md new file mode 100644 index 00000000..a318ab32 --- /dev/null +++ b/.claude/skills/form-compile/references/command-interface.md @@ -0,0 +1,86 @@ +# Командный интерфейс формы + +Форменный ключ `commandInterface` управляет расстановкой команд по двум панелям формы: + +- `commandBar` — командная панель формы; +- `navigationPanel` — панель навигации. + +Указывать нужно **только команды, у которых меняется расстановка по умолчанию** (видимость, группа, порядок). Команды, которые платформа размещает автоматически и без изменений, в блок не включают. + +```json +"commandInterface": { + "commandBar": [ + { "command": "Form.Command.Печать", "defaultVisible": false, "group": "FormCommandBarImportant", + "visible": { "common": false, "roles": { "Бухгалтер": true } } }, + "CommonCommand.История" + ], + "navigationPanel": { + "important": [ { "command": "CommonCommand.СвязанныеДокументы", "defaultVisible": false, "visible": false } ], + "seeAlso": [ { "command": "CommonCommand.Заметки", "defaultVisible": false, "visible": false } ] + } +} +``` + +## Элемент-команда + +Каждый элемент панели — объект, либо строка-shorthand (= голый `command` со всеми остальными свойствами по умолчанию): + +```json +"CommonCommand.История" +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `command` | string | Ссылка на команду дословно: `CommonCommand.X`, `Document.X.StandardCommand.Y`, `Form.Command.X`, `Form.StandardCommand.OK`, `"0"` (пустой / разделитель) | +| `type` | string | `Auto` (по умолчанию, необязательно) или `Added` | +| `defaultVisible` | bool | Видимость по умолчанию. На практике задаётся только `false` — чтобы скрыть команду, которая иначе видна | +| `visible` | bool / object | Видимость с исключениями по ролям: `bool` либо `{ "common": bool, "roles": { "Имя": bool } }` | +| `group` | string | Группа размещения дословно: предопределённая (`FormCommandBarImportant`, `FormNavigationPanelGoTo`, …), именованная (`CommandGroup.X`) или GUID-группа расширения | +| `index` | int | Порядок команды внутри группы | +| `attribute` | string | Путь реквизита для элемента панели навигации | + +## Две формы записи панели + +Панель можно описать **плоским массивом** или **деревом по группам** — выбирайте любую. + +**Плоский массив** — каждый элемент при необходимости несёт собственный `group`: + +```json +"commandBar": [ + { "command": "Form.Command.Печать", "group": "FormCommandBarImportant", "defaultVisible": false }, + { "command": "CommonCommand.История", "group": "FormCommandBarImportant", "index": 1 } +] +``` + +**Дерево** — объект `{ группа: [команды] }`; группа берётся из ключа, элементы её не повторяют: + +```json +"navigationPanel": { + "important": [ "CommonCommand.СвязанныеДокументы" ], + "goTo": [ { "command": "Document.Заказ.StandardCommand.Movements", "defaultVisible": false, "visible": false } ], + "seeAlso": [ "CommonCommand.Заметки" ] +} +``` + +Ключи-группы дерева зависят от панели: + +- `navigationPanel`: `important`, `goTo`, `seeAlso` (можно по-русски — `важное`, `перейти`, `смТакже`); +- `commandBar`: `important`, `createBasedOn`; +- любой другой ключ (`CommandGroup.X` или GUID) подставляется в группу дословно. + +## Скрыть видимую команду + +Самый частый случай — убрать команду, которую платформа показывает по умолчанию: + +```json +"commandBar": [ + { "command": "Form.Command.Печать", "defaultVisible": false, "visible": false } +] +``` + +Показать команду только некоторым ролям: + +```json +{ "command": "Form.Command.Печать", "defaultVisible": false, + "visible": { "common": false, "roles": { "Бухгалтер": true } } } +``` diff --git a/.claude/skills/form-compile/references/companion-panels.md b/.claude/skills/form-compile/references/companion-panels.md new file mode 100644 index 00000000..c4b166f9 --- /dev/null +++ b/.claude/skills/form-compile/references/companion-panels.md @@ -0,0 +1,131 @@ +# Companion-панели и расширенная подсказка элемента + +Любой элемент формы может нести свой собственный контент в трёх companion-свойствах: расширенную подсказку (`extendedTooltip`), командную панель (`commandBar`) и контекстное меню (`contextMenu`). Все три задаются ключами прямо на объекте элемента. + +```jsonc +{ "table": "Список", "path": "Список", + "commandBar": { "children": [ … ] }, + "contextMenu": { "children": [ … ] }, + "extendedTooltip": "Двойной клик открывает карточку" } +``` + +## Расширенная подсказка (`extendedTooltip`) + +Подсказка-надпись рядом с элементом. Две формы записи. + +**Текст-форма** — просто текст подсказки: + +```jsonc +"extendedTooltip": "Укажите ИНН контрагента" +"extendedTooltip": { "ru": "Сумма с НДС", "en": "Amount incl. VAT" } +"extendedTooltip": { "text": "Всего с НДС", "formatted": true } +``` + +- строка — ru-текст; +- `{ "ru": …, "en": … }` — многоязычный (как `title`); +- `{ "text": …, "formatted": true }` — форматированный текст (inline-разметка 1С: `…`, ``, ``, `…`, ``, ``, ``, `…`, ``; закрывающий тег — ``). `formatted` нужен только когда текст содержит такую разметку. + +**Own-content форма** — объект с раскладкой/оформлением/флагами, когда подсказке нужны размеры, цвет, гиперссылка и т.п.: + +```jsonc +"extendedTooltip": { + "text": "Перейти к инструкции", + "hyperlink": true, + "textColor": "web:Blue", + "events": { "URLProcessing": "ПодсказкаОбработкаНавигационнойСсылки" } +} +``` + +Ключи own-content объекта (все необязательны): + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `text` | string/ML | Текст подсказки (с `formatted` — форматированный) | +| `formatted` | bool | Интерпретировать inline-разметку в `text` | +| `tooltip` | string/ML | Всплывающая подсказка самой расширенной подсказки (редко; ≠ обычному `tooltip` элемента) | +| `hyperlink` | bool | Сделать подсказку гиперссылкой | +| `visible` / `enabled` | bool | Видимость / доступность подсказки | +| `width` / `height` | number | Размеры | +| `maxWidth` / `autoMaxWidth` | number / bool | Максимальная ширина / авто-максимум | +| `titleHeight` | number | Высота заголовка | +| `horizontalStretch` | bool | Горизонтальное растяжение | +| `verticalAlign` | string | Вертикальное выравнивание | +| `textColor` / `font` | string/object | Цвет текста / шрифт (см. `references/appearance.md`) | +| `events` | object | Обработчики событий подсказки, напр. `{ "URLProcessing": "Имя" }` у гиперссылочной подсказки | + +## Командная панель (`commandBar`) + +Собственная командная панель элемента (обычно таблицы или группы). + +**Значение** — массив или объект: + +```jsonc +"commandBar": [ { "button": "Создать", "command": "СоздатьЭлемент" } ] + +"commandBar": { + "autofill": false, + "horizontalAlign": "Right", + "children": [ + { "button": "Создать", "command": "СоздатьЭлемент" }, + { "buttonGroup": "Печать", "children": [ … ] } + ] +} +``` + +- массив `[ … ]` — краткая запись для `{ "children": [ … ] }`; +- объект — `children` плюс необязательные `autofill` и `horizontalAlign`. + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `children` | array | Содержимое панели — обычная грамматика кнопок (см. основную инструкцию) | +| `autofill` | bool | `false` — подавить автозаполнение панели стандартными командами. Необязательно (по умолчанию панель автозаполняется) | +| `horizontalAlign` | string | Горизонтальное выравнивание содержимого: `Left` / `Center` / `Right`. Необязательно | + +`children` — кнопки: `button` (с `command` / `commandName` / `stdCommand`), `buttonGroup`, `popup` — как в основной инструкции по кнопкам. + +> Для таблицы динамического списка панель по умолчанию подавлена (чтобы не дублировать командную панель формы). Чтобы оставить автозаполняемую панель у самой таблицы — задайте `commandBar: { "autofill": true }`. + +## Контекстное меню (`contextMenu`) + +Собственное контекстное меню элемента. Грамматика та же, что у `commandBar`, но без `horizontalAlign`. + +```jsonc +"contextMenu": [ { "button": "Карта маршрута", "commandName": "CommonCommand.КартаМаршрута" } ] + +"contextMenu": { + "autofill": false, + "children": [ + { "button": "Скопировать ссылку", "command": "СкопироватьСсылку" } + ] +} +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `children` | array | Пункты меню — обычная грамматика кнопок | +| `autofill` | bool | `false` — подавить автозаполнение меню. Необязательно | + +## Пример: таблица со своим меню и инфо-баннером + +```jsonc +{ "table": "Заказы", "path": "Объект.Заказы", + "extendedTooltip": { + "text": "Строки с просрочкой выделены красным", + "formatted": true + }, + "commandBar": { + "autofill": false, + "horizontalAlign": "Right", + "children": [ + { "button": "Добавить", "command": "ДобавитьЗаказ" }, + { "button": "Удалить", "command": "УдалитьЗаказ" } + ] + }, + "contextMenu": { + "children": [ + { "button": "Открыть документ", "command": "ОткрытьЗаказ" }, + { "buttonGroup": "Экспорт", "children": [ + { "button": "В Excel", "command": "ВыгрузитьВExcel" } ] } + ] + } } +``` diff --git a/.claude/skills/form-compile/references/dynamic-list.md b/.claude/skills/form-compile/references/dynamic-list.md new file mode 100644 index 00000000..bc02eff1 --- /dev/null +++ b/.claude/skills/form-compile/references/dynamic-list.md @@ -0,0 +1,144 @@ +# Динамический список + +Реквизит с `type: "DynamicList"` (обычно `main: true`) — основа формы списка. Объект `settings` описывает источник данных и настройки списка. Минимум — указать источник: + +```json +{ "name": "Список", "type": "DynamicList", "main": true, + "settings": { "mainTable": "Catalog.Контрагенты" } } +``` + +К списку привязывается таблица-элемент (`table`), ссылающаяся на реквизит через `path` — см. основную инструкцию. + +## Источник данных + +Два взаимоисключающих режима: + +**Таблично-ориентированный** — основная таблица метаданных: + +```json +"settings": { "mainTable": "Catalog.Контрагенты" } +``` + +**Запросный** — произвольный запрос: + +```json +"settings": { + "query": "ВЫБРАТЬ Т.Ссылка, Т.Наименование, Т.Сумма ИЗ Документ.Заказ КАК Т ГДЕ Т.Сумма > &Порог", + "mainTable": "Document.Заказ" +} +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `mainTable` | string | Основная таблица (`Catalog.X` / `Document.X` / …). Можно вместе с `query` | +| `query` | string | Текст запроса. Поддерживает `@file.sql` (путь к файлу запроса рядом с JSON) | +| `keyType` | string | Запросный список без `mainTable`: тип ключа набора — `FieldValue` / `RowKey` / `RowNumber` | +| `keyFields` | array | Поля ключа набора (для `keyType` без `mainTable`) | + +Параметры запроса (`&Имя`) задаются в `parameters` (ниже). + +`"dynamicDataRead": false` отключает динамическое считывание (список читается обычным запросом, без фонового обновления) — нужно для тяжёлых/агрегатных запросов. + +## Параметры запроса (`parameters`) + +Значения для `&параметров` текста запроса. Shorthand `"Имя [Заголовок]: тип = Значение"` (всё кроме имени необязательно) либо объект: + +```json +"settings": { + "query": "… ГДЕ Т.Артикул = &Артикул И Т.Цена ПОДОБНО &Маска", + "parameters": [ + "Артикул", + "Маска: string = %", + { "name": "ВидЦен", "valueListAllowed": true }, + { "name": "Период", "type": "dateTime" } + ] +} +``` + +Ключи объекта: `name`, `title`, `type` (грамматика типов — см. основную инструкцию), `value`, `valueListAllowed` (разрешить список значений), `availableValues` (`[{ value, presentation }]`), `expression`, `use`. + +## Значения параметров в настройках (`dataParameters`) + +Предустановленные значения параметров на уровне настроек списка. Shorthand `"Имя = Значение"` или объект `{ parameter, value?, use?, viewMode? }`: + +```json +"dataParameters": [ "Организация = _", "ВидЦен" ] +``` + +## Поля набора (`fields`) + +Обычно поля выводятся из источника сами — `fields` нужен **только чтобы переопределить** свойства отдельного поля: + +```json +"fields": [ + { "field": "Сумма", "title": "Сумма, руб", "appearance": { "Формат": "ЧДЦ=2" } }, + { "field": "Остаток", "valueType": "number(15,2)" } +] +``` + +Ключи поля: `field`, `dataPath`, `title`, `valueType`, `appearance` (как в условном оформлении), `presentationExpression`, `inputParameters` (связь по параметрам выбора), `typeLink` (`{ field, linkItem }` — связь по типу, напр. субконто). + +## Вычисляемые поля (`calculatedFields`) + +Поля, считаемые выражением. Shorthand `"Имя [Заголовок]: тип = Выражение"`: + +```json +"calculatedFields": [ + "Метка = Code + \" \" + Description", + "Маржа [Маржа, руб]: number(15,2) = Цена - Закупка" +] +``` + +Объектная форма — для `presentationExpression` / `orderExpression`: + +```json +{ "dataPath": "Сорт", "expression": "Code", "title": "Сорт", + "valueType": "string(10)", "presentationExpression": "Code" } +``` + +## Отбор (`filter`) + +Shorthand `"Поле оператор значение @флаги"` или объект: + +```json +"filter": [ + "Организация = _ @off @user", + "Сумма > 1000", + { "field": "Дата", "op": ">=", "value": "2024-01-01T00:00:00" }, + { "group": "Or", "items": [ "Статус = 1", "Статус = 2" ] } +] +``` + +- **Операторы:** `=` `<>` `>` `>=` `<` `<=`, `in` / `notIn`, `inHierarchy`, `contains` / `notContains`, `beginsWith` / `notBeginsWith`, `like` / `notLike` (`%`-шаблон), `filled` / `notFilled`. +- **Флаги:** `@off` (отключён), `@user` (в пользовательских настройках), `@quickAccess`; `_` = пустое значение. +- **Группа:** `{ group: "And"|"Or"|"Not", items: [...] }`. +- **Дата-значение:** ISO-дата `"2024-01-01T00:00:00"` — фиксированная дата. Именованный относительный период — строкой с типом: `{ "value": "BeginningOfThisWeek", "valueType": "v8:StandardBeginningDate" }` (варианты `BeginningOfThisDay`/`BeginningOfThisWeek`/`BeginningOfThisMonth`/`BeginningOfThisYear`/…). + +## Сортировка (`order`) + +Строка `"Поле"` (по возр.) / `"Поле desc"`, либо объект `{ field, direction? }`. `"Auto"` — автосортировка: + +```json +"order": [ "Дата desc", "Наименование", "Auto" ] +``` + +## Группировка строк (`grouping`) + +Линейная цепочка уровней (внешний → внутренний). Шорткат `>` или массив: + +```json +"grouping": "Контрагент > Договор" +"grouping": [ "Контрагент", { "field": "Дата", "groupType": "Hierarchy" } ] +``` + +Ключи уровня-объекта: `field`, `groupType` (`Items` / `Hierarchy`). + +## Условное оформление (`conditionalAppearance`) + +```json +"conditionalAppearance": [ + { "filter": [ "Просрочено = true" ], "appearance": { "ЦветТекста": "web:Red" } } +] +``` + +`filter` — та же грамматика, что выше. `appearance` — словарь «параметр платформы: значение» (`ЦветТекста`, `ЦветФона`, `Шрифт`, `Текст`, `Формат`, …). Значение `Текст`/`Заголовок`/`Формат`: голая строка — нелокализованный литерал; `{ru,en}` — локализуемая строка; `{ field: "путь" }` — ссылка на поле. Подробнее об оформлении — `references/appearance.md`. diff --git a/.claude/skills/form-compile/references/layout-advanced.md b/.claude/skills/form-compile/references/layout-advanced.md new file mode 100644 index 00000000..50e63f11 --- /dev/null +++ b/.claude/skills/form-compile/references/layout-advanced.md @@ -0,0 +1,111 @@ +# Продвинутая раскладка + +Тонкая настройка размещения элемента внутри родителя сверх базовой геометрии (`width`/`height`/`horizontalStretch`/`verticalStretch`/`visible`/`enabled` и ориентации групп/страниц — они в основной инструкции). Все ключи ниже задаются прямо на элементе и **необязательны** — без них действует поведение платформы по умолчанию. + +## Выравнивание внутри родителя + +Различают **выравнивание самого элемента** в отведённой ему ячейке и **выравнивание содержимого** элемента. + +| Ключ | Значения | Что выравнивает | +|------|----------|-----------------| +| `groupHorizontalAlign` | `Left` / `Center` / `Right` | Положение **элемента** по горизонтали в родительской группе (когда элемент у́же доступного места) | +| `groupVerticalAlign` | `Top` / `Center` / `Bottom` | Положение **элемента** по вертикали в родительской группе | +| `horizontalAlign` | `Left` / `Center` / `Right` | Выравнивание **содержимого** (текста/значения) внутри самого элемента | +| `verticalAlign` | `Top` / `Center` / `Bottom` | Выравнивание содержимого по вертикали внутри элемента | + +`group*Align` отвечает на вопрос «куда сдвинуть нерастянутый элемент в его ячейке», `horizontalAlign`/`verticalAlign` — «как разместить текст внутри элемента». Это разные оси настройки, их часто комбинируют. + +```json +{ "button": "ОК", "groupHorizontalAlign": "Right" } +{ "input": "Сумма", "path": "Объект.Сумма", "horizontalAlign": "Right" } +{ "label": "Итого", "groupHorizontalAlign": "Center", "horizontalAlign": "Center" } +``` + +## Ограничение максимального размера + +По умолчанию растягивающийся элемент имеет авто-вычисляемый предел ширины/высоты. Чтобы задать жёсткий предел или вовсе снять авто-предел: + +| Ключ | Значения | Назначение | +|------|----------|-----------| +| `maxWidth` | число | Жёсткий максимум ширины элемента | +| `maxHeight` | число | Жёсткий максимум высоты элемента | +| `autoMaxWidth` | `false` | Отключить авто-предел ширины (элемент тянется без ограничения сверху) | +| `autoMaxHeight` | `false` | Отключить авто-предел высоты | + +`autoMaxWidth: false` нужен, например, для широкого многострочного поля или растянутого по всей форме поля ввода, чтобы платформа не «прижимала» его к авто-пределу. Указывают именно отклонение от дефолта; обычное значение `true` писать не нужно. + +```json +{ "input": "Комментарий", "path": "Объект.Комментарий", "multiLine": true, + "horizontalStretch": true, "autoMaxWidth": false } +{ "input": "Поиск", "path": "СтрокаПоиска", "horizontalStretch": true, "maxWidth": 600 } +``` + +## Поведение при вводе и активации + +| Ключ | Значения | Назначение | +|------|----------|-----------| +| `skipOnInput` | `true` / `false` | Пропускать элемент при обходе по Enter/Tab (фокус через него не проходит). Указывают явно, в т.ч. `false` чтобы вернуть в обход поле, которое платформа пропустила бы | +| `defaultItem` | `true` | Элемент получает фокус по умолчанию при открытии формы (поле/таблица для немедленного ввода) | + +```json +{ "input": "Идентификатор", "path": "Объект.Идентификатор", "skipOnInput": true } +{ "input": "Штрихкод", "path": "Штрихкод", "defaultItem": true } +``` + +`skipOnInput: true` — для служебных/расчётных полей, которые видны, но не редактируются вводом с клавиатуры в общем потоке. `defaultItem: true` ставят на одном элементе формы — точке, с которой пользователь начнёт работу. + +## Перетаскивание + +| Ключ | Значения | Назначение | +|------|----------|-----------| +| `enableStartDrag` | `true` | Разрешить начинать перетаскивание из элемента (источник drag-n-drop) | + +Для таблиц приём/перемещение строк управляется ключами таблицы (`enableDrag`, `changeRowOrder`) — см. основную инструкцию; `enableStartDrag` — общий низкоуровневый флаг «этот элемент может быть источником перетаскивания». + +## Закрепление колонки в таблице (`fixingInTable`) + +Свойство поля-колонки внутри таблицы: закрепить колонку у края, чтобы она не уходила при горизонтальной прокрутке. + +| Значения | +|----------| +| `None` (по умолчанию — не закреплена) / `Left` / `Right` | + +```json +{ "table": "Товары", "path": "Объект.Товары", "columns": [ + { "input": "Номенклатура", "path": "Объект.Товары.Номенклатура", "fixingInTable": "Left" }, + { "input": "Количество", "path": "Объект.Товары.Количество" }, + { "input": "Сумма", "path": "Объект.Товары.Сумма", "fixingInTable": "Right" } ] } +``` + +Закрепляют ключевые колонки (идентифицирующую слева, итоговую справа), чтобы они оставались видны при прокрутке широкой таблицы. + +## Ячейки колонок: шапка и подвал + +Для поля-колонки внутри таблицы (и `columnGroup`) — размещение в шапке/подвале и выравнивание текста ячеек. Применять только к элементам внутри `columns` таблицы. + +| Ключ | Значения | Назначение | +|------|----------|-----------| +| `showInHeader` | `true` / `false` | Показывать колонку в шапке таблицы | +| `showInFooter` | `true` / `false` | Показывать колонку в подвале (нужно для итогов; подвал самой таблицы включается `footer: true`) | +| `headerHorizontalAlign` | `Left` / `Right` / `Center` / `Auto` | Выравнивание текста в шапке колонки | +| `footerHorizontalAlign` | `Left` / `Right` / `Center` | Выравнивание текста в подвале колонки | +| `autoCellHeight` | `true` / `false` | Авто-высота ячейки (перенос содержимого на несколько строк) | + +```json +{ "table": "Товары", "path": "Объект.Товары", "footer": true, "columns": [ + { "input": "Номенклатура", "path": "Объект.Товары.Номенклатура", "autoCellHeight": true }, + { "input": "Сумма", "path": "Объект.Товары.Сумма", + "headerHorizontalAlign": "Right", "showInFooter": true, "footerHorizontalAlign": "Right" } ] } +``` + +## Адаптивная важность (`displayImportance`) + +| Значения | +|----------| +| `VeryHigh` / `High` / `Usual` / `VeryLow` / `Low` | + +Приоритет элемента при адаптивной перекомпоновке формы на узких/мобильных экранах: элементы с меньшей важностью сворачиваются/прячутся первыми. Применимо к любому элементу. + +```json +{ "input": "Комментарий", "path": "Объект.Комментарий", "displayImportance": "Low" } +``` diff --git a/.claude/skills/form-compile/references/report-form.md b/.claude/skills/form-compile/references/report-form.md new file mode 100644 index 00000000..893f2248 --- /dev/null +++ b/.claude/skills/form-compile/references/report-form.md @@ -0,0 +1,79 @@ +# Форма отчёта + +Форма, подключённая к объекту-отчёту (`Report`). Кроме обычных свойств формы у неё есть несколько свойств в `properties`, связывающих форму с механизмом компоновки (СКД): куда выводится результат, где данные расшифровки, какого она типа. Все они задаются в блоке `properties` верхнего уровня. + +```json +"properties": { + "reportFormType": "Main", + "reportResult": "РезультатОтчета", + "detailsData": "ДанныеРасшифровки" +} +``` + +Ни одно из этих свойств не обязательно — указывайте только те, что нужны конкретной форме. + +## Тип формы отчёта (`reportFormType`) + +Роль формы в составе отчёта: + +| Значение | Назначение | +|----------|-----------| +| `Main` | Основная форма отчёта (результат + настройки) | +| `Settings` | Форма настроек | +| `Variant` | Форма варианта | + +```json +"reportFormType": "Main" +``` + +## Привязка к компоновке + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `reportResult` | string | Имя реквизита-результата формы (табличный документ, куда выводится отчёт) | +| `detailsData` | string | Имя реквизита данных расшифровки | +| `variantAppearance` | string | Имя реквизита оформления варианта | + +Значение каждого ключа — имя реквизита формы (а не путь к данным). Реквизит с таким именем должен присутствовать в `attributes` формы. + +## Группа пользовательских настроек (`customSettingsFolder`) + +Группа-элемент формы, в которую генерируются пользовательские настройки компоновщика. Задаётся **по имени** элемента-группы: + +```json +"customSettingsFolder": "ГруппаПользовательскихНастроек" +``` + +## Прочие свойства компоновки + +Редкие, задавайте только при явной необходимости: + +| Ключ | Значения | Назначение | +|------|----------|-----------| +| `autoShowState` | `Auto`, `DontShow`, `ShowOnComposition` | Автопоказ состояния формирования | +| `reportResultViewMode` | `Auto` | Режим просмотра результата | +| `viewModeApplicationOnSetReportResult` | `Auto` | Применение режима просмотра при установке результата | + +## Реалистичный пример + +Основная форма отчёта со СКД: реквизит-результат, данные расшифровки и группа пользовательских настроек. + +```json +{ + "properties": { + "reportFormType": "Main", + "reportResult": "РезультатОтчета", + "detailsData": "ДанныеРасшифровки", + "customSettingsFolder": "ГруппаПользовательскихНастроек" + }, + "attributes": [ + { "name": "РезультатОтчета", "type": "SpreadsheetDocument" }, + { "name": "ДанныеРасшифровки", "type": "DataCompositionDetailsData" } + ], + "elements": [ + { "group": "vertical", "name": "ГруппаПользовательскихНастроек" }, + { "spreadsheet": "РезультатОтчета", "path": "РезультатОтчета", + "titleLocation": "none" } + ] +} +``` diff --git a/.claude/skills/form-compile/references/roles-access.md b/.claude/skills/form-compile/references/roles-access.md new file mode 100644 index 00000000..4994eb55 --- /dev/null +++ b/.claude/skills/form-compile/references/roles-access.md @@ -0,0 +1,73 @@ +# Доступ по ролям + +Единый механизм платформы для разграничения по ролям: задаётся общее значение для всех ролей плюс исключения для конкретных ролей. Один и тот же формат значения у четырёх ключей — каждый на своём владельце: + +| Ключ | Владелец | Смысл | +|------|----------|-------| +| `userVisible` | элемент формы | пользовательская видимость элемента | +| `view` | реквизит формы | право просмотра | +| `edit` | реквизит формы | право редактирования | +| `use` | команда формы | доступность команды | + +Ключ необязателен: его отсутствие = полный доступ для всех ролей. + +## Значение + +Две формы (одинаковы для всех четырёх ключей): + +**Скаляр** `true` / `false` — общее значение для всех ролей, без исключений: + +```json +{ "input": "Поле", "userVisible": false } +``` + +**Объект** `{ "common": , "roles": { "ИмяРоли": , … } }` — общее значение `common` плюс явные исключения по ролям: + +```json +{ "name": "Реквизит", + "edit": { "common": false, "roles": { "ПолныеПрава": true } } } +``` + +Роль, **не указанная** в `roles`, наследует `common`. Указанная — задаёт явный `true`/`false` (может и совпадать с `common`). + +## Имя роли + +Ключи в `roles` — имена ролей конфигурации (`ПолныеПрава`, `Бухгалтер`, …). + +## Примеры + +Элемент скрыт у всех пользователей: + +```json +{ "input": "Комментарий", "userVisible": false } +``` + +Реквизит не виден никому и редактируется только одной ролью: + +```json +{ "name": "СуммаБонуса", + "view": false, + "edit": { "common": false, "roles": { "ПолныеПрава": true } } } +``` + +Поле доступно для просмотра всем, но редактируемо только администратору: + +```json +{ "name": "Статус", + "view": true, + "edit": { "common": false, "roles": { "Администратор": true } } } +``` + +Команда недоступна по умолчанию, разрешена только бухгалтеру: + +```json +{ "name": "ПровестиЗакрытие", + "use": { "common": false, "roles": { "Бухгалтер": true } } } +``` + +Обратный случай — доступно всем, кроме одной роли: + +```json +{ "name": "РедактироватьЦену", + "edit": { "common": true, "roles": { "Кладовщик": false } } } +``` diff --git a/.claude/skills/form-compile/references/special-fields.md b/.claude/skills/form-compile/references/special-fields.md new file mode 100644 index 00000000..8326dfe5 --- /dev/null +++ b/.claude/skills/form-compile/references/special-fields.md @@ -0,0 +1,109 @@ +# Спец-поля «документ/датчик» + +Поля для отображения специальных данных: табличный документ, HTML, текст, форматированный документ, индикатор, ползунок. Каждое привязывается к реквизиту своего платформенного типа. + +Структурно это обычные поля — поддерживают общий скелет поля (`path`, `title`, `titleLocation`, флаги `readOnly`/`enabled`/`visible`, `layout`, оформление, события). Ниже — только ключ `type` (имя элемента задаётся значением ключа) и собственные скаляры каждого семейства. Все скаляры необязательны. + +| Ключ типа | Тип реквизита | +|-----------|---------------| +| `spreadsheet` | `mxl:SpreadsheetDocument` (ТабличныйДокумент) | +| `html` | `string` | +| `textDoc` | `d5p1:TextDocument` (ТекстовыйДокумент) | +| `formattedDoc` | `fd:FormattedDocument` (ФорматированныйДокумент) | +| `progressBar` | число | +| `trackBar` | число | + +## spreadsheet — поле табличного документа + +Просмотр/редактирование табличного документа (отчёт, печатная форма). + +```json +{ "spreadsheet": "ТаблицаОтчета", "path": "ТаблицаОтчета", + "titleLocation": "none", "readOnly": true, + "output": "Disable", "protection": true } +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `output` | string | Использование вывода: `Enable` / `Disable` | +| `protection` | bool | Защита от изменений | +| `edit` | bool | Разрешить редактирование | +| `showGrid` | bool | Показывать сетку | +| `showHeaders` | bool | Показывать заголовки строк/колонок | +| `showGroups` | bool | Показывать группировки | +| `showRowAndColumnNames` | bool | Показывать имена строк и колонок | +| `showCellNames` | bool | Показывать имена ячеек | +| `verticalScrollBar` / `horizontalScrollBar` | string | Режим полос прокрутки | +| `viewScalingMode` | string | Режим масштабирования просмотра | +| `selectionShowMode` | string | Режим отображения выделения | +| `pointerType` | string | Тип указателя | +| `enableDrag` / `enableStartDrag` | bool | Разрешить перетаскивание / начало перетаскивания | + +## html — поле HTML-документа + +Просмотр HTML. Реквизит — строка (содержит HTML-текст или адрес). + +```json +{ "html": "Просмотр", "path": "СодержимоеHTML", "titleLocation": "none", + "output": "Enable", "warningOnEditRepresentation": false } +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `output` | string | Использование вывода: `Enable` / `Disable` | +| `warningOnEditRepresentation` | bool | Предупреждать при изменении представления | + +## textDoc — поле текстового документа + +Просмотр/редактирование текстового документа. + +```json +{ "textDoc": "Текст", "path": "ТекстДокумента", "editMode": "Edit" } +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `editMode` | string | Режим редактирования (напр. `Edit` / `View`) | + +## formattedDoc — поле форматированного документа + +Просмотр/редактирование форматированного документа. + +```json +{ "formattedDoc": "Описание", "path": "ФорматированноеОписание", "editMode": "Edit" } +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `editMode` | string | Режим редактирования (напр. `Edit` / `View`) | + +## progressBar — поле индикатора + +Индикатор прогресса. Реквизит — числовой. + +```json +{ "progressBar": "Прогресс", "path": "Прогресс", + "minValue": 0, "maxValue": 100, "showPercent": true } +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `minValue` / `maxValue` | число | Минимальное / максимальное значение | +| `showPercent` | bool | Показывать проценты | + +## trackBar — поле ползунка + +Регулятор-ползунок. Реквизит — числовой. + +```json +{ "trackBar": "Масштаб", "path": "Масштаб", + "minValue": 20, "maxValue": 400, "markingStep": 20 } +``` + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `minValue` / `maxValue` | число | Минимальное / максимальное значение | +| `step` | число | Шаг изменения | +| `largeStep` | число | Крупный шаг | +| `markingStep` | число | Шаг разметки | +| `markingAppearance` | string | Оформление разметки | diff --git a/.claude/skills/form-compile/references/table-advanced.md b/.claude/skills/form-compile/references/table-advanced.md new file mode 100644 index 00000000..58bddb99 --- /dev/null +++ b/.claude/skills/form-compile/references/table-advanced.md @@ -0,0 +1,132 @@ +# Таблица — продвинутые возможности + +Базовый элемент таблицы (`type: "table"`, колонки, основные свойства) описан в основной инструкции, раздел «Таблица (table)». Здесь — продвинутые возможности: дополнения командной панели, специфика таблицы динамического списка и неочевидные свойства/режимы. + +## Представление (`representation`) + +Как таблица рисует строки: + +```json +{ "table": "Список", "path": "Список", "representation": "Tree" } +``` + +`List` — плоский список (по умолчанию), `Tree` — дерево, `HierarchicalList` — иерархический список (группы + элементы на одном уровне). + +Для дерева/иерархии управляйте раскрытием уровней через `initialTreeView` (`ExpandTopLevel` / `ExpandAllLevels` / `NoExpand`). + +## Выделение и текущая строка + +| Ключ | Значения | Назначение | +|------|----------|-----------| +| `selectionMode` | `SingleRow` / `MultiRow` | Режим выделения строк | +| `multipleChoice` | bool | Разрешить множественный выбор (для форм выбора) | +| `currentRowUse` | `DontUse` / `Use` / `SelectionPresentation` / `SelectionPresentationAndChoice` / `Choice` | Использование текущей строки таблицы | + +```json +{ "table": "Список", "path": "Список", "selectionMode": "MultiRow", "multipleChoice": true } +``` + +## Поиск при вводе (`searchOnInput`) + +Поведение встроенного поиска при наборе текста в таблице: + +```json +{ "table": "Список", "path": "Список", "searchOnInput": "Use" } +``` + +`Auto` (по умолчанию) / `Use` (искать) / `DontUse` (не искать). + +Где располагать сами элементы поиска — управляется `searchStringLocation` / `viewStatusLocation` / `searchControlLocation` (`None` / `Top` / `Bottom` / `CommandBar` / `Auto`). + +## Прочие свойства таблицы + +| Ключ | Тип | Назначение | +|------|-----|-----------| +| `useAlternationRowColor` | bool | Чередование цвета строк | +| `verticalLines` / `horizontalLines` | bool | Линии сетки (укажите `false`, чтобы скрыть) | +| `markIncomplete` | bool | Автоотметка незаполненных ячеек | +| `heightInTableRows` | int | Высота элемента в строках (отдельно от `height`) | +| `autoInsertNewRow` | bool | Автодобавление новой строки при вводе в последнюю | +| `rowsPicture` | string \| object | Картинка строк. Ссылка (`"CommonPicture.X"`, `"abs:..."`) либо объект `{ src, loadTransparent?, transparentPixel? }` | +| `tooltipRepresentation` | string | Режим показа подсказки таблицы: `None`, `Button`, `ShowBottom`, `ShowTop`, `ShowLeft`, `ShowRight`, `ShowAuto`, `Balloon` | + +## Фиксация колонки (`fixingInTable`) + +Свойство **колонки** (на `input` / `labelField` / `check` / `picField` внутри `columns`), а не самой таблицы. Закрепляет колонку у края при горизонтальной прокрутке: + +```json +{ "table": "Товары", "path": "Объект.Товары", "columns": [ + { "input": "Номенклатура", "path": "Объект.Товары.Номенклатура", "fixingInTable": "Left" }, + { "input": "Количество", "path": "Объект.Товары.Количество" } +]} +``` + +`Left` / `Right` / `None`. + +## Исключённые команды (`excludedCommands`) + +Убрать стандартные команды редактора таблицы (кнопки добавления/перемещения/сортировки): + +```json +{ "table": "Товары", "path": "Объект.Товары", + "excludedCommands": [ "Add", "Delete", "MoveUp", "SortListAsc" ] } +``` + +Свойство работает на любом поле и на уровне формы; для таблицы значимы команды вида `Add` / `Delete` / `MoveUp` / `MoveDown` / `SortListAsc` / `SortListDesc`. + +## Дополнения командной панели (`additions`) + +Дополнения — это «представления» встроенного поиска таблицы: + +- `searchString` — отображение строки поиска, +- `viewStatus` — состояние просмотра, +- `searchControl` — управление поиском. + +Каждое дополнение — полноценный элемент (полный набор свойств поля). Размещать их можно двумя способами. + +**(1) Стандартные дополнения** генерирует платформа на уровне таблицы. В DSL указывайте **только отклонения** от стандартного вида — через карту `additions` (ключ = тип дополнения): + +```json +{ "table": "Список", "path": "Список", + "additions": { "viewStatus": { "horizontalLocation": "left" } } } +``` + +**(2) Кастомное дополнение**, размещённое прямо в командной панели — обычный элемент в `commandBar` с ключом-типом: + +```json +{ "table": "Список", "path": "Список", "commandBar": [ + { "searchString": "ПоискСписка", "source": "Список", "width": 15, "horizontalStretch": true } +]} +``` + +- Тип-ключ: `searchString` / `viewStatus` / `searchControl`. +- `source` — имя таблицы-источника; необязательно, по умолчанию = имя родительской таблицы. +- `horizontalLocation`: `auto` (по умолчанию) / `left` / `right`. Применимо и к обычным элементам командных панелей. +- Прочие свойства как у поля: `title`, `visible`, `userVisible`, `enabled`, `tooltip`, оформление, `width` / `maxWidth` / `autoMaxWidth` / `horizontalStretch` / `groupHorizontalAlign` и др. + +## Таблица динамического списка + +Когда `path` таблицы указывает на реквизит `type: "DynamicList"` (см. `references/dynamic-list.md`), доступен блок специфичных свойств. Указывайте **только отличия** от умолчания. + +| Ключ | Тип | Умолчание | Назначение | +|------|-----|-----------|-----------| +| `rowPictureDataPath` | string | картинка осн. таблицы | Путь к картинке строки. `""` — подавить картинку | +| `rowsPicture` | string | — | Картинка строк (`"CommonPicture.X"`) | +| `autoRefresh` | bool | `false` | Автообновление списка | +| `autoRefreshPeriod` | int | `60` | Период автообновления, сек | +| `updateOnDataChange` | string | `Auto` | Обновлять при изменении данных: `Auto` / `DontUpdate` | +| `choiceFoldersAndItems` | string | `Items` | Что выбирать: `Items` / `Folders` / `FoldersAndItems` | +| `restoreCurrentRow` | bool | `false` | Восстанавливать текущую строку при обновлении | +| `showRoot` | bool | `true` | Показывать корень | +| `allowRootChoice` | bool | `false` | Разрешить выбор корня | +| `allowGettingCurrentRowURL` | bool | `true` | Разрешить получение URL текущей строки | +| `userSettingsGroup` | string | — | Группа пользовательских настроек (привязка к одноимённой группе настроек) | + +```json +{ "table": "Список", "path": "Список", + "representation": "Tree", + "rowPictureDataPath": "Список.DefaultPicture", + "choiceFoldersAndItems": "FoldersAndItems", + "allowRootChoice": true, + "updateOnDataChange": "DontUpdate" } +``` diff --git a/.claude/skills/form-compile/references/type-system-advanced.md b/.claude/skills/form-compile/references/type-system-advanced.md new file mode 100644 index 00000000..117d709a --- /dev/null +++ b/.claude/skills/form-compile/references/type-system-advanced.md @@ -0,0 +1,77 @@ +# Продвинутые конструкции типов + +Примитивы (`string(n)`, `number(p,s)`, `boolean`, `date`/`dateTime`, …) и одиночные ссылки (`CatalogRef.Контрагенты`, `DocumentRef.Заказ`, `EnumRef.X`, …) описаны в основной инструкции. Здесь — типы, которые нельзя выразить одним именем: составные типы, наборы типов и платформенные наборы ссылок. + +Любая из этих конструкций пишется в поле `type` реквизита, реквизита-параметра или поля. + +## Составные типы + +Несколько типов на одном реквизите — части перечисляются через разделитель `" | "` (можно `+`). Реквизит сможет принимать значение любого из перечисленных типов: + +```json +{ "name": "Плательщик", + "type": "CatalogRef.Организации | CatalogRef.ИндивидуальныеПредприниматели" } +``` + +Смешивать можно типы из разных категорий — ссылки, примитивы, наборы типов: + +```json +{ "name": "Источник", + "type": "CatalogRef.Контрагенты | DocumentRef.Заказ | string(150)" } +``` + +Каждая часть — самостоятельный токен из этого файла или из основной инструкции. Порядок частей произвольный. + +## Наборы типов (TypeSet) + +«Набор типов» подставляется вместо конкретного типа — это один токен, а не перечисление. Применимо и в составном типе как одна из частей. + +| Токен `type` | Смысл | +|------|-------| +| `"DefinedType.ИмяТипа"` | определяемый тип конфигурации | +| `"Characteristic.ИмяПлана"` | тип значения характеристики (по плану видов характеристик) | +| `"AnyRef"` | любая ссылка | +| `"AnyIBRef"` | любая ссылка информационной базы | + +Определяемый тип — реквизит принимает то, что задано в определяемом типе конфигурации (например `DefinedType.ДенежнаяСумма`): + +```json +{ "name": "Сумма", "type": "DefinedType.ДенежнаяСумма" } +``` + +Характеристика — тип значения берётся из плана видов характеристик: + +```json +{ "name": "Значение", "type": "Characteristic.ДополнительныеРеквизиты" } +``` + +## Платформенные наборы ссылок + +«Голый» ссылочный токен **без `.Имя`** означает «любая ссылка этой категории объектов»: + +| Токен `type` | Смысл | +|------|-------| +| `"CatalogRef"` | любая ссылка справочника | +| `"DocumentRef"` | любая ссылка документа | +| `"EnumRef"` | любая ссылка перечисления | +| `"ExchangePlanRef"` | любая ссылка плана обмена | +| `"TaskRef"` | любая ссылка задачи | +| `"BusinessProcessRef"` | любая ссылка бизнес-процесса | +| `"ChartOfCharacteristicTypesRef"` | любая ссылка плана видов характеристик | +| `"ChartOfAccountsRef"` | любая ссылка плана счетов | +| `"ChartOfCalculationTypesRef"` | любая ссылка плана видов расчёта | + +Различие с одиночной ссылкой — только в наличии `.Имя`: + +- `"CatalogRef.Валюты"` — конкретный справочник «Валюты»; +- `"CatalogRef"` — любой справочник. + +```json +{ "name": "ЛюбойСправочник", "type": "CatalogRef" } +``` + +Эти наборы тоже комбинируются в составном типе: + +```json +{ "name": "Объект", "type": "CatalogRef | DocumentRef" } +``` diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index d531b611..0cb8c998 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -361,7 +361,7 @@ companion-панели с собственным контентом. Оба не #### group — UsualGroup ```json -{ "group": "horizontal", "name": "ГруппаШапка", "children": [ ... ] } +{ "group": "alwaysHorizontal", "name": "ГруппаШапка", "children": [ ... ] } ``` | Свойство | Тип | Описание |