1c-form-patterns
Справочник паттернов компоновки управляемых форм 1С. Используй как справочник при проектировании форм — архетипы, конвенции, продвинутые приёмы
Install
npx skills add https://github.com/Desko77/claude-code-skills-1c/tree/main/skills/1c-form-patterns
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install desko77-claude-code-skills-1c@llmmart
git clone https://github.com/Desko77/claude-code-skills-1c.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole desko77/claude-code-skills-1c collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
/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)
Ссылка (Ref) в запросе: добавлять элемент-колонку Ссылка в конец таблицы списка с userVisible: false. Ссылка нужна пользователю для самостоятельного вывода реквизитов ссылки, которые не были предусмотрены разработчиком, но не для отображения. Исключение: если явно требуется показать ссылку в колонках - выводить в место, указанное в ТЗ (или в конец, если не указано), без userVisible: false.
Форма элемента справочника
Простая:
ГруппаРеквизитов (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 | ПриНачалеРедактирования | ТоварыПриНачалеРедактирования |
Обработчики формы: ПриСозданииНаСервере, ПриОткрытии, ПередЗакрытием, ОбработкаОповещения.
Принципы компоновки
- Порядок чтения. Сверху вниз, слева направо. Самое важное - вверху.
- Двухколоночная шапка. Основные реквизиты слева (контрагент, склад), организационные справа (организация, подразделение).
- Кнопки действий внизу. Главная кнопка -
defaultButton: true. Закрыть - всегда последняя. - Таблицы - основная область. Табличные части занимают большую часть формы, обычно на Pages.
- Итоги рядом с таблицей. В подвале, горизонтальная группа, все поля readOnly.
- Фильтры - отдельная зона. Над списком, alwaysHorizontal, пара "флажок + поле" на каждый фильтр.
- Скрытые элементы для состояний. Баннеры, предупреждения -
visible: false, показываются программно. - Надписи-ссылки для диалогов.
labelFieldсhyperlink: trueи событием Click. - Встроенная кнопка выбора вместо отдельной. Для полей выбора файла/значения предпочитать
choiceButton: true(кнопка "..." в поле) + событиеStartChoice, а не отдельную кнопку рядом. Компактнее и идиоматичнее. - Не дублировать title. Если заголовок совпадает с именем реквизита - не указывать
titleявно, платформа подставит автоматически.
Продвинутые паттерны (ERP)
Сворачиваемые группы
Для необязательных секций (подписи, дополнительно, прочее):
{ "group": "vertical", "name": "ГруппаПодписи", "title": "Подписи",
"behavior": "Collapsible", "collapsed": true, "children": [...] }
Баннер-предупреждение
Группа "картинка + надпись", скрыта по умолчанию, показывается программно:
{ "group": "horizontal", "name": "ГруппаПредупреждение", "showTitle": false,
"visible": false, "children": [
{ "picture": "ПредупреждениеКартинка" },
{ "label": "ПредупреждениеНадпись", "title": "Текст", "maxWidth": 76, "autoMaxWidth": false }
]}
Popup-меню в командной панели
Группировка связанных команд (печать, отправка) в одну кнопку с иконкой:
{ "cmdBar": "КоманднаяПанель", "children": [
{ "popup": "ПодменюПечать", "title": "Печать",
"picture": "StdPicture.Print", "representation": "Picture", "children": [
{ "button": "ПечатьНакладная", "command": "Печать" },
{ "button": "ПечатьСчет", "command": "ПечатьСчет" }
]}
]}
Форма без стандартной командной панели
Для модальных диалогов и мастеров:
{ "properties": { "commandBarLocation": "None", "windowOpeningMode": "LockWholeInterface" } }
Надпись-гиперссылка
Вместо кнопки для открытия подформ (ЦеныИВалюта, УчетнаяПолитика):
{ "labelField": "ЦеныИВалютаНадпись", "path": "ЦеныИВалюта", "hyperlink": true, "on": ["Click"] }
Пример: форма обработки (полный DSL)
{
"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": "ОчиститьОбработка" }
]
}
Files (claude-code-skills-1c)
-
evals
-
evals.json 3.1 KB
{ "skill_name": "1c-form-patterns", "evals": [ { "id": 1, "prompt": "Мне нужно создать форму документа ПоступлениеТоваров, но я не знаю как правильно расположить поля шапки, табличную часть и итоги. Покажи стандартный паттерн.", "expected_output": "Показан паттерн Document Form с описанием структуры: двухколоночная шапка, Pages с таблицей товаров, футер с итогами, рекомендуемые события и соглашения об именовании.", "expectations": [ "Показан архетип 'Document Form' с текстовой схемой структуры (Header, Pages, Footer)", "Упомянуты события OnCreateAtServer, OnReadAtServer, BeforeWriteAtServer", "Показаны соглашения об именовании групп: HeaderGroup, HeaderLeftGroup, FooterGroup, TotalsGroup", "Показаны примеры именования элементов для таблицы: [Table][Field]" ] }, { "id": 2, "prompt": "Создаю форму обработки для массовой замены цен. Покажи паттерн формы обработки: какие группы, кнопки, события стандартные для такого типа форм.", "expected_output": "Показан паттерн Data Processor Form с зонами параметров, рабочей областью и кнопками действий, включая defaultButton и кнопку Close.", "expectations": [ "Показан архетип 'Data Processor Form' со структурой Parameters / Working area / Action buttons", "Упомянуто свойство windowOpeningMode=LockOwnerWindow для диалогов", "Показана кнопка закрытия через stdCommand: Close", "Упомянуто событие OnCreateAtServer" ] }, { "id": 3, "prompt": "Как правильно сделать форму-мастер (визард) в 1С? Нужно провести пользователя через 3 шага: ввод параметров, предпросмотр, результат.", "expected_output": "Показан паттерн Wizard с Pages по шагам, кнопками Back/Next/Execute, рекомендациями по windowOpeningMode и отсутствию стандартной командной панели.", "expectations": [ "Показан архетип 'Wizard' со структурой Pages (Step1, Step2, Step3)", "Показаны кнопки Back, Next (defaultButton), Execute, Close", "Упомянуты свойства windowOpeningMode=LockOwnerWindow и commandBarLocation=None", "Показан JSON DSL-пример или текстовая схема мастера" ] } ] }
-
-
SKILL.md 13.6 KB
--- name: 1c-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) **Ссылка (Ref) в запросе:** добавлять элемент-колонку Ссылка в конец таблицы списка с `userVisible: false`. Ссылка нужна пользователю для самостоятельного вывода реквизитов ссылки, которые не были предусмотрены разработчиком, но не для отображения. Исключение: если явно требуется показать ссылку в колонках - выводить в место, указанное в ТЗ (или в конец, если не указано), без userVisible: false. ### Форма элемента справочника **Простая:** ``` ГруппаРеквизитов (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. 9. **Встроенная кнопка выбора вместо отдельной.** Для полей выбора файла/значения предпочитать `choiceButton: true` (кнопка "..." в поле) + событие `StartChoice`, а не отдельную кнопку рядом. Компактнее и идиоматичнее. 10. **Не дублировать title.** Если заголовок совпадает с именем реквизита - не указывать `title` явно, платформа подставит автоматически. --- ## Продвинутые паттерны (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": "ОчиститьОбработка" } ] } ```
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.