diff --git a/.claude/skills/meta-compile/reference/blocks.md b/.claude/skills/meta-compile/reference/blocks.md index 86bd7078..5b4d9e14 100644 --- a/.claude/skills/meta-compile/reference/blocks.md +++ b/.claude/skills/meta-compile/reference/blocks.md @@ -31,8 +31,8 @@ BusinessProcess, Task и др.). | `synonym` | из имени | ML | | `tooltip` | пусто | ML | | `comment` | пусто | строка | -| `group` | пусто | группа команд (`FormCommandBarImportant`, `FormNavigationPanelGoTo`, …) | -| `commandParameterType` | пусто | тип параметра (напр. `CatalogRef.Номенклатура`) | +| `group` | **обязательно** | группа размещения (см. ниже) | +| `commandParameterType` | пусто | тип параметра (напр. `CatalogRef.Номенклатура`) — **только для групп формы** | | `parameterUseMode` | `Single` | `Single` / `Multiple` | | `modifiesData` | `false` | bool | | `representation` | `Auto` | вид отображения | @@ -46,6 +46,16 @@ BusinessProcess, Task и др.). } ``` +**Группа (`group`) обязательна** — каждая команда размещается в группе командного интерфейса: + +- **Секционные** (панель раздела; `commandParameterType` **недоступен**): `NavigationPanelImportant` / + `NavigationPanelOrdinary` / `NavigationPanelSeeAlso`, `ActionsPanelCreate` / `ActionsPanelReports` / `ActionsPanelTools`. +- **Формы** (`commandParameterType` допустим): `FormCommandBarImportant` / `FormCommandBarCreateBasedOn`, + `FormNavigationPanelImportant` / `FormNavigationPanelGoTo` / `FormNavigationPanelSeeAlso`. +- **Кастомная группа:** `CommandGroup.<Имя>` (параметр допустим). + +Секционная группа вместе с `commandParameterType` → ошибка. + ## `inputByString` / `dataLockFields` / `basedOn` Списки полей/объектов уровня объекта. Поля — по имени реквизита объекта (обычного или стандартного). diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 6e8a3b52..3c9237a7 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -1,4 +1,4 @@ -# meta-compile v1.63 — Compile 1C metadata object from JSON +# meta-compile v1.64 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -267,6 +267,46 @@ $script:validEnumValues = @{ "FullTextSearchOnInputByString" = @("Use","DontUse") } +# --- Группы команд объекта (командный интерфейс) --- +# Секционные группы (панель раздела): команда БЕЗ параметра. Групповые формы: параметр доступен. +$script:sectionCommandGroups = @( + "NavigationPanelImportant","NavigationPanelOrdinary","NavigationPanelSeeAlso", + "ActionsPanelCreate","ActionsPanelReports","ActionsPanelTools" +) +$script:formCommandGroups = @( + "FormCommandBarImportant","FormCommandBarCreateBasedOn", + "FormNavigationPanelImportant","FormNavigationPanelGoTo","FormNavigationPanelSeeAlso" +) +$script:validCommandGroups = $script:sectionCommandGroups + $script:formCommandGroups +# Прощающий ввод: русские подписи групп → канон +$script:commandGroupAliases = @{ + "Панель навигации.Важное" = "NavigationPanelImportant" + "Панель навигации.Обычное" = "NavigationPanelOrdinary" + "Панель навигации.См. также" = "NavigationPanelSeeAlso" + "Панель действий.Создать" = "ActionsPanelCreate" + "Панель действий.Отчеты" = "ActionsPanelReports" + "Панель действий.Отчёты" = "ActionsPanelReports" + "Панель действий.Сервис" = "ActionsPanelTools" + "Командная панель формы.Важное" = "FormCommandBarImportant" + "Командная панель формы.Создать на основании" = "FormCommandBarCreateBasedOn" + "Панель навигации формы.Важное" = "FormNavigationPanelImportant" + "Панель навигации формы.Перейти" = "FormNavigationPanelGoTo" + "Панель навигации формы.См. также" = "FormNavigationPanelSeeAlso" +} + +# Резолв группы команды: рус-синоним → канон; ГруппаКоманд.X → CommandGroup.X; пусто → ошибка с подсказкой. +function Resolve-CommandGroup { + param([string]$raw, [string]$cmdName) + $g = "$raw".Trim() + if (-not $g) { + Write-Error "Команде '$cmdName' не задана группа (group). 1С требует группу. Валидные: $($script:validCommandGroups -join ', '); либо CommandGroup.<Имя> — кастомная группа." + exit 1 + } + if ($script:commandGroupAliases.ContainsKey($g)) { return $script:commandGroupAliases[$g] } + if ($g -match '^(?:CommandGroup|ГруппаКоманд)\.(.+)$') { return "CommandGroup.$($Matches[1])" } + return $g +} + function Normalize-EnumValue { param([string]$propName, [string]$value) # 1. Check alias dictionary — silent auto-correct @@ -1918,8 +1958,12 @@ function Emit-Command { $syn = if ($null -ne $cmd.synonym) { $cmd.synonym } else { Split-CamelCase $cmdName } Emit-MLText "$indent`t`t" "Synonym" $syn if ($cmd.comment) { X "$indent`t`t$(Esc-XmlText "$($cmd.comment)")" } else { X "$indent`t`t" } - $group = if ($cmd.group) { "$($cmd.group)" } else { "" } - X "$indent`t`t$group" + $group = Resolve-CommandGroup $cmd.group $cmdName + if ($cmd.commandParameterType -and ($script:sectionCommandGroups -contains $group)) { + Write-Error "Команда '$cmdName': тип параметра (commandParameterType) недоступен для команд секционной панели ('$group'). Тип параметра — только для групп формы (FormCommandBar*/FormNavigationPanel*) или CommandGroup.<Имя>." + exit 1 + } + X "$indent`t`t$(Esc-Xml $group)" if ($cmd.commandParameterType) { X "$indent`t`t" Emit-TypeContent "$indent`t`t`t" "$($cmd.commandParameterType)" diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index e7c9c0bd..3c1ab8bd 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-compile v1.63 — Compile 1C metadata object from JSON +# meta-compile v1.64 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -412,6 +412,46 @@ valid_enum_values = { 'FullTextSearchOnInputByString': ['Use', 'DontUse'], } +# --- Группы команд объекта (командный интерфейс) --- +# Секционные группы (панель раздела): команда БЕЗ параметра. Групповые формы: параметр доступен. +SECTION_COMMAND_GROUPS = [ + 'NavigationPanelImportant', 'NavigationPanelOrdinary', 'NavigationPanelSeeAlso', + 'ActionsPanelCreate', 'ActionsPanelReports', 'ActionsPanelTools', +] +FORM_COMMAND_GROUPS = [ + 'FormCommandBarImportant', 'FormCommandBarCreateBasedOn', + 'FormNavigationPanelImportant', 'FormNavigationPanelGoTo', 'FormNavigationPanelSeeAlso', +] +VALID_COMMAND_GROUPS = SECTION_COMMAND_GROUPS + FORM_COMMAND_GROUPS +COMMAND_GROUP_ALIASES = { + 'Панель навигации.Важное': 'NavigationPanelImportant', + 'Панель навигации.Обычное': 'NavigationPanelOrdinary', + 'Панель навигации.См. также': 'NavigationPanelSeeAlso', + 'Панель действий.Создать': 'ActionsPanelCreate', + 'Панель действий.Отчеты': 'ActionsPanelReports', + 'Панель действий.Отчёты': 'ActionsPanelReports', + 'Панель действий.Сервис': 'ActionsPanelTools', + 'Командная панель формы.Важное': 'FormCommandBarImportant', + 'Командная панель формы.Создать на основании': 'FormCommandBarCreateBasedOn', + 'Панель навигации формы.Важное': 'FormNavigationPanelImportant', + 'Панель навигации формы.Перейти': 'FormNavigationPanelGoTo', + 'Панель навигации формы.См. также': 'FormNavigationPanelSeeAlso', +} + + +def resolve_command_group(raw, cmd_name): + g = (str(raw) if raw is not None else '').strip() + if not g: + sys.stderr.write(f"Команде '{cmd_name}' не задана группа (group). 1С требует группу. " + f"Валидные: {', '.join(VALID_COMMAND_GROUPS)}; либо CommandGroup.<Имя> — кастомная группа.\n") + sys.exit(1) + if g in COMMAND_GROUP_ALIASES: + return COMMAND_GROUP_ALIASES[g] + m = re.match(r'^(?:CommandGroup|ГруппаКоманд)\.(.+)$', g) + if m: + return f'CommandGroup.{m.group(1)}' + return g + def normalize_enum_value(prop_name, value): # 1. Check alias dictionary — silent auto-correct if value in enum_value_aliases: @@ -1989,7 +2029,13 @@ def emit_command(indent, cmd_name, cmd): X(f'{indent}\t\t{esc_xml_text(str(cmd["comment"]))}') else: X(f'{indent}\t\t') - X(f'{indent}\t\t{cmd.get("group") or ""}') + group = resolve_command_group(cmd.get('group'), cmd_name) + if cmd.get('commandParameterType') and group in SECTION_COMMAND_GROUPS: + sys.stderr.write(f"Команда '{cmd_name}': тип параметра (commandParameterType) недоступен для команд " + f"секционной панели ('{group}'). Тип параметра — только для групп формы " + f"(FormCommandBar*/FormNavigationPanel*) или CommandGroup.<Имя>.\n") + sys.exit(1) + X(f'{indent}\t\t{esc_xml(group)}') if cmd.get('commandParameterType'): X(f'{indent}\t\t') emit_type_content(f'{indent}\t\t\t', str(cmd['commandParameterType'])) diff --git a/tests/skills/cases/meta-compile/catalog-command-groups.json b/tests/skills/cases/meta-compile/catalog-command-groups.json new file mode 100644 index 00000000..968669e4 --- /dev/null +++ b/tests/skills/cases/meta-compile/catalog-command-groups.json @@ -0,0 +1,22 @@ +{ + "name": "Команды: группы (рус-синонимы, секционные, форма, кастомная)", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "CommandGroup", "name": "МояГруппа" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + } + ], + "input": { + "type": "Catalog", "name": "ТестГруппКоманд", "useStandardCommands": true, + "commands": { + "НавВажное": { "synonym": "Навигация важное", "group": "Панель навигации.Важное" }, + "ДействияСервис": { "synonym": "Сервис", "group": "ActionsPanelTools" }, + "ФормаВажное": { "synonym": "Форма важное", "group": "Командная панель формы.Важное", + "commandParameterType": "CatalogRef.ТестГруппКоманд" }, + "Кастом": { "synonym": "Кастомная", "group": "ГруппаКоманд.МояГруппа" } + } + }, + "validatePath": "Catalogs/ТестГруппКоманд", + "expect": { "files": ["Catalogs/ТестГруппКоманд.xml"] } +} diff --git a/tests/skills/cases/meta-compile/error-command-nav-param.json b/tests/skills/cases/meta-compile/error-command-nav-param.json new file mode 100644 index 00000000..c89c423a --- /dev/null +++ b/tests/skills/cases/meta-compile/error-command-nav-param.json @@ -0,0 +1,8 @@ +{ + "name": "Ошибка: секционная группа + commandParameterType (несовместимо)", + "input": { + "type": "Catalog", "name": "ТестНавПараметр", + "commands": { "Команда": { "group": "NavigationPanelOrdinary", "commandParameterType": "CatalogRef.ТестНавПараметр" } } + }, + "expectError": "недоступен" +} diff --git a/tests/skills/cases/meta-compile/error-command-no-group.json b/tests/skills/cases/meta-compile/error-command-no-group.json new file mode 100644 index 00000000..d53b3cf0 --- /dev/null +++ b/tests/skills/cases/meta-compile/error-command-no-group.json @@ -0,0 +1,8 @@ +{ + "name": "Ошибка: команда без группы", + "input": { + "type": "Catalog", "name": "ТестБезГруппы", + "commands": { "Команда": { "synonym": "Команда" } } + }, + "expectError": "не задана группа" +} diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд.xml b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд.xml new file mode 100644 index 00000000..b3de0eb5 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд.xml @@ -0,0 +1,178 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + ТестГруппКоманд + + + ru + Тест групп команд + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.ТестГруппКоманд.StandardAttribute.Description + Catalog.ТестГруппКоманд.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + + НавВажное + + + ru + Навигация важное + + + + NavigationPanelImportant + + Single + false + Auto + + + + Auto + + + + + ДействияСервис + + + ru + Сервис + + + + ActionsPanelTools + + Single + false + Auto + + + + Auto + + + + + ФормаВажное + + + ru + Форма важное + + + + FormCommandBarImportant + + d5p1:CatalogRef.ТестГруппКоманд + + Single + false + Auto + + + + Auto + + + + + Кастом + + + ru + Кастомная + + + + CommandGroup.МояГруппа + + Single + false + Auto + + + + Auto + + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/ДействияСервис/Ext/CommandModule.bsl b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/ДействияСервис/Ext/CommandModule.bsl new file mode 100644 index 00000000..d7ec0aeb --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/ДействияСервис/Ext/CommandModule.bsl @@ -0,0 +1,6 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + // Вставьте обработчик команды. + +КонецПроцедуры diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/Кастом/Ext/CommandModule.bsl b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/Кастом/Ext/CommandModule.bsl new file mode 100644 index 00000000..d7ec0aeb --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/Кастом/Ext/CommandModule.bsl @@ -0,0 +1,6 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + // Вставьте обработчик команды. + +КонецПроцедуры diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/НавВажное/Ext/CommandModule.bsl b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/НавВажное/Ext/CommandModule.bsl new file mode 100644 index 00000000..d7ec0aeb --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/НавВажное/Ext/CommandModule.bsl @@ -0,0 +1,6 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + // Вставьте обработчик команды. + +КонецПроцедуры diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/ФормаВажное/Ext/CommandModule.bsl b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/ФормаВажное/Ext/CommandModule.bsl new file mode 100644 index 00000000..d7ec0aeb --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Commands/ФормаВажное/Ext/CommandModule.bsl @@ -0,0 +1,6 @@ +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + // Вставьте обработчик команды. + +КонецПроцедуры diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Catalogs/ТестГруппКоманд/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/CommandGroups/МояГруппа.xml b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/CommandGroups/МояГруппа.xml new file mode 100644 index 00000000..1d91ab4e --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/CommandGroups/МояГруппа.xml @@ -0,0 +1,19 @@ + + + + + МояГруппа + + + ru + Моя группа + + + + Auto + + + NavigationPanel + + + diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Configuration.xml new file mode 100644 index 00000000..40987220 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Configuration.xml @@ -0,0 +1,253 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + МояГруппа + ТестГруппКоманд + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/catalog-command-groups/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file