mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-11 00:14:56 +03:00
Expand form-compile SKILL.md with full DSL reference and patterns
Replace minimal docs with comprehensive reference: - Per-element-type property tables (input, check, label, group, table, pages, button, cmdBar) with all supported keys - Top-level structure documentation (title, properties, events, etc.) - Table+attribute linkage section explaining the ValueTable pattern - Three pattern examples: file import dialog, wizard with steps, list with filter and table - Attribute and command definition examples This helps the model generate correct JSON DSL from natural language requirements on the first attempt without guessing undocumented keys. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -32,7 +32,27 @@ allowed-tools:
|
||||
powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile.ps1 -JsonPath "<json>" -OutputPath "<xml>"
|
||||
```
|
||||
|
||||
## JSON DSL — краткая справка
|
||||
## JSON DSL — справка
|
||||
|
||||
### Структура верхнего уровня
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Заголовок формы",
|
||||
"properties": { "autoTitle": false, ... },
|
||||
"events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
|
||||
"excludedCommands": ["Reread"],
|
||||
"elements": [ ... ],
|
||||
"attributes": [ ... ],
|
||||
"commands": [ ... ],
|
||||
"parameters": [ ... ]
|
||||
}
|
||||
```
|
||||
|
||||
- `title` — заголовок формы (multilingual). Можно указать и в `properties`, но лучше на верхнем уровне
|
||||
- `properties` — свойства формы: `autoTitle`, `windowOpeningMode`, `commandBarLocation`, `saveDataInSettings`, `width`, `height` и др.
|
||||
- `events` — обработчики событий формы (ключ: имя события 1С, значение: имя процедуры)
|
||||
- `excludedCommands` — исключённые стандартные команды
|
||||
|
||||
### Элементы (ключ определяет тип)
|
||||
|
||||
@@ -41,7 +61,7 @@ powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile
|
||||
| `"group"` | UsualGroup | `"horizontal"` / `"vertical"` / `"alwaysHorizontal"` / `"alwaysVertical"` / `"collapsible"` |
|
||||
| `"input"` | InputField | имя элемента |
|
||||
| `"check"` | CheckBoxField | имя |
|
||||
| `"label"` | LabelDecoration | имя |
|
||||
| `"label"` | LabelDecoration | имя (текст задаётся через `title`) |
|
||||
| `"labelField"` | LabelField | имя |
|
||||
| `"table"` | Table | имя |
|
||||
| `"pages"` | Pages | имя |
|
||||
@@ -53,24 +73,134 @@ powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile
|
||||
| `"cmdBar"` | CommandBar | имя |
|
||||
| `"popup"` | Popup | имя |
|
||||
|
||||
### Общие свойства элементов
|
||||
### Общие свойства (все типы элементов)
|
||||
|
||||
- `"name"` — переопределить имя (по умолчанию из значения ключа типа)
|
||||
- `"path"` — DataPath (привязка к данным)
|
||||
- `"title"` — заголовок
|
||||
- `"visible": false` — Visible=false (скрыть элемент)
|
||||
- `"enabled": false` — Enabled=false (сделать недоступным)
|
||||
- `"readOnly": true` — ReadOnly=true
|
||||
- `"on": ["OnChange", "StartChoice"]` — события с автоименованием обработчиков
|
||||
| Ключ | Описание |
|
||||
|------|----------|
|
||||
| `name` | Переопределить имя (по умолчанию = значение ключа типа) |
|
||||
| `title` | Заголовок элемента |
|
||||
| `visible: false` | Скрыть (синоним: `hidden: true`) |
|
||||
| `enabled: false` | Сделать недоступным (синоним: `disabled: true`) |
|
||||
| `readOnly: true` | Только чтение |
|
||||
| `on: [...]` | События с автоименованием обработчиков |
|
||||
| `handlers: {...}` | Явное задание имён обработчиков: `{"OnChange": "МоёИмя"}` |
|
||||
|
||||
### Свойства кнопок
|
||||
### Поле ввода (input)
|
||||
|
||||
- `"command": "ИмяКоманды"` — привязка к команде формы → `Form.Command.ИмяКоманды`
|
||||
- `"stdCommand": "Close"` — привязка к стандартной команде → `Form.StandardCommand.Close`
|
||||
- `"defaultButton": true` — кнопка по умолчанию
|
||||
- `"type": "hyperlink"` — тип кнопки (`"usual"` / `"hyperlink"` / `"commandBar"`)
|
||||
| Ключ | Описание | Пример |
|
||||
|------|----------|--------|
|
||||
| `path` | DataPath — привязка к данным | `"Объект.Организация"` |
|
||||
| `titleLocation` | Размещение заголовка | `"none"`, `"left"`, `"top"` |
|
||||
| `multiLine: true` | Многострочное поле | текстовое поле, комментарий |
|
||||
| `passwordMode: true` | Режим пароля (звёздочки) | поле ввода пароля |
|
||||
| `choiceButton: true` | Кнопка выбора ("...") | ссылочное поле |
|
||||
| `clearButton: true` | Кнопка очистки ("X") | |
|
||||
| `spinButton: true` | Кнопка прокрутки | числовые поля |
|
||||
| `dropListButton: true` | Кнопка выпадающего списка | |
|
||||
| `markIncomplete: true` | Пометка незаполненного | обязательные поля |
|
||||
| `skipOnInput: true` | Пропускать при обходе Tab | |
|
||||
| `inputHint` | Подсказка в пустом поле | `"Введите наименование..."` |
|
||||
| `width` / `height` | Размер | числа |
|
||||
| `autoMaxWidth: false` | Отключить авто-ширину | для фиксированных полей |
|
||||
| `horizontalStretch: true` | Растягивать по ширине | |
|
||||
|
||||
### Система типов (shorthand)
|
||||
### Чекбокс (check)
|
||||
|
||||
| Ключ | Описание |
|
||||
|------|----------|
|
||||
| `path` | DataPath |
|
||||
| `titleLocation` | Размещение заголовка |
|
||||
|
||||
### Надпись-декорация (label)
|
||||
|
||||
| Ключ | Описание |
|
||||
|------|----------|
|
||||
| `title` | Текст надписи (обязательно) |
|
||||
| `hyperlink: true` | Сделать ссылкой |
|
||||
| `width` / `height` | Размер |
|
||||
|
||||
### Группа (group)
|
||||
|
||||
Значение ключа задаёт ориентацию: `"horizontal"`, `"vertical"`, `"alwaysHorizontal"`, `"alwaysVertical"`, `"collapsible"`.
|
||||
|
||||
| Ключ | Описание |
|
||||
|------|----------|
|
||||
| `showTitle: true` | Показывать заголовок группы |
|
||||
| `united: false` | Не объединять рамку |
|
||||
| `representation` | `"none"`, `"normal"`, `"weak"`, `"strong"` |
|
||||
| `children: [...]` | Вложенные элементы |
|
||||
|
||||
### Таблица (table)
|
||||
|
||||
**Важно**: таблица требует связанный реквизит формы типа `ValueTable` с колонками (см. раздел "Связки").
|
||||
|
||||
| Ключ | Описание |
|
||||
|------|----------|
|
||||
| `path` | DataPath (привязка к реквизиту-таблице) |
|
||||
| `columns: [...]` | Колонки — массив элементов (обычно `input`) |
|
||||
| `changeRowSet: true` | Разрешить добавление/удаление строк |
|
||||
| `changeRowOrder: true` | Разрешить перемещение строк |
|
||||
| `height` | Высота в строках таблицы |
|
||||
| `header: false` | Скрыть шапку |
|
||||
| `footer: true` | Показать подвал |
|
||||
| `commandBarLocation` | `"None"`, `"Top"`, `"Auto"` |
|
||||
| `searchStringLocation` | `"None"`, `"Top"`, `"Auto"` |
|
||||
|
||||
### Страницы (pages + page)
|
||||
|
||||
| Ключ (pages) | Описание |
|
||||
|------|----------|
|
||||
| `pagesRepresentation` | `"None"`, `"TabsOnTop"`, `"TabsOnBottom"` и др. |
|
||||
| `children: [...]` | Массив `page` |
|
||||
|
||||
| Ключ (page) | Описание |
|
||||
|------|----------|
|
||||
| `title` | Заголовок вкладки |
|
||||
| `group` | Ориентация внутри страницы |
|
||||
| `children: [...]` | Содержимое страницы |
|
||||
|
||||
### Кнопка (button)
|
||||
|
||||
| Ключ | Описание |
|
||||
|------|----------|
|
||||
| `command` | Имя команды формы → `Form.Command.Имя` |
|
||||
| `stdCommand` | Стандартная команда → `Form.StandardCommand.Close` и др. |
|
||||
| `defaultButton: true` | Кнопка по умолчанию |
|
||||
| `type` | `"usual"`, `"hyperlink"`, `"commandBar"` |
|
||||
| `picture` | Картинка кнопки |
|
||||
| `representation` | `"Auto"`, `"Text"`, `"Picture"`, `"PictureAndText"` |
|
||||
| `locationInCommandBar` | `"Auto"`, `"InCommandBar"`, `"InAdditionalSubmenu"` |
|
||||
|
||||
### Командная панель (cmdBar)
|
||||
|
||||
| Ключ | Описание |
|
||||
|------|----------|
|
||||
| `autofill: true` | Автозаполнение стандартными командами |
|
||||
| `children: [...]` | Кнопки панели |
|
||||
|
||||
### Реквизиты (attributes)
|
||||
|
||||
```json
|
||||
{ "name": "Объект", "type": "DataProcessorObject.Загрузка", "main": true }
|
||||
{ "name": "Итого", "type": "decimal(15,2)" }
|
||||
{ "name": "Таблица", "type": "ValueTable", "columns": [
|
||||
{ "name": "Номенклатура", "type": "CatalogRef.Номенклатура" },
|
||||
{ "name": "Количество", "type": "decimal(10,3)" }
|
||||
]}
|
||||
```
|
||||
|
||||
- `savedData: true` — сохраняемые данные
|
||||
|
||||
### Команды (commands)
|
||||
|
||||
```json
|
||||
{ "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
|
||||
```
|
||||
|
||||
- `title` — заголовок (если отличается от name)
|
||||
- `picture` — картинка команды
|
||||
|
||||
### Система типов
|
||||
|
||||
| DSL | XML |
|
||||
|------------------------|----------------------------------------|
|
||||
@@ -79,29 +209,77 @@ powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile
|
||||
| `"decimal(10,0,nonneg)"` | с AllowedSign=Nonnegative |
|
||||
| `"boolean"` | `xs:boolean` |
|
||||
| `"date"` / `"dateTime"` / `"time"` | `xs:dateTime` + DateFractions |
|
||||
| `"CatalogRef.Организации"` | `cfg:CatalogRef.Организации` |
|
||||
| `"DocumentObject.Реализация"` | `cfg:DocumentObject.Реализация` |
|
||||
| `"CatalogRef.XXX"` | `cfg:CatalogRef.XXX` |
|
||||
| `"DocumentRef.XXX"` | `cfg:DocumentRef.XXX` |
|
||||
| `"ValueTable"` | `v8:ValueTable` |
|
||||
| `"ValueList"` | `v8:ValueListType` |
|
||||
| `"Type1 \| Type2"` | составной тип |
|
||||
|
||||
### Пример JSON
|
||||
## Связки: элемент + реквизит
|
||||
|
||||
Таблица и некоторые поля требуют связанный реквизит. Элемент ссылается на реквизит через `path`.
|
||||
|
||||
**Таблица** — элемент `table` + реквизит `ValueTable`:
|
||||
```json
|
||||
{
|
||||
"title": "Загрузка данных",
|
||||
"properties": { "autoTitle": false },
|
||||
"events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
|
||||
"elements": [
|
||||
{ "group": "horizontal", "name": "Шапка", "children": [
|
||||
{ "input": "Организация", "path": "Объект.Организация", "on": ["OnChange"] }
|
||||
]},
|
||||
{ "table": "Товары", "path": "Объект.Товары", "columns": [
|
||||
{ "input": "Номенклатура", "path": "Объект.Товары.Номенклатура" }
|
||||
]}
|
||||
],
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "DataProcessorObject.ЗагрузкаДанных", "main": true }
|
||||
{ "name": "Объект", "type": "DataProcessorObject.Загрузка", "main": true,
|
||||
"columns": [
|
||||
{ "name": "Товары", "type": "ValueTable", "columns": [
|
||||
{ "name": "Номенклатура", "type": "CatalogRef.Номенклатура" }
|
||||
]}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Или, если таблица привязана к реквизиту формы (не к Объект):
|
||||
```json
|
||||
{
|
||||
"elements": [
|
||||
{ "table": "ТаблицаДанных", "path": "ТаблицаДанных", "columns": [
|
||||
{ "input": "Наименование", "path": "ТаблицаДанных.Наименование" }
|
||||
]}
|
||||
],
|
||||
"attributes": [
|
||||
{ "name": "ТаблицаДанных", "type": "ValueTable", "columns": [
|
||||
{ "name": "Наименование", "type": "string(150)" }
|
||||
]}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Паттерны
|
||||
|
||||
### Диалог загрузки файла
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Загрузка из файла",
|
||||
"properties": { "autoTitle": false },
|
||||
"events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
|
||||
"elements": [
|
||||
{ "group": "horizontal", "name": "ГруппаФайл", "children": [
|
||||
{ "input": "ИмяФайла", "path": "ИмяФайла", "title": "Файл", "inputHint": "Выберите файл...", "choiceButton": true, "on": ["StartChoice"] },
|
||||
{ "check": "ПерваяСтрокаЗаголовок", "path": "ПерваяСтрокаЗаголовок" }
|
||||
]},
|
||||
{ "input": "Результат", "path": "Результат", "multiLine": true, "height": 8, "readOnly": true, "title": "Лог" },
|
||||
{ "group": "horizontal", "name": "ГруппаКнопок", "children": [
|
||||
{ "button": "Загрузить", "command": "Загрузить", "defaultButton": true },
|
||||
{ "button": "Закрыть", "stdCommand": "Close" }
|
||||
]}
|
||||
],
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "ExternalDataProcessorObject.ЗагрузкаИзФайла", "main": true },
|
||||
{ "name": "ИмяФайла", "type": "string" },
|
||||
{ "name": "ПерваяСтрокаЗаголовок", "type": "boolean" },
|
||||
{ "name": "Результат", "type": "string" }
|
||||
],
|
||||
"commands": [
|
||||
{ "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
|
||||
@@ -109,26 +287,84 @@ powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile
|
||||
}
|
||||
```
|
||||
|
||||
### Автогенерация
|
||||
### Мастер (wizard) с шагами
|
||||
|
||||
- **Companion-элементы**: ContextMenu, ExtendedTooltip и др. создаются автоматически с правильными именами и ID
|
||||
- **Обработчики событий**: `"on": ["OnChange"]` → `<Event name="OnChange">ОрганизацияПриИзменении</Event>`
|
||||
- **Namespace**: все 17 namespace-деклараций добавляются автоматически
|
||||
- **ID**: последовательная нумерация, AutoCommandBar всегда id="-1"
|
||||
```json
|
||||
{
|
||||
"title": "Мастер настройки",
|
||||
"properties": { "autoTitle": false },
|
||||
"elements": [
|
||||
{ "pages": "СтраницыМастера", "pagesRepresentation": "None", "children": [
|
||||
{ "page": "Шаг1", "title": "Параметры", "children": [
|
||||
{ "input": "Параметр1", "path": "Параметр1" }
|
||||
]},
|
||||
{ "page": "Шаг2", "title": "Результат", "children": [
|
||||
{ "input": "Итог", "path": "Итог", "readOnly": true }
|
||||
]}
|
||||
]},
|
||||
{ "group": "horizontal", "name": "Навигация", "children": [
|
||||
{ "button": "Назад", "command": "Назад", "title": "< Назад" },
|
||||
{ "button": "Далее", "command": "Далее", "title": "Далее >" }
|
||||
]}
|
||||
],
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "ExternalDataProcessorObject.Мастер", "main": true },
|
||||
{ "name": "Параметр1", "type": "string" },
|
||||
{ "name": "Итог", "type": "string" }
|
||||
],
|
||||
"commands": [
|
||||
{ "name": "Назад", "action": "НазадОбработка" },
|
||||
{ "name": "Далее", "action": "ДалееОбработка" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Список с фильтром и таблицей
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Просмотр данных",
|
||||
"elements": [
|
||||
{ "group": "horizontal", "name": "Фильтр", "children": [
|
||||
{ "input": "Период", "path": "Период", "on": ["OnChange"] },
|
||||
{ "input": "Организация", "path": "Организация", "on": ["OnChange"] }
|
||||
]},
|
||||
{ "table": "Данные", "path": "Данные", "changeRowSet": true, "columns": [
|
||||
{ "input": "Дата", "path": "Данные.Дата" },
|
||||
{ "input": "Сумма", "path": "Данные.Сумма" },
|
||||
{ "input": "Комментарий", "path": "Данные.Комментарий" }
|
||||
]}
|
||||
],
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "ExternalDataProcessorObject.Просмотр", "main": true },
|
||||
{ "name": "Период", "type": "date" },
|
||||
{ "name": "Организация", "type": "string" },
|
||||
{ "name": "Данные", "type": "ValueTable", "columns": [
|
||||
{ "name": "Дата", "type": "date" },
|
||||
{ "name": "Сумма", "type": "decimal(15,2)" },
|
||||
{ "name": "Комментарий", "type": "string(200)" }
|
||||
]}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Автогенерация
|
||||
|
||||
- **Companion-элементы**: ContextMenu, ExtendedTooltip и др. создаются автоматически
|
||||
- **Обработчики событий**: `"on": ["OnChange"]` → `ОрганизацияПриИзменении`
|
||||
- **Namespace**: все 17 namespace-деклараций
|
||||
- **ID**: последовательная нумерация, AutoCommandBar = id="-1"
|
||||
- **Unknown keys**: выводится предупреждение о нераспознанных ключах
|
||||
|
||||
## Верификация
|
||||
|
||||
Используйте `/form-info` для проверки результата:
|
||||
|
||||
```
|
||||
/form-info <OutputPath>
|
||||
/form-validate <OutputPath> — проверка корректности XML
|
||||
/form-info <OutputPath> — визуальная сводка структуры
|
||||
```
|
||||
|
||||
Структура в сводке должна совпадать с определением в JSON.
|
||||
|
||||
## Особенности для внешних обработок (EPF)
|
||||
|
||||
- **Тип главного реквизита**: `ExternalDataProcessorObject.ИмяОбработки` (не `DataProcessorObject`)
|
||||
- **DataPath**: используйте реквизиты формы (`ИмяРеквизита`), а не `Объект.ИмяРеквизита` — у внешних обработок нет реквизитов объекта в метаданных
|
||||
- **Ссылочные типы**: `CatalogRef.XXX`, `DocumentRef.XXX` и т.д. могут не собраться в пустой базе — используйте `string` или базовые типы для автономной сборки
|
||||
|
||||
|
||||
Reference in New Issue
Block a user