form-compile

Компиляция управляемой формы 1С из компактного JSON-определения. Используй когда нужно создать форму с нуля по описанию элементов

SKILL.md

GitHub

/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 Скрыть / сделать недоступным / только чтение
titleLocation none / left / right / top / bottom / auto
width / height Размер
horizontalStretch / verticalStretch Растягивать
autoMaxWidth: false Снять предел ширины (поле тянется на всю доступную ширину)
events Обработчики: { "OnChange": "ИмяОбработчика" }; null вместо имени — имя по шаблону <Элемент><Событие>

События

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

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

input: OnChange, StartChoice, ChoiceProcessing, AutoComplete, TextEditEnd, Clearing, Creating, EditTextChange picField: OnChange, StartChoice, ChoiceProcessing, Click, Clearing check / radio: OnChange table: OnStartEdit, OnEditEnd, OnChange, Selection, ValueChoice, BeforeAddRow, BeforeDeleteRow, AfterDeleteRow, BeforeRowChange, BeforeEditEnd, OnActivateRow, OnActivateCell, Drag, DragStart, DragCheck, DragEnd label: Click, URLProcessing picture: Click labelField: OnChange, StartChoice, ChoiceProcessing, Click, URLProcessing, Clearing button: Click pages: OnCurrentPageChange

Поле ввода (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)

Ключ Описание
behavior collapsible — сворачиваемая, popup — всплывающая; не указан — обычная
showTitle: true Показывать заголовок
representation none / 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 Высота в строках
commandBarLocation None / Top / Bottom / Auto
searchStringLocation None / 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 Кнопка по умолчанию
type usual / hyperlink
representation Auto / Text / Picture / PictureAndText
locationInCommandBar InCommandBar / 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.
  3. Проверка: /form-validate, /form-info.

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

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