/form-compile - Генерация Form.xml

SkillAI & models

Добавьте этот навык, чтобы ваш ИИ собирал управляемые формы 1С за вас. Навык компилирует форму из JSON-определения или из метаданных объекта. Это пригодится, когда нужно создать форму с нуля по описанию элементов или получить типовую форму.

Available today. Use it from your connected AI after setup.

После добавления опишите, какая форма нужна: перечислите элементы или укажите объект. ИИ соберёт форму из JSON-определения или из метаданных.

Then ask your AI: use the /form-compile - Генерация Form.xml skill

What your AI can do with it

  • Компилировать управляемую форму 1С из JSON-определения
  • Собирать форму из метаданных объекта
  • Создавать форму с нуля по описанию элементов
  • Генерировать типовую форму

What this skill tells your AI

The instructions your AI receives, as published by desko77/claude-code-skills-1c in skills/1c-form-compile/SKILL.md and read by ahel’s review.

Два режима:

  1. JSON DSL - из JSON-определения формы
  2. From object (-FromObject) - автоматически из метаданных объекта 1С по пресету ERP

При проектировании формы с нуля (5+ элементов или нечеткие требования) - вызовите /form-patterns для загрузки справочника. Для простых форм (1-3 поля) - не нужно.

Параметры

ПараметрОбязательныйОписание
JsonPathрежим 1Путь к JSON-определению формы
OutputPathдаПуть к выходному Form.xml
FromObjectрежим 2Флаг (без значения) - генерация по метаданным объекта

Команда

# Режим JSON DSL
powershell.exe -NoProfile -File skills/1c-form-compile/scripts/form-compile.ps1 -JsonPath "<json>" -OutputPath "<Form.xml>"

# Режим from-object (объект и purpose выводятся из OutputPath; Document и Catalog)
powershell.exe -NoProfile -File skills/1c-form-compile/scripts/form-compile.ps1 -FromObject -OutputPath "<.../TypePlural/ObjectName/Forms/FormName/Ext/Form.xml>"

JSON DSL - справка

Структура верхнего уровня

{
  "title": "Заголовок формы",
  "properties": { "autoTitle": false, ... },
  "events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
  "excludedCommands": ["Reread"],
  "elements": [ ... ],
  "attributes": [ ... ],
  "commands": [ ... ],
  "parameters": [ ... ]
}
  • 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

Поле ввода (input)

КлючОписаниеПример
pathDataPath - привязка к данным"Объект.Организация"
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)

КлючОписание
pathDataPath
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 с колонками (см. раздел "Связки").

КлючОписание
pathDataPath (привязка к реквизиту-таблице)
columns: [...]Колонки - массив элементов (обычно input)
changeRowSet: trueРазрешить добавление/удаление строк
changeRowOrder: trueРазрешить перемещение строк
heightВысота в строках таблицы
header: falseСкрыть шапку
footer: trueПоказать подвал
commandBarLocation"None", "Top", "Auto"
searchStringLocation"None", "Top", "Auto"
choiceMode: trueРежим выбора (для форм выбора)
initialTreeView"ExpandTopLevel" и др. (иерархические списки)
enableDrag: trueРазрешить перетаскивание
enableStartDrag: trueРазрешить начало перетаскивания
rowPictureDataPathПуть к картинке строки (напр. "Список.DefaultPicture")
tableAutofill: falseУправление Autofill внутреннего AutoCommandBar

Страницы (pages + page)

Ключ (pages)Описание
pagesRepresentation"None", "TabsOnTop", "TabsOnBottom" и др.
children: [...]Массив page
Ключ (page)Описание
titleЗаголовок вкладки
groupОриентация внутри страницы
children: [...]Содержимое страницы

Кнопка (button)

КлючОписание
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: [...]Кнопки панели

Выпадающее меню (popup)

КлючОписание
titleЗаголовок подменю
children: [...]Кнопки подменю

Используется внутри cmdBar для группировки кнопок в подменю:

{ "cmdBar": "Панель", "children": [
  { "popup": "Добавить", "title": "Добавить", "children": [
    { "button": "ДобавитьСтроку", "stdCommand": "Товары.Add" },
    { "button": "ДобавитьИзДокумента", "command": "ДобавитьИзДокумента", "title": "Из документа" }
  ]}
]}

Реквизиты (attributes)

{ "name": "Объект", "type": "DataProcessorObject.Загрузка", "main": true }
{ "name": "Список", "type": "DynamicList", "main": true, "settings": {
    "mainTable": "Catalog.Номенклатура", "dynamicDataRead": true
}}
{ "name": "Итого", "type": "decimal(15,2)" }
{ "name": "Таблица", "type": "ValueTable", "columns": [
    { "name": "Номенклатура", "type": "CatalogRef.Номенклатура" },
    { "name": "Количество", "type": "decimal(10,3)" }
]}
  • savedData: true - сохраняемые данные
  • useAlways: ["Поле"] - поля, читаемые с сервера всегда. Имя без точки достраивается именем реквизита, знак ~ остается впереди. Колонка с useAlways: true попадает в тот же список.
  • additionalColumns: [{ "table": "Объект.Товары", "columns": [...] }] - дополнительные колонки табличной части объекта. Идут в <Columns> после прямых колонок; пустой список колонок дает <AdditionalColumns table="..."/>.

Команды (commands)

