Принимает компактное JSON-определение формы (20–50 строк) и генерирует полный корректный Form.xml (100–500+ строк) с namespace-декларациями, автогенерированными companion-элементами, последовательными ID.
При проектировании формы с нуля (5+ элементов или нечёткие требования) — вызовите /form-patterns для загрузки справочника: архетипы, конвенции именования, продвинутые паттерны. Для простых форм (1–3 поля, пользователь описал что нужно) — не нужно.
Использование
/form-compile <JsonPath> <OutputPath>
Параметры
| Параметр | Обязательный | Описание |
|---|
| JsonPath | да | Путь к JSON-определению формы |
| OutputPath | да | Путь к выходному файлу Form.xml |
Команда
powershell
1powershell.exe -NoProfile -File .claude/skills/form-compile/scripts/form-compile.ps1 -JsonPath "<json>" -OutputPath "<xml>"
JSON DSL — справка
Структура верхнего уровня
json
1{
2 "title": "Заголовок формы",
3 "properties": { "autoTitle": false, ... },
4 "events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
5 "excludedCommands": ["Reread"],
6 "elements": [ ... ],
7 "attributes": [ ... ],
8 "commands": [ ... ],
9 "parameters": [ ... ]
10}
title — заголовок формы (multilingual). Можно указать и в properties, но лучше на верхнем уровне
properties — свойства формы: autoTitle, windowOpeningMode, commandBarLocation, saveDataInSettings, width, height и др.
events — обработчики событий формы (ключ: имя события 1С, значение: имя процедуры)
excludedCommands — исключённые стандартные команды
Элементы (ключ определяет тип)
| DSL ключ | XML элемент | Значение ключа |
|---|
"group" | UsualGroup | "horizontal" / "vertical" / "alwaysHorizontal" / "alwaysVertical" / "collapsible" |
"input" | InputField | имя элемента |
"check" | CheckBoxField | имя |
"label" | LabelDecoration | имя (текст задаётся через title) |
"labelField" | LabelField | имя |
"table" | Table | имя |
"pages" | Pages | имя |
"page" | Page | имя |
"button" | Button | имя |
"picture" | PictureDecoration | имя |
"picField" | PictureField | имя |
"calendar" | CalendarField | имя |
"cmdBar" | CommandBar | имя |
"popup" | Popup | имя |
Общие свойства (все типы элементов)
| Ключ | Описание |
|---|
name | Переопределить имя (по умолчанию = значение ключа типа) |
title | Заголовок элемента |
visible: false | Скрыть (синоним: hidden: true) |
enabled: false | Сделать недоступным (синоним: disabled: true) |
readOnly: true | Только чтение |
on: [...] | События с автоименованием обработчиков |
handlers: {...} | Явное задание имён обработчиков: {"OnChange": "МоёИмя"} |
Допустимые имена событий (on)
Компилятор предупреждает о неизвестных событиях. Имена регистрозависимы — используйте точно как указано.
Форма (events): OnCreateAtServer, OnOpen, BeforeClose, OnClose, NotificationProcessing, ChoiceProcessing, OnReadAtServer, BeforeWriteAtServer, OnWriteAtServer, AfterWriteAtServer, BeforeWrite, AfterWrite, FillCheckProcessingAtServer, BeforeLoadDataFromSettingsAtServer, OnLoadDataFromSettingsAtServer, ExternalEvent, Opening
input / picField: OnChange, StartChoice, ChoiceProcessing, AutoComplete, TextEditEnd, Clearing, Creating, EditTextChange
check: OnChange
table: OnStartEdit, OnEditEnd, OnChange, Selection, ValueChoice, BeforeAddRow, BeforeDeleteRow, AfterDeleteRow, BeforeRowChange, BeforeEditEnd, OnActivateRow, OnActivateCell, Drag, DragStart, DragCheck, DragEnd
label / picture: Click, URLProcessing
labelField: OnChange, StartChoice, ChoiceProcessing, Click, URLProcessing, Clearing
button: Click
pages: OnCurrentPageChange
| Ключ | Описание | Пример |
|---|
path | DataPath — привязка к данным | "Объект.Организация" |
titleLocation | Размещение заголовка | "none", "left", "top" |
multiLine: true | Многострочное поле | текстовое поле, комментарий |
passwordMode: true | Режим пароля (звёздочки) | поле ввода пароля |
choiceButton: true | Кнопка выбора ("...") | ссылочное поле |
clearButton: true | Кнопка очистки ("X") | |
spinButton: true | Кнопка прокрутки | числовые поля |
dropListButton: true | Кнопка выпадающего списка | |
markIncomplete: true | Пометка незаполненного | обязательные поля |
skipOnInput: true | Пропускать при обходе Tab | |
inputHint | Подсказка в пустом поле | "Введите наименование..." |
width / height | Размер | числа |
autoMaxWidth: false | Отключить авто-ширину | для фиксированных полей |
horizontalStretch: true | Растягивать по ширине | |
Чекбокс (check)
| Ключ | Описание |
|---|
path | DataPath |
titleLocation | Размещение заголовка |
Надпись-декорация (label)
| Ключ | Описание |
|---|
title | Текст надписи (обязательно) |
hyperlink: true | Сделать ссылкой |
width / height | Размер |
Группа (group)
Значение ключа задаёт ориентацию: "horizontal", "vertical", "alwaysHorizontal", "alwaysVertical", "collapsible".
| Ключ | Описание |
|---|
showTitle: true | Показывать заголовок группы |
united: false | Не объединять рамку |
representation | "none", "normal", "weak", "strong" |
children: [...] | Вложенные элементы |
Таблица (table)
Важно: таблица требует связанный реквизит формы типа ValueTable с колонками (см. раздел "Связки").
| Ключ | Описание |
|---|
path | DataPath (привязка к реквизиту-таблице) |
columns: [...] | Колонки — массив элементов (обычно input) |
changeRowSet: true | Разрешить добавление/удаление строк |
changeRowOrder: true | Разрешить перемещение строк |
height | Высота в строках таблицы |
header: false | Скрыть шапку |
footer: true | Показать подвал |
commandBarLocation | "None", "Top", "Auto" |
searchStringLocation | "None", "Top", "Auto" |
Страницы (pages + page)
| Ключ (pages) | Описание |
|---|
pagesRepresentation | "None", "TabsOnTop", "TabsOnBottom" и др. |
children: [...] | Массив page |
| Ключ (page) | Описание |
|---|
title | Заголовок вкладки |
group | Ориентация внутри страницы |
children: [...] | Содержимое страницы |
| Ключ | Описание |
|---|
command | Имя команды формы → Form.Command.Имя |
stdCommand | Стандартная команда: "Close" → Form.StandardCommand.Close; с точкой: "Товары.Add" → Form.Item.Товары.StandardCommand.Add |
defaultButton: true | Кнопка по умолчанию |
type | "usual", "hyperlink", "commandBar" |
picture | Картинка кнопки |
representation | "Auto", "Text", "Picture", "PictureAndText" |
locationInCommandBar | "Auto", "InCommandBar", "InAdditionalSubmenu" |
Командная панель (cmdBar)
| Ключ | Описание |
|---|
autofill: true | Автозаполнение стандартными командами |
children: [...] | Кнопки панели |
| Ключ | Описание |
|---|
title | Заголовок подменю |
children: [...] | Кнопки подменю |
Используется внутри cmdBar для группировки кнопок в подменю:
json
1{ "cmdBar": "Панель", "children": [
2 { "popup": "Добавить", "title": "Добавить", "children": [
3 { "button": "ДобавитьСтроку", "stdCommand": "Товары.Add" },
4 { "button": "ДобавитьИзДокумента", "command": "ДобавитьИзДокумента", "title": "Из документа" }
5 ]}
6]}
Реквизиты (attributes)
json
1{ "name": "Объект", "type": "DataProcessorObject.Загрузка", "main": true }
2{ "name": "Итого", "type": "decimal(15,2)" }
3{ "name": "Таблица", "type": "ValueTable", "columns": [
4 { "name": "Номенклатура", "type": "CatalogRef.Номенклатура" },
5 { "name": "Количество", "type": "decimal(10,3)" }
6]}
savedData: true — сохраняемые данные
Команды (commands)
json
1{ "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
title — заголовок (если отличается от name)
picture — картинка команды
Система типов
| DSL | XML |
|---|
"string" / "string(100)" | xs:string + StringQualifiers |
"decimal(15,2)" | xs:decimal + NumberQualifiers |
"decimal(10,0,nonneg)" | с AllowedSign=Nonnegative |
"boolean" | xs:boolean |
"date" / "dateTime" / "time" | xs:dateTime + DateFractions |
"CatalogRef.XXX" | cfg:CatalogRef.XXX |
"DocumentRef.XXX" | cfg:DocumentRef.XXX |
"ValueTable" | v8:ValueTable |
"ValueList" | v8:ValueListType |
"Type1 | Type2" | составной тип |
Связки: элемент + реквизит
Таблица и некоторые поля требуют связанный реквизит. Элемент ссылается на реквизит через path.
Таблица — элемент table + реквизит ValueTable:
json
1{
2 "elements": [
3 { "table": "Товары", "path": "Объект.Товары", "columns": [
4 { "input": "Номенклатура", "path": "Объект.Товары.Номенклатура" }
5 ]}
6 ],
7 "attributes": [
8 { "name": "Объект", "type": "DataProcessorObject.Загрузка", "main": true,
9 "columns": [
10 { "name": "Товары", "type": "ValueTable", "columns": [
11 { "name": "Номенклатура", "type": "CatalogRef.Номенклатура" }
12 ]}
13 ]
14 }
15 ]
16}
Или, если таблица привязана к реквизиту формы (не к Объект):
json
1{
2 "elements": [
3 { "table": "ТаблицаДанных", "path": "ТаблицаДанных", "columns": [
4 { "input": "Наименование", "path": "ТаблицаДанных.Наименование" }
5 ]}
6 ],
7 "attributes": [
8 { "name": "ТаблицаДанных", "type": "ValueTable", "columns": [
9 { "name": "Наименование", "type": "string(150)" }
10 ]}
11 ]
12}
Паттерны
Диалог загрузки файла
json
1{
2 "title": "Загрузка из файла",
3 "properties": { "autoTitle": false },
4 "events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
5 "elements": [
6 { "group": "horizontal", "name": "ГруппаФайл", "children": [
7 { "input": "ИмяФайла", "path": "ИмяФайла", "title": "Файл", "inputHint": "Выберите файл...", "choiceButton": true, "on": ["StartChoice"] },
8 { "check": "ПерваяСтрокаЗаголовок", "path": "ПерваяСтрокаЗаголовок" }
9 ]},
10 { "input": "Результат", "path": "Результат", "multiLine": true, "height": 8, "readOnly": true, "title": "Лог" },
11 { "group": "horizontal", "name": "ГруппаКнопок", "children": [
12 { "button": "Загрузить", "command": "Загрузить", "defaultButton": true },
13 { "button": "Закрыть", "stdCommand": "Close" }
14 ]}
15 ],
16 "attributes": [
17 { "name": "Объект", "type": "ExternalDataProcessorObject.ЗагрузкаИзФайла", "main": true },
18 { "name": "ИмяФайла", "type": "string" },
19 { "name": "ПерваяСтрокаЗаголовок", "type": "boolean" },
20 { "name": "Результат", "type": "string" }
21 ],
22 "commands": [
23 { "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
24 ]
25}
Мастер (wizard) с шагами
json
1{
2 "title": "Мастер настройки",
3 "properties": { "autoTitle": false },
4 "elements": [
5 { "pages": "СтраницыМастера", "pagesRepresentation": "None", "children": [
6 { "page": "Шаг1", "title": "Параметры", "children": [
7 { "input": "Параметр1", "path": "Параметр1" }
8 ]},
9 { "page": "Шаг2", "title": "Результат", "children": [
10 { "input": "Итог", "path": "Итог", "readOnly": true }
11 ]}
12 ]},
13 { "group": "horizontal", "name": "Навигация", "children": [
14 { "button": "Назад", "command": "Назад", "title": "< Назад" },
15 { "button": "Далее", "command": "Далее", "title": "Далее >" }
16 ]}
17 ],
18 "attributes": [
19 { "name": "Объект", "type": "ExternalDataProcessorObject.Мастер", "main": true },
20 { "name": "Параметр1", "type": "string" },
21 { "name": "Итог", "type": "string" }
22 ],
23 "commands": [
24 { "name": "Назад", "action": "НазадОбработка" },
25 { "name": "Далее", "action": "ДалееОбработка" }
26 ]
27}
Список с фильтром и таблицей
json
1{
2 "title": "Просмотр данных",
3 "elements": [
4 { "group": "horizontal", "name": "Фильтр", "children": [
5 { "input": "Период", "path": "Период", "on": ["OnChange"] },
6 { "input": "Организация", "path": "Организация", "on": ["OnChange"] }
7 ]},
8 { "table": "Данные", "path": "Данные", "changeRowSet": true, "columns": [
9 { "input": "Дата", "path": "Данные.Дата" },
10 { "input": "Сумма", "path": "Данные.Сумма" },
11 { "input": "Комментарий", "path": "Данные.Комментарий" }
12 ]}
13 ],
14 "attributes": [
15 { "name": "Объект", "type": "ExternalDataProcessorObject.Просмотр", "main": true },
16 { "name": "Период", "type": "date" },
17 { "name": "Организация", "type": "string" },
18 { "name": "Данные", "type": "ValueTable", "columns": [
19 { "name": "Дата", "type": "date" },
20 { "name": "Сумма", "type": "decimal(15,2)" },
21 { "name": "Комментарий", "type": "string(200)" }
22 ]}
23 ]
24}
Автогенерация
- Companion-элементы: ContextMenu, ExtendedTooltip и др. создаются автоматически
- Обработчики событий:
"on": ["OnChange"] → ОрганизацияПриИзменении
- Namespace: все 17 namespace-деклараций
- ID: последовательная нумерация, AutoCommandBar = id="-1"
- Unknown keys: выводится предупреждение о нераспознанных ключах
Верификация
/form-validate <OutputPath> — проверка корректности XML
/form-info <OutputPath> — визуальная сводка структуры
Особенности для внешних обработок (EPF)
- Тип главного реквизита:
ExternalDataProcessorObject.ИмяОбработки (не DataProcessorObject)
- DataPath: используйте реквизиты формы (
ИмяРеквизита), а не Объект.ИмяРеквизита — у внешних обработок нет реквизитов объекта в метаданных
- Ссылочные типы:
CatalogRef.XXX, DocumentRef.XXX допустимы в XML, но для сборки EPF потребуется база с целевой конфигурацией (см. /epf-build)