Cc-1c-skills form-compile
Компиляция управляемой формы 1С из JSON-определения или из метаданных объекта. Используй когда нужно создать форму с нуля по описанию элементов или сгенерировать типовую форму
git clone https://github.com/Nikolay-Shirokov/cc-1c-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/Nikolay-Shirokov/cc-1c-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/form-compile" ~/.claude/skills/nikolay-shirokov-cc-1c-skills-form-compile && rm -rf "$T"
.claude/skills/form-compile/SKILL.md/form-compile — Генерация Form.xml
Два режима:
- JSON DSL — из JSON-определения формы
- From object (
) — автоматически из метаданных объекта 1С по пресету ERP-FromObject
При проектировании формы с нуля (5+ элементов или нечёткие требования) — вызовите
для загрузки справочника. Для простых форм (1–3 поля) — не нужно./form-patterns
Параметры
| Параметр | Обязательный | Описание |
|---|---|---|
| JsonPath | режим 1 | Путь к JSON-определению формы |
| OutputPath | да | Путь к выходному Form.xml |
| FromObject | режим 2 | Флаг (без значения) — генерация по метаданным объекта |
Команда
# Режим JSON DSL powershell.exe -NoProfile -File .claude/skills/form-compile/scripts/form-compile.ps1 -JsonPath "<json>" -OutputPath "<Form.xml>" # Режим from-object (объект и purpose выводятся из OutputPath; Document и Catalog) powershell.exe -NoProfile -File .claude/skills/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": [ ... ] }
— заголовок формы (multilingual). Можно указать и вtitle
, но лучше на верхнем уровнеproperties
— свойства формы:properties
,autoTitle
,windowOpeningMode
,commandBarLocation
,saveDataInSettings
,width
и др.height
— обработчики событий формы (ключ: имя события 1С, значение: имя процедуры)events
— исключённые стандартные командыexcludedCommands
Элементы (ключ определяет тип)
| DSL ключ | XML элемент | Значение ключа |
|---|---|---|
| UsualGroup | / / / / |
| InputField | имя элемента |
| CheckBoxField | имя |
| LabelDecoration | имя (текст задаётся через ) |
| LabelField | имя |
| Table | имя |
| Pages | имя |
| Page | имя |
| Button | имя |
| PictureDecoration | имя |
| PictureField | имя |
| CalendarField | имя |
| CommandBar | имя |
| Popup | имя |
Общие свойства (все типы элементов)
| Ключ | Описание |
|---|---|
| Переопределить имя (по умолчанию = значение ключа типа) |
| Заголовок элемента |
| Скрыть (синоним: ) |
| Сделать недоступным (синоним: ) |
| Только чтение |
| События с автоименованием обработчиков |
| Явное задание имён обработчиков: |
Допустимые имена событий (on
)
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)
| Ключ | Описание | Пример |
|---|---|---|
| DataPath — привязка к данным | |
| Размещение заголовка | , , |
| Многострочное поле | текстовое поле, комментарий |
| Режим пароля (звёздочки) | поле ввода пароля |
| Кнопка выбора ("...") | ссылочное поле |
| Кнопка очистки ("X") | |
| Кнопка прокрутки | числовые поля |
| Кнопка выпадающего списка | |
| Пометка незаполненного | обязательные поля |
| Пропускать при обходе Tab | |
| Подсказка в пустом поле | |
/ | Размер | числа |
| Отключить авто-ширину | для фиксированных полей |
| Растягивать по ширине |
Чекбокс (check)
| Ключ | Описание |
|---|---|
| DataPath |
| Размещение заголовка |
Надпись-декорация (label)
| Ключ | Описание |
|---|---|
| Текст надписи (обязательно) |
| Сделать ссылкой |
/ | Размер |
Группа (group)
Значение ключа задаёт ориентацию:
"horizontal", "vertical", "alwaysHorizontal", "alwaysVertical", "collapsible".
| Ключ | Описание |
|---|---|
| Показывать заголовок группы |
| Не объединять рамку |
| , , , |
| Вложенные элементы |
Таблица (table)
Важно: таблица требует связанный реквизит формы типа
ValueTable с колонками (см. раздел "Связки").
| Ключ | Описание |
|---|---|
| DataPath (привязка к реквизиту-таблице) |
| Колонки — массив элементов (обычно ) |
| Разрешить добавление/удаление строк |
| Разрешить перемещение строк |
| Высота в строках таблицы |
| Скрыть шапку |
| Показать подвал |
| , , |
| , , |
| Режим выбора (для форм выбора) |
| и др. (иерархические списки) |
| Разрешить перетаскивание |
| Разрешить начало перетаскивания |
| Путь к картинке строки (напр. ) |
| Управление Autofill внутреннего AutoCommandBar |
Страницы (pages + page)
| Ключ (pages) | Описание |
|---|---|
| , , и др. |
| Массив |
| Ключ (page) | Описание |
|---|---|
| Заголовок вкладки |
| Ориентация внутри страницы |
| Содержимое страницы |
Кнопка (button)
| Ключ | Описание |
|---|---|
| Имя команды формы → |
| Стандартная команда: → ; с точкой: → |
| Кнопка по умолчанию |
| , , |
| Картинка кнопки |
| , , , |
| , , |
Командная панель (cmdBar)
| Ключ | Описание |
|---|---|
| Автозаполнение стандартными командами |
| Кнопки панели |
Выпадающее меню (popup)
| Ключ | Описание |
|---|---|
| Заголовок подменю |
| Кнопки подменю |
Используется внутри
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
Команды (commands)
{ "name": "Загрузить", "action": "ЗагрузитьОбработка", "shortcut": "Ctrl+Enter" }
— заголовок (если отличается от name)title
— картинка командыpicture
Система типов
Примитивные:
| DSL | XML |
|---|---|
/ | + StringQualifiers |
| + NumberQualifiers |
| с AllowedSign=Nonnegative |
| |
/ / | + DateFractions |
Ссылочные и объектные (
):cfg:Prefix.Name
| DSL | Описание |
|---|---|
/ | Справочник |
/ | Документ |
| Перечисление |
/ | Обработка / Отчёт |
| Набор записей регистра сведений |
| Набор записей регистра накопления |
| Динамический список |
Также допустимы:
ChartOfAccountsRef/Object, ChartOfCharacteristicTypesRef/Object, ChartOfCalculationTypesRef/Object, ExchangePlanRef/Object, BusinessProcessRef/Object, TaskRef/Object, AccountingRegisterRecordSet, InformationRegisterRecordManager, ConstantsSet.
Платформенные:
| DSL | XML |
|---|---|
| |
| |
| |
| |
| |
| |
/ / | |
| |
| составной тип (несколько ) |
Недопустимые типы (XDTO-ошибка при загрузке):
,FormDataStructure,FormDataCollection— runtime-типы 1С, не существуют в XML-схеме. Вместо них используйтеFormDataTree,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
- Компиляция:
генерирует/form-compile
и автоматически регистрируетForm.xml
в<Form>
родительского объекта (если OutputPath следует конвенцииChildObjects
)..../TypePlural/ObjectName/Forms/FormName/Ext/Form.xml - Метаданные формы (
) иФормаСписка.xml
создаётModule.bsl
. Если/form-add
ещё не вызывался — вызови после/form-add
. Он не перезаписывает существующий Form.xml./form-compile - Проверка:
,/form-validate
./form-info
Верификация
/form-validate <OutputPath> — проверка корректности XML /form-info <OutputPath> — визуальная сводка структуры
Особенности для внешних обработок (EPF)
- Тип главного реквизита:
(неExternalDataProcessorObject.ИмяОбработки
)DataProcessorObject - DataPath: используйте реквизиты формы (
), а неИмяРеквизита
— у внешних обработок нет реквизитов объекта в метаданныхОбъект.ИмяРеквизита - Ссылочные типы:
,CatalogRef.XXX
допустимы в XML, но для сборки EPF потребуется база с целевой конфигурацией (см.DocumentRef.XXX
)/epf-build