mcpField
F
form-compile

form-compile

github.com/nikolay-shirokovDevelopment74152 installsUpdated today
Repository

About form-compile

form-compile is a command-line skill for 1C developers that generates Form.xml from either a JSON DSL or object metadata using an ERP preset.

Key features

  1. 01Generates Form.xml from JSON DSL
  2. 02Builds forms from object metadata
  3. 03Configures form and element events
  4. 04Defines inputs, tables, and pages
  5. 05Sets commands, buttons, and attributes
  6. 06Configures dynamic-list properties

Use cases

  1. 01Compiling a form from a JSON definition
  2. 02Generating a form for a Document or Catalog object
  3. 03Configuring form controls and events
  4. 04Building an interface with tables and command bars

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/nikolay-shirokov/cc-1c-skills --skill form-compile

After installing, type/form-compilein Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

presets/
erp-standard.json
README.md
references/
appearance.md
attributes-advanced.md
buttons-commands.md
charts.md
choice-params.md
command-interface.md
dynamic-list.md
form-properties.md
groups-pages.md
input-fields.md
layout-advanced.md
pictures.md
report-form.md
roles-access.md
special-fields.md
spreadsheet.md
table-advanced.md
tooltips-text.md
type-system-advanced.md
scripts/
form-compile.ps1
form-compile.py

Details

From the project README

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

Два режима:

  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 "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" -JsonPath "<json>" -OutputPath "<Form.xml>"

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

JSON DSL

Структура
{
  "title": "Заголовок формы",
  "properties": { "windowOpeningMode": "LockOwnerWindow" },
  "events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
  "elements": [ ... ],
  "attributes": [ ... ],
  "commands": [ ... ],
  "parameters": [ ... ]
}
  • title — заголовок формы (строка или {ru, en})
  • properties — свойства формы: windowOpeningMode, commandBarLocation, width, height и др. (полный список — references/form-properties.md)
  • events — обработчики событий формы: { "ИмяСобытия": "ИмяПроцедуры" }
  • excludedCommands — убрать стандартные команды формы: ["Reread", "Copy"]
Элементы (ключ определяет тип)
КлючЭлементЗначение ключа
groupОбычная группаориентация: vertical / horizontalIfPossible / alwaysHorizontal
inputПоле вводаимя
checkФлажокимя
radioПереключательимя
labelНадписьимя (текст — в title)
labelFieldПоле-надпись (значение без редактирования)имя
tableТаблицаимя
columnGroupГруппа колонок (внутри columns таблицы)horizontal / vertical / inCell
pages / pageСтраницы / страницаимя
buttonКнопкаимя
buttonGroupГруппа кнопок (в командной панели или подменю)имя
popupПодменюимя
cmdBarКомандная панель в раскладке формыимя
autoCmdBarКомандная панель самой формыимя (обычно ФормаКоманднаяПанель)
pictureКартинкаимя
picFieldПоле-картинкаимя

Табличный документ, HTML, календарь, диаграммы и другие особые поля — по индексу ниже.

Общие свойства элементов
КлючОписание
nameИмя элемента, если отличается от значения ключа типа. Имена в форме уникальны
titleЗаголовок (строка или {ru, en}); "" — без заголовка
tooltipВсплывающая подсказка
visible: false / enabled: false / readOnly: trueСкрыть / сделать недоступным / только чтение
titleLocationnone / left / right / top / bottom / auto
width / heightРазмер
horizontalStretch / verticalStretchРастягивать
autoMaxWidth: falseСнять предел ширины (поле тянется на всю доступную ширину)
eventsОбработчики: { "OnChange": "ИмяОбработчика" }
События

Имена регистрозависимы.

Форма: OnCreateAtServer, OnOpen, BeforeClose, OnClose, NotificationProcessing, ChoiceProcessing, OnReadAtServer, BeforeWriteAtServer, OnWriteAtServer, AfterWriteAtServer, BeforeWrite, AfterWrite, FillCheckProcessingAtServer, BeforeLoadDataFromSettingsAtServer, OnLoadDataFromSettingsAtServer, OnSaveDataInSettingsAtServer, URLProcessing, ExternalEvent, OnReopen