{ "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
  • title - заголовок (если отличается от name)
  • picture - картинка команды

Система типов

Примитивные:

DSLXML
"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

Ссылочные и объектные (cfg:Prefix.Name):

DSLОписание
"CatalogRef.XXX" / "CatalogObject.XXX"Справочник
"DocumentRef.XXX" / "DocumentObject.XXX"Документ
"EnumRef.XXX"Перечисление
"DataProcessorObject.XXX" / "ReportObject.XXX"Обработка / Отчет
"InformationRegisterRecordSet.XXX"Набор записей регистра сведений
"AccumulationRegisterRecordSet.XXX"Набор записей регистра накопления
"DynamicList"Динамический список

Также допустимы: ChartOfAccountsRef/Object, ChartOfCharacteristicTypesRef/Object, ChartOfCalculationTypesRef/Object, ExchangePlanRef/Object, BusinessProcessRef/Object, TaskRef/Object, AccountingRegisterRecordSet, InformationRegisterRecordManager, ConstantsSet.

Платформенные:

DSLXML
"ValueTable"v8:ValueTable
"ValueTree"v8:ValueTree
"ValueList"v8:ValueListType
"TypeDescription"v8:TypeDescription
"UUID"v8:UUID
"FormattedString"v8ui:FormattedString
"Picture" / "Color" / "Font"v8ui:*
"DataCompositionSettings"dcsset:DataCompositionSettings
"Type1 | Type2"составной тип (несколько <v8:Type>)

Недопустимые типы (XDTO-ошибка при загрузке):

FormDataStructure, FormDataCollection, FormDataTree - runtime-типы 1С, не существуют в XML-схеме. Вместо них используйте CatalogObject.XXX, DocumentObject.XXX, DataProcessorObject.XXX, ValueTable, ValueTree.

Связки: элемент + реквизит

Таблица и некоторые поля требуют связанный реквизит. Элемент ссылается на реквизит через path.

Таблица - элемент table + реквизит ValueTable:

{
  "elements": [
    { "table": "Товары", "path": "Объект.Товары", "columns": [
      { "input": "Номенклатура", "path": "Объект.Товары.Номенклатура" }
    ]}
  ],
  "attributes": [
    { "name": "Объект", "type": "DataProcessorObject.Загрузка", "main": true,
      "columns": [
        { "name": "Товары", "type": "ValueTable", "columns": [
          { "name": "Номенклатура", "type": "CatalogRef.Номенклатура" }
        ]}
      ]
    }
  ]
}

Или, если таблица привязана к реквизиту формы (не к Объект):

{
  "elements": [
    { "table": "ТаблицаДанных", "path": "ТаблицаДанных", "columns": [
      { "input": "Наименование", "path": "ТаблицаДанных.Наименование" }
    ]}
  ],
  "attributes": [
    { "name": "ТаблицаДанных", "type": "ValueTable", "columns": [
      { "name": "Наименование", "type": "string(150)" }
    ]}
  ]
}

Паттерны

Диалог загрузки файла

{
  "title": "Загрузка из файла",
  "properties": { "autoTitle": false },
  "events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
  "elements": [
    { "group": "horizontal", "name": "ГруппаФайл", "children": [
      { "input": "ИмяФайла", "path": "ИмяФайла", "title": "Файл", "inputHint": "Выберите файл...", "choiceButton": true, "on": ["StartChoice"] },
      { "check": "ПерваяСтрокаЗаголовок", "path": "ПерваяСтрокаЗаголовок" }
    ]},
    { "input": "Результат", "path": "Результат", "multiLine": true, "height": 8, "readOnly": true, "title": "Лог" },
    { "group": "horizontal", "name": "ГруппаКнопок", "children": [
      { "button": "Загрузить", "command": "Загрузить", "defaultButton": true },
      { "button": "Закрыть", "stdCommand": "Close" }
    ]}
  ],
  "attributes": [
    { "name": "Объект", "type": "ExternalDataProcessorObject.ЗагрузкаИзФайла", "main": true },
    { "name": "ИмяФайла", "type": "string" },
    { "name": "ПерваяСтрокаЗаголовок", "type": "boolean" },
    { "name": "Результат", "type": "string" }
  ],
  "commands": [
    { "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
  ]
}

Мастер (wizard) с шагами

{
  "title": "Мастер настройки",
  "properties": { "autoTitle": false },
  "elements": [
    { "pages": "СтраницыМастера", "pagesRepresentation": "None", "children": [
      { "page": "Шаг1", "title": "Параметры", "children": [
        { "input": "Параметр1", "path": "Параметр1" }
      ]},
      { "page": "Шаг2", "title": "Результат", "children": [
        { "input": "Итог", "path": "Итог", "readOnly": true }
      ]}
    ]},
    { "group": "horizontal", "name": "Навигация", "children": [
      { "button": "Назад", "command": "Назад", "title": "< Назад" },
      { "button": "Далее", "command": "Далее", "title": "Далее >" }
    ]}
  ],
  "attributes": [
    { "name": "Объект", "type": "ExternalDataProcessorObject.Мастер", "main": true },
    { "name": "Параметр1", "type": "string" },
    { "name": "Итог", "type": "string" }
  ],
  "commands": [
    { "name": "Назад", "action": "НазадОбработка" },
    { "name": "Далее", "action": "ДалееОбработка" }
  ]
}

Список с фильтром и таблицей

{
  "title": "Просмотр данных",
  "elements": [
    { "group": "horizontal", "name": "Фильтр", "children": [
      { "input": "Период", "path": "Период", "on": ["OnChange"] },
      { "input": "Организация", "path": "Организация", "on": ["OnChange"] }
    ]},
    { "table": "Данные", "path": "Данные", "changeRowSet": true, "columns": [
      { "input": "Дата", "path": "Данные.Дата" },
      { "input": "Сумма", "path": "Данные.Сумма" },
      { "input": "Комментарий", "path": "Данные.Комментарий" }
    ]}
  ],
  "attributes": [
    { "name": "Объект", "type": "ExternalDataProcessorObject.Просмотр", "main": true },
    { "name": "Период", "type": "date" },
    { "name": "Организация", "type": "string" },
    { "name": "Данные", "type": "ValueTable", "columns": [
      { "name": "Дата", "type": "date" },
      { "name": "Сумма", "type": "decimal(15,2)" },
      { "name": "Комментарий", "type": "string(200)" }
    ]}
  ]
}

Автогенерация

  • Companion-элементы: ContextMenu, ExtendedTooltip и др. создаются автоматически
  • Обработчики событий: "on": ["OnChange"]ОрганизацияПриИзменении
  • Namespace: все 17 namespace-деклараций
  • ID: последовательная нумерация, AutoCommandBar = id="-1"
  • Unknown keys: выводится предупреждение о нераспознанных ключах

Workflow

  1. Компиляция: /form-compile генерирует Form.xml и автоматически регистрирует <Form> в ChildObjects родительского объекта (если OutputPath следует конвенции .../TypePlural/ObjectName/Forms/FormName/Ext/Form.xml).
  2. Метаданные формы (ФормаСписка.xml) и Module.bsl создает /form-add. Если /form-add еще не вызывался - вызови после /form-compile. Он не перезаписывает существующий Form.xml.
  3. Проверка: /form-validate, /form-info.

Верификация

/form-validate <OutputPath>    - проверка корректности XML
/form-info <OutputPath>        - визуальная сводка структуры

Особенности для EDT-проектов

form-compile генерирует формы в формате logform (XML-выгрузка). Для EDT-проектов форма будет работать, но дизайнер EDT может показать пустую форму из-за отсутствия EDT-специфичных свойств. Альтернативы: создать форму штатно через EDT или использовать MCP generate_form_from_metadata с format="edt".

Если форма создается вручную или через form-compile для EDT, после генерации необходимо добавить:

Критично (без этого дизайнер EDT пустой)

  • <extInfo xsi:type="form:ТипFormExtInfo"/> на корневом form:Form - тип формы:
    • CatalogFormExtInfo - справочник
    • DocumentFormExtInfo - документ
    • DataProcessorFormExtInfo - обработка
    • InformationRegisterFormExtInfo - регистр сведений

Обязательные свойства формы

  • commandInterface с <navigationPanel/> и <commandBar/>
  • windowOpeningMode = LockOwnerWindow
  • autoFillCheck = true
  • showTitle, showCloseButton = true
  • allowFormCustomize, saveWindowSettings = true

Обязательные свойства полей (InputField, LabelField, CheckBoxField)

  • visible, enabled = true
  • userVisible с <common>true</common>
  • editMode = EnterOnInput
  • showInHeader, showInFooter = true
  • typeDomainEnabled = true
  • chooseType = true
  • wrap = true
  • textEdit = true
  • headerHorizontalAlign = Left

Обязательные свойства кнопок (Button)

  • Кнопка на форме (вне CommandBar): type = UsualButton (обязательно)
  • Кнопка в CommandBar: type = CommandBarButton (дефолт, можно не указывать)
  • Имя кнопки = имя команды (не Кнопка[Команда], не [Команда]Кнопка)

Размещение обработчиков событий (Events)

Обработчики InputField делятся по месту размещения в XML:

На уровне элемента (<Events> внутри <InputField>):

  • OnChange, DragCheck, Drag, DragStart

Внутри <extInfo xsi:type="form:InputFieldExtInfo"> (<handlers>):

  • StartChoice, Clearing, Opening, ChoiceProcessing, AutoComplete, TextEditEnd

Эти события специфичны для типа поля и размещаются внутри extInfo, а не на уровне элемента.

Специфика объектов

  • Иерархический справочник - всегда добавлять поле Родитель (Parent)
  • DynamicList: <extInfo xsi:type="form:DynamicListExtInfo"> на атрибуте с mainTable

Особенности для внешних обработок (EPF)

  • Тип главного реквизита: ExternalDataProcessorObject.ИмяОбработки (не DataProcessorObject)
  • DataPath: используйте реквизиты формы (ИмяРеквизита), а не Объект.ИмяРеквизита - у внешних обработок нет реквизитов объекта в метаданных
  • Ссылочные типы: CatalogRef.XXX, DocumentRef.XXX допустимы в XML, но для сборки EPF потребуется база с целевой конфигурацией (см. /epf-build)

Signals

GitHub stars
61
Forks
14
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
x-1c-form-compile
Source
github.com/desko77/claude-code-skills-1c