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