input: OnChange, StartChoice, ChoiceProcessing, AutoComplete, TextEditEnd, Clearing, Opening, Creating, EditTextChange, Tuning, StartListChoice check / radio: OnChange table: Selection, OnActivateRow, OnActivateCell, OnActivateField, BeforeAddRow, BeforeDeleteRow, AfterDeleteRow, BeforeRowChange, OnStartEdit, OnEditEnd, BeforeEditEnd, OnChange, ChoiceProcessing, ValueChoice, BeforeExpand, BeforeCollapse, Drag, DragStart, DragCheck, DragEnd; только у таблицы динамического списка — OnGetDataAtServer, URLGetProcessing, BeforeLoadUserSettingsAtServer, OnLoadUserSettingsAtServer, OnSaveUserSettingsAtServer, OnUpdateUserSettingSetAtServer label: Click, URLProcessing labelField: Click, URLProcessing, OnChange picture: Click, Drag, DragCheck picField: Click, OnChange, Drag, DragCheck calendar: OnChange, Selection, OnActivateDate, OnPeriodOutput pages: OnCurrentPageChange spreadsheet: Selection, OnActivate, OnChangeAreaContent, DetailProcessing, AdditionalDetailProcessing html: OnClick, DocumentComplete

У кнопки, страницы, группы колонок, командной панели и подменю событий нет. Click обычной группы и OnHover, OnSelectedRowsSetChange таблицы — только с платформы 8.5.

Поле ввода (input)
КлючОписание
pathПуть к данным: "Объект.Организация", "ИмяРеквизита"
multiLine: trueМногострочное (комментарий)
choiceButton / clearButton / dropListButtonКнопки выбора, очистки, выпадающего списка
markIncomplete: trueПодсвечивать незаполненное
inputHintПодсказка в пустом поле
skipOnInput: trueПропускать при переходе по Enter/Tab
maxWidthПредел ширины

Список выбора, маска, формат, пароль и другие кнопки — references/input-fields.md.

Флажок (check) и переключатель (radio)

check: path, titleLocation (по умолчанию заголовок справа). Вид «выключатель» или «тумблер» — references/input-fields.md.

radio: path, radioButtonType (Auto / RadioButtons / Tumbler), columnsCount, choiceList:

{ "radio": "СпособКурса", "path": "Объект.СпособУстановкиКурса", "radioButtonType": "Tumbler",
  "choiceList": [
    { "value": "Enum.СпособыКурса.EnumValue.Авто",   "presentation": "Автоматически" },
    { "value": "Enum.СпособыКурса.EnumValue.Ручной", "presentation": { "ru": "Вручную", "en": "Manual" } }
  ] }

value — строка, число, булево или значение перечисления "Enum.Тип.EnumValue.Значение"; presentation — текст варианта.

Надпись (label) и поле-надпись (labelField)

label: title — текст (поддерживает разметку, см. references/tooltips-text.md), hyperlink: true — ссылка. labelField: path, hyperlink: true — значение как ссылка.

Группа (group)
КлючОписание
behaviorcollapsible — сворачиваемая, popup — всплывающая; не указан — обычная
showTitle: trueПоказывать заголовок
representationnone / normal / weak / strong — рамка группы
united: falseВыравнивать поля только внутри группы, а не вместе с соседними
childrenВложенные элементы

Свёрнутая при открытии группа, интервалы, заголовок из данных — references/groups-pages.md.

Таблица (table)

Таблица привязывается к реквизиту-таблице (ValueTable, табличная часть объекта, динамический список) — см. «Связка элемент + реквизит».

КлючОписание
pathПуть к реквизиту-таблице
columnsКолонки — элементы (input, check, labelField, picField, columnGroup); путь колонки — путь таблицы плюс имя колонки: Объект.Товары.Сумма, Данные.Сумма
changeRowSet: true / changeRowOrder: trueРазрешить добавлять/удалять / перемещать строки
header: falseБез шапки
heightInTableRowsВысота в строках
commandBarLocationNone / Top / Bottom / Auto
searchStringLocationNone / Top / Bottom / CommandBar / Auto
choiceMode: trueТаблица выбора (форма выбора)

Подвал с итогами, дерево, выделение, закрепление колонок, перетаскивание — references/table-advanced.md.

columnGroup группирует колонки: title, showInHeader, children; inCell — несколько колонок в одной ячейке:

{ "table": "Список", "path": "Список", "columns": [
    { "columnGroup": "horizontal", "name": "ГруппаСрок", "title": "Срок", "children": [
        { "input": "ДатаНачала", "path": "Список.ДатаНачала" },
        { "input": "ДатаОкончания", "path": "Список.ДатаОкончания" } ] },
    { "input": "Комментарий", "path": "Список.Комментарий" }
] }
Страницы (pages + page)

