mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-10 16:14:54 +03:00
bdc38caffa
form-add теперь покрывает и объекты конфигурации, и standalone EPF/ERF source tree (тип определяется из корневого XML, маппинг типов уже был). Изменения form-add scaffold: - Module.bsl: пустые регионы вместо скелета процедуры ПриСозданииНаСервере - Form.xml: убран <Events> (раньше привязывал OnCreateAtServer к процедуре) - Form.xml: <SavedData>true</SavedData> теперь условный — ставится для Catalog/Document/etc (стандарт ERP, 99% форм), не ставится для DataProcessor/Report/External* (где у объекта нет состояния) Это согласуется с workflow: form-compile перегенерирует Form.xml целиком, поэтому привязки в scaffold могут стать orphan; пустые регионы + без Events — корректная стартовая точка, которую form-edit/form-compile наполняют атомарно. Удалён навык epf-add-form (директория + тесты), вызовы заменены на form-add в integration-тестах, в кейсах epf-validate/help-add, в description epf-init/epf-bsp-init, в docs и README. Перегенерированы snapshot'ы 5 навыков (form-add, form-compile, form-edit, form-info, form-validate). Платформенная верификация в 1С 8.3.24 прошла для всех 9 кейсов form-add. Bump form-add v1.3 → v1.4.
267 lines
15 KiB
Markdown
267 lines
15 KiB
Markdown
# Управляемые формы (Form)
|
||
|
||
Навыки группы `/form-*` позволяют анализировать, генерировать и валидировать управляемые формы 1С:Предприятия 8.3 из XML-исходников, не читая тысячи строк XML.
|
||
|
||
## Навыки
|
||
|
||
| Навык | Параметры | Описание |
|
||
|-------|-----------|----------|
|
||
| `/form-add` | `<ObjectPath> <FormName> [Purpose]` | Добавление формы к объекту конфигурации (Document, Catalog и др.) |
|
||
| `/form-info` | `<FormPath>` | Компактная сводка: дерево элементов, реквизиты, команды, события |
|
||
| `/form-compile` | `<JsonPath> <OutputPath>` | Генерация Form.xml из компактного JSON-определения |
|
||
| `/form-validate` | `<FormPath>` | Валидация: уникальность ID, companions, DataPath, команды |
|
||
| `/form-edit` | `<FormPath> <JsonPath>` | Добавление элементов, реквизитов, команд в существующую форму |
|
||
| `/form-patterns` | (без параметров) | Справочник паттернов: архетипы, конвенции именования, продвинутые приёмы |
|
||
|
||
## Сценарии использования
|
||
|
||
### Добавление новой формы к объекту конфигурации
|
||
|
||
`/form-add` создаёт каркас управляемой формы (metadata XML + Form.xml + Module.bsl) и регистрирует её в объекте конфигурации. Поддерживает Document, Catalog, DataProcessor, Report, InformationRegister и другие типы.
|
||
|
||
```
|
||
> Добавь форму документа к Documents/АвансовыйОтчет.xml
|
||
```
|
||
|
||
Claude вызовет `/form-add` с нужными параметрами. Назначение формы (Purpose) определяет структуру: Object — форма объекта с реквизитом «Объект», List/Choice — форма списка с DynamicList, Record — форма записи регистра.
|
||
|
||
Типичный workflow:
|
||
|
||
1. `/form-add` — создать каркас (metadata + Form.xml + Module.bsl)
|
||
2. `/form-compile` или `/form-edit` — наполнить Form.xml элементами
|
||
3. `/form-validate` — проверить корректность
|
||
4. `/form-info` — проанализировать результат
|
||
|
||
### Анализ формы перед модификацией
|
||
|
||
Файлы Form.xml содержат от сотен до десятков тысяч строк XML. 80% объёма — визуальный шум (цвета, шрифты, размеры, автогенерированные подсказки). `/form-info` извлекает суть.
|
||
|
||
```
|
||
> Покажи структуру формы документа РеализацияТоваровУслуг
|
||
```
|
||
|
||
Claude найдёт Form.xml и вызовет `/form-info`. Результат — компактная сводка (40–100 строк вместо тысяч):
|
||
|
||
```
|
||
=== Form: ФормаДокумента — "Реализация товаров и услуг" (Documents.РеализацияТоваровУслуг) ===
|
||
|
||
Properties: AutoTitle=false, CommandBarLocation=None
|
||
|
||
Events:
|
||
OnCreateAtServer -> ПриСозданииНаСервере
|
||
OnOpen -> ПриОткрытии
|
||
|
||
Elements:
|
||
├─ [Group:AH] ГруппаШапка
|
||
│ ├─ [Input] Организация -> Объект.Организация {OnChange}
|
||
│ └─ [Input] Контрагент -> Объект.Контрагент {OnChange, StartChoice}
|
||
├─ [Table] Товары -> Объект.Товары
|
||
│ ├─ [Input] Номенклатура -> Объект.Товары.Номенклатура {OnChange}
|
||
│ └─ [Input] Сумма -> Объект.Товары.Сумма [ro]
|
||
└─ [Pages] Страницы
|
||
├─ [Page] Основное (5 items)
|
||
└─ [Page] Печать (2 items)
|
||
|
||
Attributes:
|
||
*Объект: DocumentObject.РеализацияТоваровУслуг (main)
|
||
Валюта: CatalogRef.Валюты
|
||
...
|
||
|
||
Commands:
|
||
Печать -> ПечатьДокумента [Ctrl+P]
|
||
```
|
||
|
||
### Добавление элементов в существующую форму
|
||
|
||
`/form-edit` добавляет элементы, реквизиты и команды в существующий Form.xml. Автоматически назначает ID, генерирует companion-элементы и обработчики событий.
|
||
|
||
```
|
||
> Добавь поле "Склад" в шапку формы после "Контрагент"
|
||
```
|
||
|
||
Claude вызовет `/form-info` для анализа структуры, создаст JSON и вызовет `/form-edit`:
|
||
|
||
```json
|
||
{
|
||
"into": "ГруппаШапка",
|
||
"after": "Контрагент",
|
||
"elements": [
|
||
{ "input": "Склад", "path": "Объект.Склад", "on": ["OnChange"] }
|
||
],
|
||
"attributes": [
|
||
{ "name": "Склад", "type": "CatalogRef.Склады" }
|
||
]
|
||
}
|
||
```
|
||
|
||
Позиционирование: `into` указывает группу-контейнер, `after` — элемент, после которого вставлять. Оба опциональны (по умолчанию — в конец корневого ChildItems).
|
||
|
||
Один вызов может содержать элементы, реквизиты и команды одновременно. Группы поддерживают `children` для вложенных элементов.
|
||
|
||
### Поиск обработчиков и привязок
|
||
|
||
Из сводки видно, какие события подключены к каким элементам:
|
||
|
||
```
|
||
> Какие обработчики срабатывают при изменении контрагента?
|
||
```
|
||
|
||
Claude вызовет `/form-info` и найдёт: `[Input] Контрагент -> Объект.Контрагент {OnChange, StartChoice}` — далее откроет модуль формы и найдёт процедуры по именам событий.
|
||
|
||
### Точечное погружение в детали
|
||
|
||
Сводка — это карта. Для деталей по конкретному элементу достаточно grep по имени из сводки:
|
||
|
||
```
|
||
> Покажи все свойства элемента ДоговорКонтрагента
|
||
```
|
||
|
||
Claude сделает grep по Form.xml и найдёт полный XML-блок с ChoiceParameters, ChoiceFoldersAndItems, стилями и прочими свойствами.
|
||
|
||
## Чтение вывода
|
||
|
||
### Дерево элементов
|
||
|
||
| Обозначение | Элемент |
|
||
|---|---|
|
||
| `[Group:V]` `[Group:H]` `[Group:AH]` `[Group:AV]` | Группа (Vertical / Horizontal / AlwaysHorizontal / AlwaysVertical) |
|
||
| `[Input]` | Поле ввода |
|
||
| `[Check]` | Флажок |
|
||
| `[Label]` | Декоративная надпись |
|
||
| `[LabelField]` | Поле надписи (привязанное к данным) |
|
||
| `[Table]` | Таблица |
|
||
| `[Pages]` / `[Page]` | Вкладки (страницы показывают количество элементов) |
|
||
| `[Button]` | Кнопка |
|
||
| `[CmdBar]` | Командная панель |
|
||
| `[Popup]` | Выпадающее меню |
|
||
| `[Picture]` | Декоративная картинка |
|
||
| `[PicField]` | Поле картинки |
|
||
| `[Calendar]` | Календарь |
|
||
|
||
### Флаги
|
||
|
||
Показываются только при отклонении от умолчания:
|
||
- `[visible:false]` — элемент скрыт (Visible=false)
|
||
- `[enabled:false]` — элемент недоступен (Enabled=false)
|
||
- `[ro]` — только чтение (ReadOnly=true)
|
||
- `,collapse` — сворачиваемая группа (Behavior=Collapsible)
|
||
|
||
### Привязки и события
|
||
|
||
- `-> Объект.Поле` — DataPath (привязка к данным)
|
||
- `-> Имя [cmd]` — привязка к команде формы
|
||
- `-> Close [std]` — привязка к стандартной команде
|
||
- `{OnChange, StartChoice}` — имена подключённых событий
|
||
- `[title:Текст]` — заголовок, если отличается от имени элемента
|
||
|
||
### Реквизиты
|
||
|
||
- `*Объект: DocumentObject.Реализация (main)` — основной реквизит формы
|
||
- `Таблица: 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-validate` и `/form-info` для проверки:
|
||
|
||
```
|
||
> /form-validate src/МояОбработка/Forms/Форма/Ext/Form.xml
|
||
> /form-info src/МояОбработка/Forms/Форма/Ext/Form.xml
|
||
```
|
||
|
||
`/form-validate` проверит структурную корректность (ID, companions, ссылки), `/form-info` покажет результат в виде компактной сводки.
|
||
|
||
## Генерация из метаданных объекта
|
||
|
||
`/form-compile` умеет автоматически генерировать форму из метаданных объекта (XML-выгрузки). Скрипт читает реквизиты, табличные части, стандартные реквизиты и строит форму по стандарту ERP.
|
||
|
||
```
|
||
> Создай форму документа ЗаказКлиенту
|
||
```
|
||
|
||
Claude вызовет `/form-compile` с флагом `-FromObject`. Назначение формы (Purpose) автоматически определяется из имени формы (ФормаДокумента -> Item, ФормаСписка -> List, ФормаВыбора -> Choice).
|
||
|
||
Поддерживаемые типы: Document, Catalog, InformationRegister, AccumulationRegister, ChartOfCharacteristicTypes, ExchangePlan, ChartOfAccounts.
|
||
|
||
Не поддерживается: DataProcessor (реквизиты объекта пустые -- форма строится на реквизитах формы, используйте JSON DSL).
|
||
|
||
### Project-level пресеты
|
||
|
||
Раскладка формы управляется пресетом (по умолчанию `erp-standard`). Для настройки под проект создайте файл:
|
||
|
||
```
|
||
<project-root>/presets/skills/form/erp-standard.json
|
||
```
|
||
|
||
Файл накладывается поверх встроенного пресета через deep merge -- достаточно указать только переопределяемые ключи. Полная документация ключей: `.claude/skills/form-compile/presets/README.md`.
|
||
|
||
## Примеры слеш-команд
|
||
|
||
```
|
||
> /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
|
||
> /form-edit src/МояОбработка/Forms/Форма/Ext/Form.xml src/additions.json
|
||
> /form-validate src/МояОбработка/Forms/Форма/Ext/Form.xml
|
||
```
|
||
|
||
## Связь с EPF-навыками
|
||
|
||
Навыки `/form-*` работают с формами из любых источников — конфигурации и внешних обработок.
|
||
|
||
При работе с объектами конфигурации:
|
||
|
||
1. `/form-add` — создать форму (каркас + регистрация в объекте)
|
||
2. `/form-compile` или `/form-edit` — наполнить Form.xml элементами
|
||
3. `/form-validate` — проверить корректность
|
||
4. `/form-info` — проанализировать результат
|
||
|
||
При работе с внешними обработками:
|
||
|
||
1. `/form-add` — создать форму (каркас)
|
||
2. `/form-compile` — сгенерировать Form.xml из JSON-определения
|
||
3. `/form-edit` — добавить элементы/реквизиты/команды в существующую форму
|
||
4. `/form-validate` — проверить корректность
|
||
5. `/form-info` — проанализировать результат
|
||
6. `/epf-build` — собрать EPF
|
||
|
||
## Спецификации
|
||
|
||
- [Управляемая форма](1c-form-spec.md) — Form.xml, элементы, команды, реквизиты, система типов
|
||
- [Form DSL](form-dsl-spec.md) — JSON-формат описания формы для `/form-compile` и `/form-edit`
|
||
- [Паттерны компоновки](form-patterns.md) — типовые архетипы форм, конвенции именования, примеры DSL
|