diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index e140c855..24f26345 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -1,4 +1,4 @@ -# form-compile v1.145 — Compile 1C managed form from JSON or object metadata +# form-compile v1.146 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -2922,7 +2922,7 @@ function Emit-Element { # pages-specific "pagesRepresentation"=1 # button-specific - "type"=1;"command"=1;"commandName"=1;"stdCommand"=1;"defaultButton"=1;"locationInCommandBar"=1;"displayImportance"=1 + "type"=1;"command"=1;"commandName"=1;"stdCommand"=1;"parameter"=1;"defaultButton"=1;"locationInCommandBar"=1;"displayImportance"=1 # picture/decoration "src"=1;"valuesPicture"=1;"loadTransparent"=1;"headerPicture"=1;"footerPicture"=1 # cmdBar-specific @@ -4718,6 +4718,16 @@ function Emit-Button { X "$innerForm.StandardCommand.$sc" } } + # Parameter команды (после CommandName): строка → xr:MDObjectRef (объект метаданных); + # объект {type} → v8:TypeDescription (грамматика типа). Forgiving-синоним 'параметр'. + $btnParam = if ($null -ne $el.PSObject.Properties['parameter']) { $el.parameter } elseif ($null -ne $el.PSObject.Properties['параметр']) { $el.параметр } else { $null } + if ($null -ne $btnParam) { + if (($btnParam -is [System.Management.Automation.PSCustomObject] -or $btnParam -is [hashtable]) -and $btnParam.type) { + Emit-Type -typeStr "$($btnParam.type)" -indent $inner -tag "Parameter" -tagAttrs ' xsi:type="v8:TypeDescription"' + } else { + X "$inner$(Esc-Xml "$btnParam")" + } + } # DataPath — привязка команды кнопки к контексту (Объект.Ref, Items.X.CurrentData.Поле) if ($el.path) { X "$inner$($el.path)" } diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 0b8121df..22be177f 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-compile v1.145 — Compile 1C managed form from JSON or object metadata +# form-compile v1.146 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -2023,7 +2023,7 @@ KNOWN_KEYS = { "commandBarLocation", "searchStringLocation", "viewStatusLocation", "searchControlLocation", "excludedCommands", "pagesRepresentation", - "type", "command", "commandName", "stdCommand", "defaultButton", "locationInCommandBar", "displayImportance", + "type", "command", "commandName", "stdCommand", "parameter", "defaultButton", "locationInCommandBar", "displayImportance", "commandBar", "contextMenu", "commandSource", "src", "valuesPicture", "loadTransparent", "headerPicture", "footerPicture", "autofill", @@ -4440,6 +4440,16 @@ def emit_button(lines, el, name, eid, indent, in_cmd_bar=False): lines.append(f'{inner}Form.Item.{m.group(1)}.StandardCommand.{m.group(2)}') else: lines.append(f'{inner}Form.StandardCommand.{sc}') + # Parameter команды (после CommandName): строка → xr:MDObjectRef (объект метаданных); + # объект {type} → v8:TypeDescription (грамматика типа). Forgiving-синоним 'параметр'. + btn_param = el.get('parameter') + if btn_param is None: + btn_param = el.get('параметр') + if btn_param is not None: + if isinstance(btn_param, dict) and btn_param.get('type'): + emit_type(lines, str(btn_param['type']), inner, tag='Parameter', tag_attrs=' xsi:type="v8:TypeDescription"') + else: + lines.append(f'{inner}{esc_xml(str(btn_param))}') # DataPath — привязка команды кнопки к контексту (Объект.Ref, Items.X.CurrentData.Поле) if el.get('path'): lines.append(f'{inner}{el["path"]}') diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1 index 916d7950..952bb304 100644 --- a/.claude/skills/form-decompile/scripts/form-decompile.ps1 +++ b/.claude/skills/form-decompile/scripts/form-decompile.ps1 @@ -1,4 +1,4 @@ -# form-decompile v0.118 — Decompile 1C managed Form.xml to JSON DSL (draft) +# form-decompile v0.119 — Decompile 1C managed Form.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью. param( @@ -2083,6 +2083,13 @@ function Decompile-Element { else { $obj['commandName'] = $cmd } } $dp = Get-Child $node 'DataPath'; if ($dp) { $obj['path'] = $dp } + # Parameter команды: xr:MDObjectRef (объект метаданных, строка) или v8:TypeDescription (тип → {type}) + $btnParam = $node.SelectSingleNode("lf:Parameter", $ns) + if ($btnParam) { + $pxt = $btnParam.GetAttribute("type", $NS_XSI) + if ($pxt -match 'TypeDescription$') { $pt = Decompile-Type $btnParam; if ($pt) { $obj['parameter'] = [ordered]@{ type = $pt } } } + elseif ($btnParam.InnerText) { $obj['parameter'] = $btnParam.InnerText } + } Add-CommonProps $obj $node $name $type = Get-Child $node 'Type' if ($type) { $tmap=@{'CommandBarButton'='commandBar';'UsualButton'='usual';'Hyperlink'='hyperlink';'CommandBarHyperlink'='hyperlink'}; if ($tmap.ContainsKey($type)) { $obj['type']=$tmap[$type] } else { $obj['type']=$type } } diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index ed6bd6f6..6f61f05f 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -677,6 +677,7 @@ Pages поддерживает `pagesRepresentation`: `None`, `TabsOnTop`, `Tabs | `command` | string | Имя команды формы (→ `Form.Command.`) | | `commandName` | string | Глобальная команда «как есть» (`CommonCommand.X`, `Catalog.X.Command.Y` …) — без обёртки `Form.` | | `stdCommand` | string | Стандартная команда (→ `Form.StandardCommand.`; `X.Y` → `Form.Item.X.StandardCommand.Y`) | +| `parameter` | string/object | Параметр команды (``, после `CommandName`). **Строка** → `xr:MDObjectRef` (объект метаданных, напр. `"DocumentJournal.Взаимодействия"` — для `ShowInList`). **Объект `{ type }`** → `v8:TypeDescription` (грамматика типа, напр. `{ "type": "DocumentRef.Заказ" }` — для `CreateByParameter`). Синоним `параметр` | | `type` | string | `usual`, `hyperlink`, `commandBar` | | `defaultButton` | bool | Кнопка по умолчанию | | `checked` | bool | Пометка (нажатое состояние toggle-кнопки командной панели) → `true`. Платформа эмитит только `true`. Ключ `checked` (не `check` — `check` — тип-ключ ПоляФлажка) | diff --git a/tests/skills/cases/form-compile/commands.json b/tests/skills/cases/form-compile/commands.json index 33de8a62..41deb0d9 100644 --- a/tests/skills/cases/form-compile/commands.json +++ b/tests/skills/cases/form-compile/commands.json @@ -1,6 +1,11 @@ { "name": "Форма с командами и кнопками", "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "Catalog", "name": "Справочник1" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + }, { "script": "meta-compile/scripts/meta-compile", "input": { "type": "DataProcessor", "name": "Команды" }, @@ -19,7 +24,8 @@ "elements": [ { "cmdBar": "Панель", "horizontalLocation": "right", "children": [ { "button": "Выполнить", "command": "Выполнить", "defaultButton": true }, - { "button": "Закрыть", "stdCommand": "Close", "representationInContextMenu": "None" } + { "button": "Закрыть", "stdCommand": "Close", "representationInContextMenu": "None" }, + { "button": "СоздатьПоТипу", "command": "Выполнить", "параметр": { "type": "CatalogRef.Справочник1" } } ]}, { "input": "Результат", "path": "Результат", "multiLine": true, "height": 8, "readOnly": true } ], diff --git a/tests/skills/cases/form-compile/snapshots/commands/Catalogs/Справочник1.xml b/tests/skills/cases/form-compile/snapshots/commands/Catalogs/Справочник1.xml new file mode 100644 index 00000000..b9e26b40 --- /dev/null +++ b/tests/skills/cases/form-compile/snapshots/commands/Catalogs/Справочник1.xml @@ -0,0 +1,327 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Справочник1 + + + ru + Справочник1 + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + Auto + InDialog + false + BothWays + + Catalog.Справочник1.StandardAttribute.Description + Catalog.Справочник1.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Automatic + Use + + + + + + DontUse + Auto + DontUse + false + false + + + + diff --git a/tests/skills/cases/form-compile/snapshots/commands/Catalogs/Справочник1/Ext/ObjectModule.bsl b/tests/skills/cases/form-compile/snapshots/commands/Catalogs/Справочник1/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/form-compile/snapshots/commands/Configuration.xml b/tests/skills/cases/form-compile/snapshots/commands/Configuration.xml index a8d69763..f734c80c 100644 --- a/tests/skills/cases/form-compile/snapshots/commands/Configuration.xml +++ b/tests/skills/cases/form-compile/snapshots/commands/Configuration.xml @@ -246,6 +246,7 @@ Русский + Справочник1 Команды diff --git a/tests/skills/cases/form-compile/snapshots/commands/DataProcessors/Команды/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/commands/DataProcessors/Команды/Forms/Форма/Ext/Form.xml index 92985b09..8695a875 100644 --- a/tests/skills/cases/form-compile/snapshots/commands/DataProcessors/Команды/Forms/Форма/Ext/Form.xml +++ b/tests/skills/cases/form-compile/snapshots/commands/DataProcessors/Команды/Forms/Форма/Ext/Form.xml @@ -39,26 +39,34 @@ None + - + Результат true true false 8 - - + + - + cfg:DataProcessorObject.Команды true - + <v8:item> <v8:lang>ru</v8:lang> @@ -75,7 +83,7 @@ </Attribute> </Attributes> <Commands> - <Command name="Выполнить" id="12"> + <Command name="Выполнить" id="14"> <Title> <v8:item> <v8:lang>ru</v8:lang> @@ -94,7 +102,7 @@ <xr:TransparentPixel x="1" y="1"/> </Picture> </Command> - <Command name="БезЗаголовка" id="13"> + <Command name="БезЗаголовка" id="15"> <Action>БезЗаголовкаОбработка</Action> <Picture> <xr:Ref>StdPicture.Refresh</xr:Ref>