From ecfb473827d55f58b75f83b4a2594c4f142add9f Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 9 Feb 2026 18:50:52 +0300 Subject: [PATCH] Add /form-patterns skill for loading layout guide into context Self-contained SKILL.md with all patterns inlined (no external file dependencies). Archetypes, naming conventions, ERP patterns, DSL examples. Co-Authored-By: Claude Opus 4.6 --- .claude/skills/form-compile/SKILL.md | 2 +- .claude/skills/form-patterns/SKILL.md | 253 ++++++++++++++++++++++++++ docs/form-guide.md | 1 + 3 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 .claude/skills/form-patterns/SKILL.md diff --git a/.claude/skills/form-compile/SKILL.md b/.claude/skills/form-compile/SKILL.md index d8ecfa9b..f443a40d 100644 --- a/.claude/skills/form-compile/SKILL.md +++ b/.claude/skills/form-compile/SKILL.md @@ -13,7 +13,7 @@ allowed-tools: Принимает компактное JSON-определение формы (20–50 строк) и генерирует полный корректный Form.xml (100–500+ строк) с namespace-декларациями, автогенерированными companion-элементами, последовательными ID. -> При проектировании формы с нуля — см. [паттерны компоновки](../../docs/form-patterns.md): типовые архетипы (документ, обработка, список, справочник, мастер), конвенции именования, примеры DSL. +> **При проектировании формы с нуля (5+ элементов или нечёткие требования)** — вызовите `/form-patterns` для загрузки справочника: архетипы, конвенции именования, продвинутые паттерны. Для простых форм (1–3 поля, пользователь описал что нужно) — не нужно. ## Использование diff --git a/.claude/skills/form-patterns/SKILL.md b/.claude/skills/form-patterns/SKILL.md new file mode 100644 index 00000000..41583e72 --- /dev/null +++ b/.claude/skills/form-patterns/SKILL.md @@ -0,0 +1,253 @@ +--- +name: form-patterns +description: Справочник паттернов компоновки управляемых форм 1С — архетипы, конвенции именования, продвинутые приёмы +argument-hint: (no arguments) +allowed-tools: [] +--- + +# /form-patterns — паттерны компоновки форм + +Справочник типовых паттернов дизайна управляемых форм 1С. Вызывай **перед** проектированием формы через `/form-compile`, когда требования пользователя не детализируют расположение элементов. + +**Как использовать:** выбери подходящий архетип, применяй конвенции именования, при необходимости используй продвинутые паттерны. + +--- + +## Архетипы форм + +### Форма документа + +``` +Шапка (horizontal, 2 колонки) +├─ Левая (vertical): НомерДата (H: Номер + Дата "от"), Контрагент, Договор +├─ Правая (vertical): Организация, Подразделение, ЦеныИВалюта (надпись-ссылка) +Страницы (pages) +├─ Товары: таблица Объект.Товары +├─ Услуги: таблица Объект.Услуги (опционально) +└─ Дополнительно: прочие реквизиты +Подвал (vertical) +├─ Итоги (horizontal): Всего, НДС, Скидка +└─ КомментарийОтветственный (horizontal): Комментарий + Ответственный +``` + +**События:** OnCreateAtServer, OnReadAtServer, OnOpen, BeforeWriteAtServer, AfterWriteAtServer, AfterWrite, NotificationProcessing +**Свойства:** autoTitle=false + +### Форма обработки (DataProcessor) + +``` +Параметры (vertical) +├─ Группа полей ввода (Организация, Период, режимы работы) +├─ Информационные надписи (label, hyperlink) +Рабочая область +├─ Таблица данных или Pages с вкладками +Кнопки действий +├─ Выполнить / Применить (defaultButton) +├─ Закрыть (stdCommand: Close) +``` + +**События:** OnCreateAtServer, OnOpen, NotificationProcessing +**Свойства:** windowOpeningMode=LockOwnerWindow (если диалог), autoTitle=false + +### Форма списка + +``` +Отборы (group: alwaysHorizontal) +├─ ГруппаОтбор[Поле] (H): Флажок + Поле ввода (для каждого фильтра) +Список (table, DynamicList) +├─ Колонки: labelField (не input — данные только для чтения) +``` + +**События:** OnCreateAtServer, OnOpen, NotificationProcessing, OnLoadDataFromSettingsAtServer +**Свойства:** autoSaveDataInSettings=Use +**Фильтры:** пара реквизитов на каждый — `Отбор[Поле]` (значение) + `Отбор[Поле]Использование` (boolean) + +### Форма элемента справочника + +**Простая:** +``` +ГруппаРеквизитов (horizontal) +├─ Наименование -> Объект.Description +└─ Код -> Объект.Code (если нужен) +``` + +**Сложная:** +``` +Главное (vertical) +├─ Наименование -> Объект.Description +├─ Параметры (horizontal, 2 колонки) +│ ├─ Левая: основные реквизиты +│ └─ Правая: дополнительные реквизиты +└─ КонтактныеДанные / Дополнительно (vertical) +``` + +**События:** OnCreateAtServer, OnReadAtServer, BeforeWriteAtServer, NotificationProcessing + +### Мастер (Wizard) + +``` +Страницы (pages, OnCurrentPageChange) +├─ Шаг1: описание + параметры +├─ Шаг2: основная работа +└─ Шаг3: результат +Кнопки (horizontal) +├─ Назад (command), Далее (command, defaultButton), Выполнить (command) +└─ Закрыть (stdCommand: Close) +``` + +**Свойства:** windowOpeningMode=LockOwnerWindow, commandBarLocation=None + +--- + +## Конвенции именования + +### Группы + +| Назначение | Имя | Тип | +|-----------|-----|-----| +| Шапка | `ГруппаШапка` | horizontal | +| Левая колонка | `ГруппаШапкаЛевая` | vertical | +| Правая колонка | `ГруппаШапкаПравая` | vertical | +| Номер+Дата | `ГруппаНомерДата` | horizontal | +| Подвал | `ГруппаПодвал` | vertical | +| Итоги | `ГруппаИтоги` | horizontal | +| Кнопки | `ГруппаКнопок` | horizontal | +| Страницы | `ГруппаСтраницы` / `Страницы` | pages | +| Предупреждение | `ГруппаПредупреждение` | horizontal, visible:false | +| Доп. секция | `ГруппаДополнительно` / `ГруппаПрочее` | vertical, collapse | + +### Элементы + +| Назначение | Имя | +|-----------|-----| +| Поле в таблице | `[Таблица][Поле]` | +| Итог | `Итоги[Поле]` | +| Надпись-ссылка | `[Поле]Надпись` | +| Фильтр | `Отбор[Поле]` | +| Флажок фильтра | `Отбор[Поле]Использование` | +| Кнопка команды | `[Команда]Кнопка` | +| Баннер-картинка | `[Баннер]Картинка` | +| Баннер-надпись | `[Баннер]Надпись` | +| Подменю | `Подменю[Действие]` | + +### Обработчики событий + +Имя = имя элемента + суффикс на русском: + +| Событие | Суффикс | Пример | +|---------|---------|--------| +| OnChange | ПриИзменении | `ОрганизацияПриИзменении` | +| StartChoice | НачалоВыбора | `КонтрагентНачалоВыбора` | +| Click | Нажатие | `ЦеныИВалютаНажатие` | +| OnEditEnd | ПриОкончанииРедактирования | `ТоварыПриОкончанииРедактирования` | +| OnStartEdit | ПриНачалеРедактирования | `ТоварыПриНачалеРедактирования` | + +Обработчики формы: `ПриСозданииНаСервере`, `ПриОткрытии`, `ПередЗакрытием`, `ОбработкаОповещения`. + +--- + +## Принципы компоновки + +1. **Порядок чтения.** Сверху вниз, слева направо. Самое важное — вверху. +2. **Двухколоночная шапка.** Основные реквизиты слева (контрагент, склад), организационные справа (организация, подразделение). +3. **Кнопки действий внизу.** Главная кнопка — `defaultButton: true`. Закрыть — всегда последняя. +4. **Таблицы — основная область.** Табличные части занимают большую часть формы, обычно на Pages. +5. **Итоги рядом с таблицей.** В подвале, горизонтальная группа, все поля readOnly. +6. **Фильтры — отдельная зона.** Над списком, alwaysHorizontal, пара «флажок + поле» на каждый фильтр. +7. **Скрытые элементы для состояний.** Баннеры, предупреждения — `visible: false`, показываются программно. +8. **Надписи-ссылки для диалогов.** `labelField` с `hyperlink: true` и событием Click. + +--- + +## Продвинутые паттерны (ERP) + +### Сворачиваемые группы + +Для необязательных секций (подписи, дополнительно, прочее): + +```json +{ "group": "vertical", "name": "ГруппаПодписи", "title": "Подписи", + "behavior": "Collapsible", "collapsed": true, "children": [...] } +``` + +### Баннер-предупреждение + +Группа «картинка + надпись», скрыта по умолчанию, показывается программно: + +```json +{ "group": "horizontal", "name": "ГруппаПредупреждение", "showTitle": false, + "visible": false, "children": [ + { "picture": "ПредупреждениеКартинка" }, + { "label": "ПредупреждениеНадпись", "title": "Текст", "maxWidth": 76, "autoMaxWidth": false } +]} +``` + +### Popup-меню в командной панели + +Группировка связанных команд (печать, отправка) в одну кнопку с иконкой: + +```json +{ "cmdBar": "КоманднаяПанель", "children": [ + { "popup": "ПодменюПечать", "title": "Печать", + "picture": "StdPicture.Print", "representation": "Picture", "children": [ + { "button": "ПечатьНакладная", "command": "Печать" }, + { "button": "ПечатьСчёт", "command": "ПечатьСчёт" } + ]} +]} +``` + +### Форма без стандартной командной панели + +Для модальных диалогов и мастеров: + +```json +{ "properties": { "commandBarLocation": "None", "windowOpeningMode": "LockWholeInterface" } } +``` + +### Надпись-гиперссылка + +Вместо кнопки для открытия подформ (ЦеныИВалюта, УчётнаяПолитика): + +```json +{ "labelField": "ЦеныИВалютаНадпись", "path": "ЦеныИВалюта", "hyperlink": true, "on": ["Click"] } +``` + +--- + +## Пример: форма обработки (полный DSL) + +```json +{ + "title": "Загрузка данных из CSV", + "properties": { "autoTitle": false, "windowOpeningMode": "LockOwnerWindow" }, + "events": { "OnCreateAtServer": "ПриСозданииНаСервере" }, + "elements": [ + { "group": "vertical", "name": "ГруппаПараметры", "children": [ + { "input": "ФайлЗагрузки", "path": "ФайлЗагрузки", "title": "Файл", "clearButton": true, "horizontalStretch": true, "on": ["StartChoice"] }, + { "input": "Кодировка", "path": "Кодировка" }, + { "input": "Разделитель", "path": "Разделитель", "title": "Разделитель колонок" } + ]}, + { "table": "Данные", "path": "Объект.Данные", "on": ["OnStartEdit"], "columns": [ + { "input": "ДанныеНомерСтроки", "path": "Объект.Данные.LineNumber", "readOnly": true, "title": "№" }, + { "input": "ДанныеНаименование", "path": "Объект.Данные.Наименование" }, + { "input": "ДанныеКоличество", "path": "Объект.Данные.Количество", "on": ["OnChange"] }, + { "input": "ДанныеСумма", "path": "Объект.Данные.Сумма", "readOnly": true } + ]}, + { "group": "horizontal", "name": "ГруппаКнопок", "children": [ + { "button": "Загрузить", "command": "Загрузить", "title": "Загрузить из файла", "defaultButton": true }, + { "button": "Очистить", "command": "Очистить", "title": "Очистить таблицу" }, + { "button": "Закрыть", "stdCommand": "Close" } + ]} + ], + "attributes": [ + { "name": "Объект", "type": "ExternalDataProcessorObject.ЗагрузкаИзCSV", "main": true }, + { "name": "ФайлЗагрузки", "type": "string" }, + { "name": "Кодировка", "type": "string(20)" }, + { "name": "Разделитель", "type": "string(5)" } + ], + "commands": [ + { "name": "Загрузить", "action": "ЗагрузитьОбработка" }, + { "name": "Очистить", "action": "ОчиститьОбработка" } + ] +} +``` diff --git a/docs/form-guide.md b/docs/form-guide.md index e408cb75..4c3b7124 100644 --- a/docs/form-guide.md +++ b/docs/form-guide.md @@ -10,6 +10,7 @@ | `/form-compile` | ` ` | Генерация Form.xml из компактного JSON-определения | | `/form-validate` | `` | Валидация: уникальность ID, companions, DataPath, команды | | `/form-add` | ` ` | Добавление элементов, реквизитов, команд в существующую форму | +| `/form-patterns` | (без параметров) | Справочник паттернов: архетипы, конвенции именования, продвинутые приёмы | ## Сценарии использования