$npx -y skills add Desko77/cursor-1c-skills --skill 1c-form-compileКомпиляция управляемой формы 1С из JSON-определения или из метаданных объекта. Используй когда нужно создать форму с нуля по описанию элементов или сгенерировать типовую форму
| 1 | # /form-compile — Генерация Form.xml |
| 2 | |
| 3 | Два режима: |
| 4 | 1. **JSON DSL** — из JSON-определения формы |
| 5 | 2. **From object** (`-FromObject`) — автоматически из метаданных объекта 1С по пресету ERP |
| 6 | |
| 7 | > **При проектировании формы с нуля (5+ элементов или нечёткие требования)** — вызовите `/form-patterns` для загрузки справочника. Для простых форм (1–3 поля) — не нужно. |
| 8 | |
| 9 | ## Параметры |
| 10 | |
| 11 | | Параметр | Обязательный | Описание | |
| 12 | |------------|:------------:|---------------------------------| |
| 13 | | JsonPath | режим 1 | Путь к JSON-определению формы | |
| 14 | | OutputPath | да | Путь к выходному Form.xml | |
| 15 | | FromObject | режим 2 | Флаг (без значения) — генерация по метаданным объекта | |
| 16 | |
| 17 | ## Команда |
| 18 | |
| 19 | ```powershell |
| 20 | # Режим JSON DSL |
| 21 | powershell.exe -NoProfile -File skills/1c-form-compile/scripts/form-compile.ps1 -JsonPath "<json>" -OutputPath "<Form.xml>" |
| 22 | |
| 23 | # Режим from-object (объект и purpose выводятся из OutputPath; Document и Catalog) |
| 24 | powershell.exe -NoProfile -File skills/1c-form-compile/scripts/form-compile.ps1 -FromObject -OutputPath "<.../TypePlural/ObjectName/Forms/FormName/Ext/Form.xml>" |
| 25 | ``` |
| 26 | |
| 27 | ## JSON DSL — справка |
| 28 | |
| 29 | ### Структура верхнего уровня |
| 30 | |
| 31 | ```json |
| 32 | { |
| 33 | "title": "Заголовок формы", |
| 34 | "properties": { "autoTitle": false, ... }, |
| 35 | "events": { "OnCreateAtServer": "ПриСозданииНаСервере" }, |
| 36 | "excludedCommands": ["Reread"], |
| 37 | "elements": [ ... ], |
| 38 | "attributes": [ ... ], |
| 39 | "commands": [ ... ], |
| 40 | "parameters": [ ... ] |
| 41 | } |
| 42 | ``` |
| 43 | |
| 44 | - `title` — заголовок формы (multilingual). Можно указать и в `properties`, но лучше на верхнем уровне |
| 45 | - `properties` — свойства формы: `autoTitle`, `windowOpeningMode`, `commandBarLocation`, `saveDataInSettings`, `width`, `height` и др. |
| 46 | - `events` — обработчики событий формы (ключ: имя события 1С, значение: имя процедуры) |
| 47 | - `excludedCommands` — исключённые стандартные команды |
| 48 | |
| 49 | ### Элементы (ключ определяет тип) |
| 50 | |
| 51 | | DSL ключ | XML элемент | Значение ключа | |
| 52 | |--------------|-------------------|---------------------------------------------------| |
| 53 | | `"group"` | UsualGroup | `"horizontal"` / `"vertical"` / `"alwaysHorizontal"` / `"alwaysVertical"` / `"collapsible"` | |
| 54 | | `"input"` | InputField | имя элемента | |
| 55 | | `"check"` | CheckBoxField | имя | |
| 56 | | `"label"` | LabelDecoration | имя (текст задаётся через `title`) | |
| 57 | | `"labelField"` | LabelField | имя | |
| 58 | | `"table"` | Table | имя | |
| 59 | | `"pages"` | Pages | имя | |
| 60 | | `"page"` | Page | имя | |
| 61 | | `"button"` | Button | имя | |
| 62 | | `"picture"` | PictureDecoration | имя | |
| 63 | | `"picField"` | PictureField | имя | |
| 64 | | `"calendar"` | CalendarField | имя | |
| 65 | | `"cmdBar"` | CommandBar | имя | |
| 66 | | `"popup"` | Popup | имя | |
| 67 | |
| 68 | ### Общие свойства (все типы элементов) |
| 69 | |
| 70 | | Ключ | Описание | |
| 71 | |------|----------| |
| 72 | | `name` | Переопределить имя (по умолчанию = значение ключа типа) | |
| 73 | | `title` | Заголовок элемента | |
| 74 | | `visible: false` | Скрыть (синоним: `hidden: true`) | |
| 75 | | `enabled: false` | Сделать недоступным (синоним: `disabled: true`) | |
| 76 | | `readOnly: true` | Только чтение | |
| 77 | | `on: [...]` | События с автоименованием обработчиков | |
| 78 | | `handlers: {...}` | Явное задание имён обработчиков: `{"OnChange": "МоёИмя"}` | |
| 79 | |
| 80 | ### Допустимые имена событий (`on`) |
| 81 | |
| 82 | Компилятор предупреждает о неизвестных событиях. Имена регистрозависимы — используйте точно как указано. |
| 83 | |
| 84 | **Форма** (`events`): `OnCreateAtServer`, `OnOpen`, `BeforeClose`, `OnClose`, `NotificationProcessing`, `ChoiceProcessing`, `OnReadAtServer`, `BeforeWriteAtServer`, `OnWriteAtServer`, `AfterWriteAtServer`, `BeforeWrite`, `AfterWrite`, `FillCheckProcessingAtServer`, `BeforeLoadDataFromSettingsAtServer`, `OnLoadDataFromSettingsAtServer`, `ExternalEvent`, `Opening` |
| 85 | |
| 86 | **input / picField**: `OnChange`, `StartChoice`, `ChoiceProcessing`, `AutoComplete`, `TextEditEnd`, `Clearing`, `Creating`, `EditTextChange` |
| 87 | |
| 88 | **check**: `OnChange` |
| 89 | |
| 90 | **table**: `OnStartEdit`, `OnEditEnd`, `OnChange`, `Selection`, `ValueChoice`, `BeforeAddRow`, `BeforeDeleteRow`, `AfterDeleteRow`, `BeforeRowChange`, `BeforeEditEnd`, `OnActivateRow`, `OnActivateCell`, `Drag`, `DragStart`, `DragCheck`, `DragEnd` |
| 91 | |
| 92 | **label / picture**: `Click`, `URLProcessing` |
| 93 | |
| 94 | **labelField**: `OnChange`, `StartChoice`, `ChoiceProcessing`, `Click`, `URLProcessing`, `Clearing` |
| 95 | |
| 96 | **button**: `Click` |
| 97 | |
| 98 | **pages**: `OnCurrentPageChange` |
| 99 | |
| 100 | ### Поле ввода (input) |
| 101 | |
| 102 | | Ключ | Описание | Пример | |
| 103 | |------|----------|--------| |
| 104 | | `path` | DataPath — привязка к данным | `"Объект.Организация"` | |
| 105 | | `titleLocation` | Размещение заголовка | `"none"`, `"left"`, `"top"` | |
| 106 | | `multiLine: true` | Многострочное поле | текстовое поле, комментарий | |
| 107 | | `passwordMode: true` | Режим пароля (звёздочки) | поле ввода пароля | |
| 108 | | `choiceButton: true` | Кнопка выбора ("...") | ссылочное поле | |
| 109 | | `clearButton: true` | Кнопка очистки ("X") | | |
| 110 | | `spinButton: true` | Кнопка прокрутки | числовые поля | |
| 111 | | `dropListButton: true` | Кнопка выпадающего списка | | |
| 112 | | `markIncompl |