pages: pagesRepresentation (TabsOnTop / TabsOnBottom / None — без закладок), children — массив page. page: title, group (ориентация содержимого), children.

Кнопки и командные панели
Ключ (button)Описание
commandКоманда формы → Form.Command.Имя
stdCommandСтандартная: "Close"; с точкой — команда элемента: "Товары.Add"
defaultButton: trueКнопка по умолчанию
typeusual / hyperlink
representationAuto / Text / Picture / PictureAndText
locationInCommandBarInCommandBar / InAdditionalSubmenu

autoCmdBar — командная панель формы, сюда помещают основные действия:

{ "autoCmdBar": "ФормаКоманднаяПанель", "children": [
    { "button": "Загрузить", "command": "Загрузить", "defaultButton": true },
    { "popup": "Печать", "title": "Печать", "children": [
        { "button": "ПечатьСчета", "command": "ПечатьСчета" } ] },
    { "buttonGroup": "ГруппаПеремещение", "children": [
        { "button": "Вверх", "command": "Вверх" },
        { "button": "Вниз", "command": "Вниз" } ] }
] }
  • popup — подменю: title, children.
  • buttonGroup — кнопки, объединённые в группу: title, children.
  • cmdBar — отдельная панель в раскладке формы: autofill, children.
  • autoCmdBar: autofill: false — без стандартных команд, horizontalAlign — выравнивание.

Картинки кнопок, кнопки-переключатели, команды таблицы в группе кнопок, своё контекстное меню у элемента — references/buttons-commands.md.

Картинка (picture) и поле-картинка (picField)

picture: src — "StdPicture.X" / "CommonPicture.X", width, height. picField: path; для булева или числа — valuesPicture (иначе значок не рисуется). Подробнее — references/pictures.md.

Реквизиты (attributes)
{ "name": "Объект", "type": "DataProcessorObject.Загрузка", "main": true }
{ "name": "Итого", "type": "decimal(15,2)", "title": "Итого" }
{ "name": "Таблица", "type": "ValueTable", "columns": [
    { "name": "Номенклатура", "type": "CatalogRef.Номенклатура" },
    { "name": "Количество", "type": "decimal(10,3)" } ] }
{ "name": "Список", "type": "DynamicList", "main": true,
  "settings": { "mainTable": "Catalog.Номенклатура" } }
  • main: true — основной реквизит формы (объект, набор записей, динамический список)
  • savedData: true — сохраняемые данные (у основного реквизита-объекта ставится само)
  • columns — колонки ValueTable / ValueTree
  • settings — настройки динамического списка (references/dynamic-list.md)

Сохранение в настройках, проверка заполнения, функциональные опции — references/attributes-advanced.md.

Команды (commands) и параметры (parameters)
"commands": [ { "name": "Загрузить", "action": "ЗагрузитьОбработка", "title": "Загрузить", "shortcut": "Ctrl+Enter", "picture": "StdPicture.Refresh" } ]
"parameters": [ { "name": "Основание", "type": "DocumentRef.Заказ" } ]

Команды: name, action (процедура-обработчик), title, shortcut, picture. Параметры: name, type, key: true — ключевой.

Система типов
DSLТип
string / string(100)Строка (неограниченная / длины 100)
decimal(15,2) / decimal(10,0,nonneg)Число / неотрицательное
booleanБулево
date / dateTime / timeДата / дата и время / время
CatalogRef.X / DocumentRef.X / EnumRef.X / …Ссылки
CatalogObject.X / DocumentObject.X / DataProcessorObject.X / ReportObject.XОбъекты (основной реквизит)
InformationRegisterRecordSet.X / AccumulationRegisterRecordSet.XНаборы записей
ValueTable / ValueTree / ValueListТаблица / дерево / список значений
DynamicListДинамический список
TypeDescription, UUID, FormattedString, Picture, Color, Font, DataCompositionSettings, StandardPeriod, mxl:SpreadsheetDocumentПлатформенные
Тип1 | Тип2Составной

Также ChartOfAccountsRef/Object, ChartOfCharacteristicTypesRef/Object, ChartOfCalculationTypesRef/Object, ExchangePlanRef/Object, BusinessProcessRef/Object, TaskRef/Object, AccountingRegisterRecordSet, InformationRegisterRecordManager, ConstantsSet. Наборы типов — references/type-system-advanced.md.

FormDataStructure, FormDataCollection, FormDataTree — не типы реквизита (ошибка при загрузке). Вместо них — объектный тип (DocumentObject.X…), ValueTable, ValueTree.

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

