mcpField
F
form-compile

form-compile

github.com/nikolay-shirokov开发74152 次安装今天更新
代码仓库

关于 form-compile

form-compile 是为 1C 开发者生成 Form.xml 的命令行技能,支持从 JSON DSL 编译表单,或依据对象元数据和 ERP 预设生成表单。

主要功能

  1. 01从 JSON DSL 生成 Form.xml
  2. 02依据对象元数据生成表单
  3. 03支持表单及元素事件配置
  4. 04定义输入框、表格和页面
  5. 05配置命令、按钮及属性
  6. 06设置动态列表属性

适用场景

  1. 01从 JSON 定义编译表单
  2. 02依据 Document 或 Catalog 对象生成表单
  3. 03为表单配置控件和事件
  4. 04生成包含表格与命令栏的界面

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/form-compile确认已加载。

包含的文件

除 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

README 原文English

来自项目 README

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)

评论

支持 Markdown