# Управляемые формы (Form) Навыки группы `/form-*` позволяют анализировать, генерировать и валидировать управляемые формы 1С:Предприятия 8.3 из XML-исходников, не читая тысячи строк XML. ## Навыки | Навык | Параметры | Описание | |-------|-----------|----------| | `/form-add` | ` [Purpose]` | Добавление формы к объекту конфигурации (Document, Catalog и др.) | | `/form-info` | `` | Компактная сводка: дерево элементов, реквизиты, команды, события | | `/form-compile` | ` ` | Генерация Form.xml из компактного JSON-определения | | `/form-validate` | `` | Валидация: уникальность ID, companions, DataPath, команды | | `/form-edit` | ` ` | Добавление элементов, реквизитов, команд в существующую форму | | `/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`). Для настройки под проект создайте файл: ``` /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