Элемент показывает данные реквизита через path.

Табличная часть основного реквизита — путь Объект.<ТЧ>, колонки — Объект.<ТЧ>.<Реквизит>:

{ "table": "Товары", "path": "Объект.Товары", "columns": [
    { "input": "ТоварыНоменклатура", "path": "Объект.Товары.Номенклатура" },
    { "input": "ТоварыКоличество", "path": "Объект.Товары.Количество" } ] }

Таблица на реквизите формы — реквизит ValueTable с колонками:

{
  "elements": [
    { "table": "Данные", "path": "Данные", "changeRowSet": true, "columns": [
        { "input": "ДанныеДата", "path": "Данные.Дата" },
        { "input": "ДанныеСумма", "path": "Данные.Сумма" } ] }
  ],
  "attributes": [
    { "name": "Данные", "type": "ValueTable", "columns": [
        { "name": "Дата", "type": "date" },
        { "name": "Сумма", "type": "decimal(15,2)" } ] }
  ]
}

Пример: диалог загрузки

{
  "title": "Загрузка из файла",
  "events": { "OnCreateAtServer": "ПриСозданииНаСервере" },
  "elements": [
    { "group": "horizontal", "name": "ГруппаФайл", "children": [
      { "input": "ИмяФайла", "path": "ИмяФайла", "title": "Файл", "inputHint": "Выберите файл...",
        "choiceButton": true, "events": { "StartChoice": "ИмяФайлаНачалоВыбора" } },
      { "check": "ПерваяСтрокаЗаголовок", "path": "ПерваяСтрокаЗаголовок" }
    ]},
    { "input": "Результат", "path": "Результат", "multiLine": true, "height": 8, "readOnly": true, "title": "Лог" },
    { "autoCmdBar": "ФормаКоманднаяПанель", "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" }
  ]
}

Служебные узлы элементов (контекстное меню, расширенная подсказка, панели таблицы) и идентификаторы создаются сами. Неизвестный ключ — предупреждение в выводе.

Задача → справочник

Описанного выше хватает для большинства форм. Под задачу подгрузите файл из references/:

ЗадачаСправочник
Список выбора, быстрый выбор, своя форма выбора, маска, формат числа, пароль, выключатель/тумблер, кнопки открытия и создания, поле составного типаinput-fields.md
Ограничить выбор отбором, связать поле с другим полем, связь по типуchoice-params.md
Свёрнутая группа, интервалы и ширины колонок в группе, заголовок группы или страницы из данных, значок закладки, мастер по шагам (страницы без закладок)groups-pages.md
Итоги в подвале таблицы, дерево, выделение нескольких строк, закрепление колонок, поиск, перетаскивание, убрать стандартные команды таблицыtable-advanced.md
Форма списка: источник данных, запрос, отбор, сортировка, группировка, иерархияdynamic-list.md
Кнопка с картинкой, переключатель в панели, команды таблицы в группе кнопок, своё контекстное меню или панель у поля, команда для текущей строки таблицыbuttons-commands.md
Подсветить цветом, шрифт, рамка, условное оформление (в форме списка — dynamic-list.md)appearance.md
Расширенная подсказка под полем, текст с выделением или ссылкойtooltips-text.md
Картинка, значок в колонке, иконка по значениюpictures.md
Печатная форма или отчёт на форме (табличный документ)spreadsheet.md
HTML, текстовый документ, индикатор, ползунок, календарь, периодspecial-fields.md
Диаграмма, диаграмма Ганта, планировщикcharts.md
Модальность, размер, прокрутка, Enter, свойства формы документа (время, проведение)form-properties.md
Форма отчёта (СКД)report-form.md
Сохранить значение в настройках, проверка заполнения, функциональные опции, тип элементов списка значенийattributes-advanced.md
Видимость и доступ по ролямroles-access.md
Командный интерфейс формы (переходы, важные команды)command-interface.md
Выравнивание, предел размера, фокус по умолчанию, узкие экраныlayout-advanced.md
Наборы и составные типыtype-system-advanced.md

Workflow

  1. Каркас: /form-add создаёт метаданные формы, Module.bsl и регистрирует форму у объекта.
  2. Компиляция: /form-compile наполняет Form.xml; для обработчиков событий и команд, которых ещё нет в модуле, добавляет в Module.bsl пустые процедуры с нужной сигнатурой — остаётся написать тело.
  3. Проверка: /form-validate, /form-info.

Внешние обработки (EPF)

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

Comments

Markdown supported