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": [ ... ] }
```
| Свойство | Тип | Описание |