mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-12 17:04:57 +03:00
Add form-compile skill for generating Form.xml from JSON DSL
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
---
|
||||
name: form-compile
|
||||
description: Компиляция управляемой формы 1С (Form.xml) из компактного JSON-определения
|
||||
argument-hint: <JsonPath> <OutputPath>
|
||||
allowed-tools:
|
||||
- Bash
|
||||
- Read
|
||||
- Write
|
||||
- Glob
|
||||
---
|
||||
|
||||
# /form-compile — Генерация Form.xml из JSON DSL
|
||||
|
||||
Принимает компактное JSON-определение формы (20–50 строк) и генерирует полный корректный Form.xml (100–500+ строк) с namespace-декларациями, автогенерированными companion-элементами, последовательными ID.
|
||||
|
||||
## Использование
|
||||
|
||||
```
|
||||
/form-compile <JsonPath> <OutputPath>
|
||||
```
|
||||
|
||||
## Параметры
|
||||
|
||||
| Параметр | Обязательный | Описание |
|
||||
|------------|:------------:|-----------------------------------|
|
||||
| JsonPath | да | Путь к JSON-определению формы |
|
||||
| OutputPath | да | Путь к выходному файлу Form.xml |
|
||||
|
||||
## Команда
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -File .claude\skills\form-compile\scripts\form-compile.ps1 -JsonPath "<json>" -OutputPath "<xml>"
|
||||
```
|
||||
|
||||
## JSON DSL — краткая справка
|
||||
|
||||
### Элементы (ключ определяет тип)
|
||||
|
||||
| DSL ключ | XML элемент | Значение ключа |
|
||||
|--------------|-------------------|---------------------------------------------------|
|
||||
| `"group"` | UsualGroup | `"horizontal"` / `"vertical"` / `"alwaysHorizontal"` / `"alwaysVertical"` / `"collapsible"` |
|
||||
| `"input"` | InputField | имя элемента |
|
||||
| `"check"` | CheckBoxField | имя |
|
||||
| `"label"` | LabelDecoration | имя |
|
||||
| `"labelField"` | LabelField | имя |
|
||||
| `"table"` | Table | имя |
|
||||
| `"pages"` | Pages | имя |
|
||||
| `"page"` | Page | имя |
|
||||
| `"button"` | Button | имя |
|
||||
| `"picture"` | PictureDecoration | имя |
|
||||
| `"picField"` | PictureField | имя |
|
||||
| `"calendar"` | CalendarField | имя |
|
||||
| `"cmdBar"` | CommandBar | имя |
|
||||
| `"popup"` | Popup | имя |
|
||||
|
||||
### Общие свойства элементов
|
||||
|
||||
- `"name"` — переопределить имя (по умолчанию из значения ключа типа)
|
||||
- `"path"` — DataPath (привязка к данным)
|
||||
- `"title"` — заголовок
|
||||
- `"hidden": true` — Visible=false
|
||||
- `"disabled": true` — Enabled=false
|
||||
- `"readOnly": true` — ReadOnly=true
|
||||
- `"on": ["OnChange", "StartChoice"]` — события с автоименованием обработчиков
|
||||
|
||||
### Система типов (shorthand)
|
||||
|
||||
| DSL | XML |
|
||||
|------------------------|----------------------------------------|
|
||||
| `"string"` / `"string(100)"` | `xs:string` + StringQualifiers |
|
||||
| `"decimal(15,2)"` | `xs:decimal` + NumberQualifiers |
|
||||
| `"decimal(10,0,nonneg)"` | с AllowedSign=Nonnegative |
|
||||
| `"boolean"` | `xs:boolean` |
|
||||
| `"date"` / `"dateTime"` / `"time"` | `xs:dateTime` + DateFractions |
|
||||
| `"CatalogRef.Организации"` | `cfg:CatalogRef.Организации` |
|
||||
| `"DocumentObject.Реализация"` | `cfg:DocumentObject.Реализация` |
|
||||
| `"ValueTable"` | `v8:ValueTable` |
|
||||
| `"ValueList"` | `v8:ValueListType` |
|
||||
| `"Type1 \| Type2"` | составной тип |
|
||||
|
||||
### Пример JSON
|
||||
|
||||
```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 }
|
||||
],
|
||||
"commands": [
|
||||
{ "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Автогенерация
|
||||
|
||||
- **Companion-элементы**: ContextMenu, ExtendedTooltip и др. создаются автоматически с правильными именами и ID
|
||||
- **Обработчики событий**: `"on": ["OnChange"]` → `<Event name="OnChange">ОрганизацияПриИзменении</Event>`
|
||||
- **Namespace**: все 17 namespace-деклараций добавляются автоматически
|
||||
- **ID**: последовательная нумерация, AutoCommandBar всегда id="-1"
|
||||
|
||||
## Верификация
|
||||
|
||||
Используйте `/form-info` для проверки результата:
|
||||
|
||||
```
|
||||
/form-info <OutputPath>
|
||||
```
|
||||
|
||||
Структура в сводке должна совпадать с определением в JSON.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -21,7 +21,7 @@
|
||||
|--------|--------|----------|------|
|
||||
| Внешние обработки (EPF) | 10 навыков `/epf-*` | Создание, модификация, сборка обработок из XML-исходников | [Подробнее](docs/epf-guide.md) |
|
||||
| Табличный документ (MXL) | 4 навыка `/mxl-*` | Анализ, создание, компиляция макетов печатных форм | [Подробнее](docs/mxl-guide.md) |
|
||||
| Управляемые формы (Form) | `/form-info` | Анализ структуры управляемых форм из XML-исходников конфигурации | [Подробнее](docs/form-guide.md) |
|
||||
| Управляемые формы (Form) | 2 навыка `/form-*` | Анализ и генерация управляемых форм из XML-исходников | [Подробнее](docs/form-guide.md) |
|
||||
| Утилиты | `/img-grid` | Наложение сетки на изображение для определения пропорций колонок | — |
|
||||
|
||||
## Требования
|
||||
@@ -37,6 +37,7 @@
|
||||
- [Сборка и разборка EPF](docs/build-spec.md) — команды `1cv8.exe`, параметры, коды возврата
|
||||
- [Табличный документ (MXL)](docs/1c-spreadsheet-spec.md) — XML-формат SpreadsheetDocument, совместимость версий
|
||||
- [MXL DSL](docs/mxl-dsl-spec.md) — JSON-формат описания макета для `/mxl-compile` и `/mxl-decompile`
|
||||
- [Form DSL](docs/form-dsl-spec.md) — JSON-формат описания формы для `/form-compile`
|
||||
|
||||
## Структура репозитория
|
||||
|
||||
@@ -57,6 +58,7 @@
|
||||
├── mxl-compile/ # Компиляция макета из JSON
|
||||
├── mxl-decompile/ # Декомпиляция макета в JSON
|
||||
├── form-info/ # Анализ структуры управляемой формы
|
||||
├── form-compile/ # Компиляция формы из JSON
|
||||
└── img-grid/ # Сетка для анализа изображений
|
||||
docs/
|
||||
├── epf-guide.md # Гайд: внешние обработки
|
||||
@@ -67,5 +69,6 @@ docs/
|
||||
├── 1c-help-spec.md # Спецификация встроенной справки
|
||||
├── build-spec.md # Спецификация сборки/разборки
|
||||
├── 1c-spreadsheet-spec.md # Спецификация табличного документа
|
||||
└── mxl-dsl-spec.md # Спецификация MXL DSL
|
||||
├── mxl-dsl-spec.md # Спецификация MXL DSL
|
||||
└── form-dsl-spec.md # Спецификация Form DSL
|
||||
```
|
||||
|
||||
@@ -0,0 +1,462 @@
|
||||
# Form DSL Specification
|
||||
|
||||
Спецификация JSON-формата для `/form-compile` — компактного описания управляемых форм 1С:Предприятия 8.3.
|
||||
|
||||
---
|
||||
|
||||
## 1. Корневой объект
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Заголовок формы",
|
||||
"properties": { ... },
|
||||
"excludedCommands": [ ... ],
|
||||
"events": { ... },
|
||||
"elements": [ ... ],
|
||||
"attributes": [ ... ],
|
||||
"parameters": [ ... ],
|
||||
"commands": [ ... ]
|
||||
}
|
||||
```
|
||||
|
||||
| Поле | Тип | Описание |
|
||||
|------|-----|----------|
|
||||
| `title` | string | Заголовок формы (необязательный) |
|
||||
| `properties` | object | Свойства формы (необязательный) |
|
||||
| `excludedCommands` | string[] | Исключённые стандартные команды (необязательный) |
|
||||
| `events` | object | Обработчики событий формы (необязательный) |
|
||||
| `elements` | array | Дерево UI-элементов (необязательный) |
|
||||
| `attributes` | array | Реквизиты формы (необязательный) |
|
||||
| `parameters` | array | Параметры формы (необязательный) |
|
||||
| `commands` | array | Команды формы (необязательный) |
|
||||
|
||||
---
|
||||
|
||||
## 2. Properties — свойства формы
|
||||
|
||||
Объект со свойствами в camelCase. Компилятор преобразует в PascalCase для XML.
|
||||
|
||||
```json
|
||||
"properties": {
|
||||
"autoTitle": false,
|
||||
"windowOpeningMode": "LockOwnerWindow",
|
||||
"commandBarLocation": "Bottom"
|
||||
}
|
||||
```
|
||||
|
||||
### Поддерживаемые свойства
|
||||
|
||||
| DSL ключ | XML элемент | Значения |
|
||||
|----------|-------------|----------|
|
||||
| `autoTitle` | `<AutoTitle>` | `true` / `false` |
|
||||
| `windowOpeningMode` | `<WindowOpeningMode>` | `LockOwnerWindow`, `Modeless` |
|
||||
| `commandBarLocation` | `<CommandBarLocation>` | `Top`, `Bottom`, `None` |
|
||||
| `saveDataInSettings` | `<SaveDataInSettings>` | `UseList`, `Use`, `DontUse` |
|
||||
| `autoSaveDataInSettings` | `<AutoSaveDataInSettings>` | `Use`, `DontUse` |
|
||||
| `autoTime` | `<AutoTime>` | `CurrentOrLast`, `Current`, `Last` |
|
||||
| `usePostingMode` | `<UsePostingMode>` | `Auto`, `Postings`, `Movements` |
|
||||
| `repostOnWrite` | `<RepostOnWrite>` | `true` / `false` |
|
||||
| `autoURL` | `<AutoURL>` | `true` / `false` |
|
||||
| `autoFillCheck` | `<AutoFillCheck>` | `true` / `false` |
|
||||
| `customizable` | `<Customizable>` | `true` / `false` |
|
||||
| `enterKeyBehavior` | `<EnterKeyBehavior>` | `DefaultButton`, `NewLine` |
|
||||
| `verticalScroll` | `<VerticalScroll>` | `useIfNecessary`, `Auto`, `AlwaysShow`, `Never` |
|
||||
| `width` | `<Width>` | число |
|
||||
| `height` | `<Height>` | число |
|
||||
| `group` | `<Group>` | `Vertical`, `Horizontal`, `AlwaysHorizontal`, `AlwaysVertical` |
|
||||
| `useForFoldersAndItems` | `<UseForFoldersAndItems>` | `Folders`, `Items`, `FoldersAndItems` |
|
||||
|
||||
Нераспознанные ключи преобразуются с автоматическим PascalCase (первая буква в верхний регистр).
|
||||
|
||||
---
|
||||
|
||||
## 3. Events — обработчики событий формы
|
||||
|
||||
```json
|
||||
"events": {
|
||||
"OnCreateAtServer": "ПриСозданииНаСервере",
|
||||
"OnOpen": "ПриОткрытии"
|
||||
}
|
||||
```
|
||||
|
||||
Ключ — имя события, значение — имя процедуры-обработчика.
|
||||
|
||||
### Доступные события
|
||||
|
||||
| Событие | Описание |
|
||||
|---------|----------|
|
||||
| `OnCreateAtServer` | Создание формы на сервере |
|
||||
| `OnOpen` | Открытие формы |
|
||||
| `BeforeClose` | Перед закрытием |
|
||||
| `OnClose` | При закрытии |
|
||||
| `BeforeWrite` | Перед записью |
|
||||
| `BeforeWriteAtServer` | Перед записью на сервере |
|
||||
| `OnWriteAtServer` | При записи на сервере |
|
||||
| `AfterWriteAtServer` | После записи на сервере |
|
||||
| `AfterWrite` | После записи |
|
||||
| `OnReadAtServer` | При чтении объекта |
|
||||
| `NotificationProcessing` | Обработка оповещений |
|
||||
| `ChoiceProcessing` | Обработка выбора |
|
||||
| `FillCheckProcessingAtServer` | Проверка заполнения |
|
||||
|
||||
---
|
||||
|
||||
## 4. Elements — дерево UI-элементов
|
||||
|
||||
Массив объектов. Тип элемента определяется ключом-идентификатором.
|
||||
|
||||
### 4.1. Общие свойства всех элементов
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `name` | string | Имя элемента (по умолчанию — из значения ключа типа) |
|
||||
| `title` | string | Заголовок |
|
||||
| `hidden` | bool | `true` → `<Visible>false</Visible>` |
|
||||
| `disabled` | bool | `true` → `<Enabled>false</Enabled>` |
|
||||
| `readOnly` | bool | `true` → `<ReadOnly>true</ReadOnly>` |
|
||||
| `on` | string[] | Массив имён событий |
|
||||
| `handlers` | object | Явные имена обработчиков: `{"OnChange": "МойОбработчик"}` |
|
||||
|
||||
### 4.2. Автоименование обработчиков
|
||||
|
||||
При указании `"on"` без `"handlers"` имя обработчика генерируется автоматически:
|
||||
|
||||
```
|
||||
<ИмяЭлемента><РусскийСуффикс>
|
||||
```
|
||||
|
||||
| Событие | Суффикс |
|
||||
|---------|---------|
|
||||
| `OnChange` | `ПриИзменении` |
|
||||
| `StartChoice` | `НачалоВыбора` |
|
||||
| `ChoiceProcessing` | `ОбработкаВыбора` |
|
||||
| `AutoComplete` | `АвтоПодбор` |
|
||||
| `Clearing` | `Очистка` |
|
||||
| `Opening` | `Открытие` |
|
||||
| `Click` | `Нажатие` |
|
||||
| `OnActivateRow` | `ПриАктивизацииСтроки` |
|
||||
| `BeforeAddRow` | `ПередНачаломДобавления` |
|
||||
| `BeforeDeleteRow` | `ПередУдалением` |
|
||||
| `BeforeRowChange` | `ПередНачаломИзменения` |
|
||||
| `OnStartEdit` | `ПриНачалеРедактирования` |
|
||||
| `OnEndEdit` | `ПриОкончанииРедактирования` |
|
||||
| `Selection` | `ВыборСтроки` |
|
||||
| `OnCurrentPageChange` | `ПриСменеСтраницы` |
|
||||
| `TextEditEnd` | `ОкончаниеВводаТекста` |
|
||||
|
||||
Пример: элемент `Контрагент` + событие `OnChange` → обработчик `КонтрагентПриИзменении`.
|
||||
|
||||
### 4.3. Типы элементов
|
||||
|
||||
#### group — UsualGroup
|
||||
|
||||
```json
|
||||
{ "group": "horizontal", "name": "ГруппаШапка", "children": [ ... ] }
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `group` | string | Ориентация: `horizontal`, `vertical`, `alwaysHorizontal`, `alwaysVertical`, `collapsible` |
|
||||
| `children` | array | Вложенные элементы |
|
||||
| `showTitle` | bool | Показывать заголовок группы |
|
||||
| `representation` | string | `none`, `normal`, `weak`, `strong` |
|
||||
| `united` | bool | Объединение |
|
||||
|
||||
#### input — InputField
|
||||
|
||||
```json
|
||||
{ "input": "Организация", "path": "Объект.Организация", "on": ["OnChange"] }
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `path` | string | DataPath |
|
||||
| `multiLine` | bool | Многострочный режим |
|
||||
| `passwordMode` | bool | Режим пароля |
|
||||
| `titleLocation` | string | `none`, `left`, `right`, `top`, `bottom` |
|
||||
| `choiceButton` | bool | Показывать кнопку выбора |
|
||||
| `clearButton` | bool | Показывать кнопку очистки |
|
||||
| `spinButton` | bool | Показывать кнопку прокрутки |
|
||||
| `dropListButton` | bool | Показывать кнопку раскрытия |
|
||||
| `markIncomplete` | bool | Автопометка незаполненных |
|
||||
| `skipOnInput` | bool | Пропускать при вводе |
|
||||
| `inputHint` | string | Подсказка ввода (placeholder) |
|
||||
| `width` | int | Ширина |
|
||||
| `height` | int | Высота |
|
||||
| `horizontalStretch` | bool | Растягивание по горизонтали |
|
||||
| `verticalStretch` | bool | Растягивание по вертикали |
|
||||
| `autoMaxWidth` | bool | Автомаксимальная ширина |
|
||||
| `autoMaxHeight` | bool | Автомаксимальная высота |
|
||||
|
||||
#### check — CheckBoxField
|
||||
|
||||
```json
|
||||
{ "check": "ФлагАктивности", "path": "Активен", "on": ["OnChange"] }
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `path` | string | DataPath |
|
||||
| `titleLocation` | string | Расположение заголовка |
|
||||
|
||||
#### label — LabelDecoration
|
||||
|
||||
```json
|
||||
{ "label": "Подсказка", "title": "Выберите параметры", "hyperlink": true }
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `title` | string | Текст надписи |
|
||||
| `hyperlink` | bool | Режим гиперссылки |
|
||||
| `width` | int | Ширина |
|
||||
| `height` | int | Высота |
|
||||
| `autoMaxWidth` | bool | Автомаксимальная ширина |
|
||||
| `autoMaxHeight` | bool | Автомаксимальная высота |
|
||||
|
||||
#### labelField — LabelField
|
||||
|
||||
```json
|
||||
{ "labelField": "СтатусОбработки", "path": "Статус" }
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `path` | string | DataPath |
|
||||
| `hyperlink` | bool | Режим гиперссылки |
|
||||
|
||||
#### table — Table
|
||||
|
||||
```json
|
||||
{
|
||||
"table": "Товары", "path": "Объект.Товары",
|
||||
"columns": [
|
||||
{ "input": "Номенклатура", "path": "Объект.Товары.Номенклатура" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `path` | string | DataPath |
|
||||
| `columns` | array | Колонки (элементы input/check/labelField/picField) |
|
||||
| `representation` | string | `List`, `Tree`, `HierarchicalList` |
|
||||
| `changeRowSet` | bool | Разрешить добавление/удаление строк |
|
||||
| `changeRowOrder` | bool | Разрешить перемещение строк |
|
||||
| `height` | int | Высота в строках таблицы |
|
||||
| `header` | bool | Показывать шапку |
|
||||
| `footer` | bool | Показывать подвал |
|
||||
| `commandBarLocation` | string | `None`, `Top`, `Bottom`, `Auto` |
|
||||
| `searchStringLocation` | string | `None`, `Top`, `Bottom`, `CommandBar`, `Auto` |
|
||||
|
||||
#### pages / page — Pages / Page
|
||||
|
||||
```json
|
||||
{
|
||||
"pages": "Страницы", "children": [
|
||||
{ "page": "Основное", "children": [ ... ] },
|
||||
{ "page": "Дополнительно", "children": [ ... ] }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Page поддерживает `group` для задания ориентации содержимого и `children` для вложенных элементов.
|
||||
|
||||
Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `TabsOnBottom`, `TabsOnLeft`, `TabsOnRight`.
|
||||
|
||||
#### button — Button
|
||||
|
||||
```json
|
||||
{ "button": "Загрузить", "command": "Загрузить", "defaultButton": true }
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `command` | string | Имя команды формы (→ `Form.Command.<name>`) |
|
||||
| `stdCommand` | string | Стандартная команда (→ `Form.StandardCommand.<name>`) |
|
||||
| `type` | string | `usual`, `hyperlink`, `commandBar` |
|
||||
| `defaultButton` | bool | Кнопка по умолчанию |
|
||||
| `picture` | string | Ссылка на картинку (`StdPicture.Name`) |
|
||||
| `representation` | string | `Auto`, `Picture`, `Text`, `PictureAndText` |
|
||||
| `locationInCommandBar` | string | `InCommandBar`, `InAdditionalSubmenu` |
|
||||
|
||||
#### picture — PictureDecoration
|
||||
|
||||
```json
|
||||
{ "picture": "Логотип", "src": "CommonPicture.Логотип" }
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `src` или `picture` (как свойство) | string | Ссылка на картинку |
|
||||
| `hyperlink` | bool | Режим гиперссылки |
|
||||
| `width` | int | Ширина |
|
||||
| `height` | int | Высота |
|
||||
|
||||
#### picField — PictureField
|
||||
|
||||
```json
|
||||
{ "picField": "Фото", "path": "Фотография" }
|
||||
```
|
||||
|
||||
#### calendar — CalendarField
|
||||
|
||||
```json
|
||||
{ "calendar": "Дата", "path": "ДатаОтчета" }
|
||||
```
|
||||
|
||||
#### cmdBar — CommandBar
|
||||
|
||||
```json
|
||||
{ "cmdBar": "КоманднаяПанель", "children": [ ... ] }
|
||||
```
|
||||
|
||||
#### popup — Popup
|
||||
|
||||
```json
|
||||
{ "popup": "Печать", "picture": "StdPicture.Print", "children": [ ... ] }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Attributes — реквизиты формы
|
||||
|
||||
```json
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "DocumentObject.Реализация", "main": true },
|
||||
{ "name": "Итого", "type": "decimal(15,2)" },
|
||||
{ "name": "Таблица", "type": "ValueTable", "columns": [
|
||||
{ "name": "Номенклатура", "type": "CatalogRef.Номенклатура" },
|
||||
{ "name": "Количество", "type": "decimal(10,3)" }
|
||||
]}
|
||||
]
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `name` | string | Имя реквизита (обязательно) |
|
||||
| `type` | string | Тип (shorthand) |
|
||||
| `main` | bool | Основной реквизит формы |
|
||||
| `title` | string | Заголовок |
|
||||
| `savedData` | bool | Сохраняемые данные |
|
||||
| `fillChecking` | string | `Show`, `DontShow` |
|
||||
| `columns` | array | Колонки для ValueTable/ValueTree |
|
||||
|
||||
---
|
||||
|
||||
## 6. Parameters — параметры формы
|
||||
|
||||
```json
|
||||
"parameters": [
|
||||
{ "name": "Ключ", "type": "DocumentRef.Реализация", "key": true },
|
||||
{ "name": "Основание", "type": "DocumentRef.Реализация" }
|
||||
]
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `name` | string | Имя параметра (обязательно) |
|
||||
| `type` | string | Тип (shorthand) |
|
||||
| `key` | bool | Ключевой параметр |
|
||||
|
||||
---
|
||||
|
||||
## 7. Commands — команды формы
|
||||
|
||||
```json
|
||||
"commands": [
|
||||
{ "name": "Печать", "action": "ПечатьОбработка", "shortcut": "Ctrl+P" },
|
||||
{ "name": "Обновить", "action": "ОбновитьОбработка", "picture": "StdPicture.Refresh" }
|
||||
]
|
||||
```
|
||||
|
||||
| Свойство | Тип | Описание |
|
||||
|----------|-----|----------|
|
||||
| `name` | string | Имя команды (обязательно) |
|
||||
| `action` | string | Имя процедуры-обработчика |
|
||||
| `title` | string | Заголовок |
|
||||
| `shortcut` | string | Клавиатурное сочетание |
|
||||
| `picture` | string | Ссылка на картинку |
|
||||
| `representation` | string | `Auto`, `Picture`, `Text`, `PictureAndText` |
|
||||
|
||||
---
|
||||
|
||||
## 8. Система типов (shorthand)
|
||||
|
||||
### Примитивные типы
|
||||
|
||||
| DSL | XML |
|
||||
|-----|-----|
|
||||
| `"string"` | `xs:string` (неограниченная) |
|
||||
| `"string(100)"` | `xs:string` + Length=100 |
|
||||
| `"decimal(15,2)"` | `xs:decimal` + Digits=15, FractionDigits=2, AllowedSign=Any |
|
||||
| `"decimal(10,0,nonneg)"` | `xs:decimal` + AllowedSign=Nonnegative |
|
||||
| `"boolean"` | `xs:boolean` |
|
||||
| `"date"` | `xs:dateTime` + DateFractions=Date |
|
||||
| `"dateTime"` | `xs:dateTime` + DateFractions=DateTime |
|
||||
| `"time"` | `xs:dateTime` + DateFractions=Time |
|
||||
|
||||
### Ссылочные типы
|
||||
|
||||
| DSL | XML |
|
||||
|-----|-----|
|
||||
| `"CatalogRef.Организации"` | `cfg:CatalogRef.Организации` |
|
||||
| `"DocumentObject.Реализация"` | `cfg:DocumentObject.Реализация` |
|
||||
| `"EnumRef.СтавкиНДС"` | `cfg:EnumRef.СтавкиНДС` |
|
||||
| `"DataProcessorObject.ЗагрузкаДанных"` | `cfg:DataProcessorObject.ЗагрузкаДанных` |
|
||||
|
||||
### Платформенные типы
|
||||
|
||||
| DSL | XML |
|
||||
|-----|-----|
|
||||
| `"ValueTable"` | `v8:ValueTable` |
|
||||
| `"ValueTree"` | `v8:ValueTree` |
|
||||
| `"ValueList"` | `v8:ValueListType` |
|
||||
| `"FormattedString"` | `v8ui:FormattedString` |
|
||||
| `"Picture"` | `v8ui:Picture` |
|
||||
| `"DynamicList"` | `cfg:DynamicList` |
|
||||
|
||||
### Составные типы
|
||||
|
||||
Разделитель `" | "`:
|
||||
|
||||
```json
|
||||
"type": "CatalogRef.Организации | CatalogRef.ИндивидуальныеПредприниматели"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Автогенерация
|
||||
|
||||
### Companion-элементы
|
||||
|
||||
Для каждого элемента автоматически создаются служебные вложенные элементы:
|
||||
|
||||
| Тип элемента | Companions |
|
||||
|---|---|
|
||||
| UsualGroup | ExtendedTooltip |
|
||||
| InputField | ContextMenu, ExtendedTooltip |
|
||||
| CheckBoxField | ContextMenu, ExtendedTooltip |
|
||||
| LabelDecoration | ContextMenu, ExtendedTooltip |
|
||||
| LabelField | ContextMenu, ExtendedTooltip |
|
||||
| PictureDecoration | ContextMenu, ExtendedTooltip |
|
||||
| PictureField | ContextMenu, ExtendedTooltip |
|
||||
| CalendarField | ContextMenu, ExtendedTooltip |
|
||||
| Table | ContextMenu, AutoCommandBar, SearchStringAddition, ViewStatusAddition, SearchControlAddition |
|
||||
| Pages | ExtendedTooltip |
|
||||
| Page | ExtendedTooltip |
|
||||
| Button | ExtendedTooltip |
|
||||
|
||||
Именование: `<name>КонтекстноеМеню`, `<name>РасширеннаяПодсказка`, `<name>КоманднаяПанель`, `<name>СтрокаПоиска`, `<name>СостояниеПросмотра`, `<name>УправлениеПоиском`.
|
||||
|
||||
### ID
|
||||
|
||||
Последовательная нумерация начиная с 1. `AutoCommandBar` формы всегда имеет `id="-1"`.
|
||||
|
||||
### Namespace
|
||||
|
||||
Все 17 namespace-деклараций добавляются автоматически (version="2.17").
|
||||
|
||||
### Кодировка
|
||||
|
||||
UTF-8 с BOM (как в файлах конфигурации 1С).
|
||||
+52
-5
@@ -1,12 +1,13 @@
|
||||
# Управляемые формы (Form)
|
||||
|
||||
Навыки группы `/form-*` позволяют анализировать управляемые формы 1С:Предприятия 8.3 из XML-исходников конфигурации, не читая тысячи строк XML.
|
||||
Навыки группы `/form-*` позволяют анализировать и генерировать управляемые формы 1С:Предприятия 8.3 из XML-исходников, не читая тысячи строк XML.
|
||||
|
||||
## Навыки
|
||||
|
||||
| Навык | Параметры | Описание |
|
||||
|-------|-----------|----------|
|
||||
| `/form-info` | `<FormPath>` | Компактная сводка: дерево элементов, реквизиты, команды, события |
|
||||
| `/form-compile` | `<JsonPath> <OutputPath>` | Генерация Form.xml из компактного JSON-определения |
|
||||
|
||||
## Сценарии использования
|
||||
|
||||
@@ -120,22 +121,68 @@ Claude сделает grep по Form.xml и найдёт полный XML-бло
|
||||
- `Таблица: ValueTable [Кол1: тип, Кол2: тип]` — таблица значений с колонками
|
||||
- `Список: DynamicList -> Catalog.Пользователи` — динамический список с основной таблицей
|
||||
|
||||
## Генерация формы с нуля
|
||||
|
||||
`/form-compile` принимает компактное JSON-определение (20–50 строк) и генерирует полный Form.xml (100–500+ строк) с namespace-декларациями, companion-элементами и последовательными ID.
|
||||
|
||||
```
|
||||
> Создай форму загрузки данных с полями Организация, Контрагент, таблицей Товары и кнопкой Загрузить
|
||||
```
|
||||
|
||||
Claude создаст JSON-определение и вызовет `/form-compile`. Пример JSON:
|
||||
|
||||
```json
|
||||
{
|
||||
"properties": { "autoTitle": false },
|
||||
"events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
|
||||
"elements": [
|
||||
{ "group": "horizontal", "name": "Шапка", "children": [
|
||||
{ "input": "Организация", "path": "Объект.Организация", "on": ["OnChange"] },
|
||||
{ "input": "Контрагент", "path": "Объект.Контрагент" }
|
||||
]},
|
||||
{ "table": "Товары", "path": "Объект.Товары", "columns": [
|
||||
{ "input": "Номенклатура", "path": "Объект.Товары.Номенклатура" },
|
||||
{ "input": "Сумма", "path": "Объект.Товары.Сумма", "readOnly": true }
|
||||
]},
|
||||
{ "button": "Загрузить", "command": "Загрузить" }
|
||||
],
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "DataProcessorObject.ЗагрузкаДанных", "main": true }
|
||||
],
|
||||
"commands": [
|
||||
{ "name": "Загрузить", "action": "ЗагрузитьОбработка" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Верификация результата
|
||||
|
||||
После компиляции используйте `/form-info` для проверки:
|
||||
|
||||
```
|
||||
> /form-info src/МояОбработка/Forms/Форма/Ext/Form.xml
|
||||
```
|
||||
|
||||
Структура в сводке должна совпадать с определением в JSON.
|
||||
|
||||
## Примеры слеш-команд
|
||||
|
||||
```
|
||||
> /form-info upload/acc_8.3.24/Documents/РеализацияТоваровУслуг/Forms/ФормаДокумента/Ext/Form.xml
|
||||
> /form-info src/МояОбработка/Forms/Форма/Ext/Form.xml
|
||||
> /form-compile src/form.json src/МояОбработка/Forms/Форма/Ext/Form.xml
|
||||
```
|
||||
|
||||
## Связь с EPF-навыками
|
||||
|
||||
`/form-info` работает с формами из любых источников — конфигурации и внешних обработок. При работе с обработками:
|
||||
`/form-info` и `/form-compile` работают с формами из любых источников — конфигурации и внешних обработок. При работе с обработками:
|
||||
|
||||
1. `/epf-add-form` — создать форму
|
||||
2. `/form-info` — проанализировать существующую форму
|
||||
3. Модифицировать Form.xml, ориентируясь на сводку
|
||||
1. `/epf-add-form` — создать форму (каркас)
|
||||
2. `/form-compile` — сгенерировать Form.xml из JSON-определения
|
||||
3. `/form-info` — проверить результат
|
||||
4. `/epf-build` — собрать EPF
|
||||
|
||||
## Спецификации
|
||||
|
||||
- [Управляемая форма](1c-form-spec.md) — Form.xml, элементы, команды, реквизиты, система типов
|
||||
- [Form DSL](form-dsl-spec.md) — JSON-формат описания формы для `/form-compile`
|
||||
|
||||
Reference in New Issue
Block a user