From 3c3ed2ff463790e5dfa8d96fa7d27064569a40f7 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 1 May 2026 16:43:39 +0300 Subject: [PATCH] =?UTF-8?q?feat(cf-init):=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20Ext/ClientApplicationInterface.xml=20?= =?UTF-8?q?=D1=81=20ERP-=D0=B4=D0=B5=D1=84=D0=BE=D0=BB=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Без этого файла веб-клиент 1С рендерит секции icon-only (без подписей), а web-test их не видит. Дефолтная раскладка как в типовых ERP/БП ≥ 8.3.24: панель открытых сверху, панель разделов слева; функций/избранного/истории объявлены через panelDef но не размещены. Расширил docs/1c-configuration-spec.md § 4.2 моделью раскладки и таблицей UUID 5 платформенных панелей. Обновил снапшоты cf-init под новый файл. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/cf-init/scripts/cf-init.ps1 | 36 ++++++++++++++- .claude/skills/cf-init/scripts/cf-init.py | 32 ++++++++++++- docs/1c-configuration-spec.md | 46 ++++++++++++++++--- tests/skills/cases/cf-init/basic.json | 12 +++-- tests/skills/cases/cf-init/minimal.json | 12 +++-- .../basic/Ext/ClientApplicationInterface.xml | 18 ++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++++++++ .../cases/cf-init/with-compat-mode.json | 17 +++++-- tests/skills/cases/cf-init/with-synonym.json | 17 +++++-- tests/skills/cases/cf-init/with-vendor.json | 19 ++++++-- 13 files changed, 254 insertions(+), 27 deletions(-) create mode 100644 tests/skills/cases/cf-init/snapshots/basic/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/cf-init/snapshots/minimal/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/cf-init/snapshots/with-compat-mode/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/cf-init/snapshots/with-synonym/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/cf-init/snapshots/with-vendor/Ext/ClientApplicationInterface.xml diff --git a/.claude/skills/cf-init/scripts/cf-init.ps1 b/.claude/skills/cf-init/scripts/cf-init.ps1 index 2709039d..69603dca 100644 --- a/.claude/skills/cf-init/scripts/cf-init.ps1 +++ b/.claude/skills/cf-init/scripts/cf-init.ps1 @@ -1,4 +1,4 @@ -# cf-init v1.1 — Create empty 1C configuration scaffold +# cf-init v1.2 — Create empty 1C configuration scaffold # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -192,6 +192,33 @@ $langXml = @" "@ +# --- Ext/ClientApplicationInterface.xml (default ERP-style panel layout) --- +# Open panel on top, Sections panel on left; Functions/Favorites/History declared +# via panelDef but not placed by default. Without this file the web client renders +# section icons without labels (icon-only mode). +$openPanelInst = [guid]::NewGuid().ToString() +$sectionsPanelInst = [guid]::NewGuid().ToString() +$caiXml = @" + + + + + cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 + + + + + b553047f-c9aa-4157-978d-448ecad24248 + + + + + + + + +"@ + # --- Create directories --- if (-not (Test-Path $OutputDir)) { New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null @@ -200,6 +227,10 @@ $langDir = Join-Path $OutputDir "Languages" if (-not (Test-Path $langDir)) { New-Item -ItemType Directory -Path $langDir -Force | Out-Null } +$extDir = Join-Path $OutputDir "Ext" +if (-not (Test-Path $extDir)) { + New-Item -ItemType Directory -Path $extDir -Force | Out-Null +} # --- Write files with UTF-8 BOM --- $enc = New-Object System.Text.UTF8Encoding($true) @@ -207,9 +238,12 @@ $enc = New-Object System.Text.UTF8Encoding($true) [System.IO.File]::WriteAllText($cfgFile, $cfgXml, $enc) $langFile = Join-Path $langDir "Русский.xml" [System.IO.File]::WriteAllText($langFile, $langXml, $enc) +$caiFile = Join-Path $extDir "ClientApplicationInterface.xml" +[System.IO.File]::WriteAllText($caiFile, $caiXml, $enc) # --- Output --- Write-Host "[OK] Создана конфигурация: $Name" Write-Host " Каталог: $OutputDir" Write-Host " Configuration.xml: $cfgFile" Write-Host " Languages: $langFile" +Write-Host " Ext/CAI: $caiFile" diff --git a/.claude/skills/cf-init/scripts/cf-init.py b/.claude/skills/cf-init/scripts/cf-init.py index c66630b1..d9339251 100644 --- a/.claude/skills/cf-init/scripts/cf-init.py +++ b/.claude/skills/cf-init/scripts/cf-init.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cf-init v1.1 — Create empty 1C configuration scaffold +# cf-init v1.2 — Create empty 1C configuration scaffold # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Generates minimal XML source files for a 1C configuration.""" import sys, os, argparse, uuid @@ -184,20 +184,50 @@ def main(): \t ''' + # --- Ext/ClientApplicationInterface.xml (default ERP-style panel layout) --- + # Open panel on top, Sections panel on left; Functions/Favorites/History declared + # via panelDef but not placed by default. Without this file the web client renders + # section icons without labels (icon-only mode). + open_panel_inst = new_uuid() + sections_panel_inst = new_uuid() + cai_xml = f''' + +\t +\t\t +\t\t\tcbab57f2-a0f3-4f0a-89ea-4cb19570ab75 +\t\t +\t +\t +\t\t +\t\t\tb553047f-c9aa-4157-978d-448ecad24248 +\t\t +\t +\t +\t +\t +\t +\t +''' + # --- Create directories --- os.makedirs(output_dir, exist_ok=True) lang_dir = os.path.join(output_dir, "Languages") os.makedirs(lang_dir, exist_ok=True) + ext_dir = os.path.join(output_dir, "Ext") + os.makedirs(ext_dir, exist_ok=True) # --- Write files --- write_utf8_bom(cfg_file, cfg_xml) lang_file = os.path.join(lang_dir, "Русский.xml") write_utf8_bom(lang_file, lang_xml) + cai_file = os.path.join(ext_dir, "ClientApplicationInterface.xml") + write_utf8_bom(cai_file, cai_xml) print(f"[OK] Создана конфигурация: {name}") print(f" Каталог: {output_dir}") print(f" Configuration.xml: {cfg_file}") print(f" Languages: {lang_file}") + print(f" Ext/CAI: {cai_file}") if __name__ == '__main__': main() diff --git a/docs/1c-configuration-spec.md b/docs/1c-configuration-spec.md index d62eeb5e..aee9250f 100644 --- a/docs/1c-configuration-spec.md +++ b/docs/1c-configuration-spec.md @@ -381,20 +381,52 @@ ClassId — фиксированные идентификаторы классо Подробнее: [1c-subsystem-spec.md § 4](1c-subsystem-spec.md#4-формат-командного-интерфейса-commandinterfacexml). -**ClientApplicationInterface.xml** — расположение панелей (top/left/bottom/right): +**ClientApplicationInterface.xml** — расположение панелей рабочего пространства Taxi. + +Структура: четыре стороны (`top`, `left`, `right`, `bottom`), внутри каждой произвольная комбинация `` и ``. Список объявленных панелей — `` на верхнем уровне. ```xml - + - - ... - ... - + cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 - ... + + b553047f-c9aa-4157-978d-448ecad24248 + + + + 13322b22-... + c933ac92-... + + + + + + + ``` +**UUID платформенных панелей** (фиксированные константы во всех конфигурациях): + +| UUID | Панель | +|------|--------| +| `cbab57f2-a0f3-4f0a-89ea-4cb19570ab75` | Панель открытых | +| `b553047f-c9aa-4157-978d-448ecad24248` | Панель разделов | +| `13322b22-3960-4d68-93a6-fe2dd7f28ca3` | Панель избранного | +| `c933ac92-92cd-459d-81cc-e0c8a83ced99` | Панель истории | +| `b2735bd3-d822-4430-ba59-c9e869693b24` | Панель функций текущего раздела | + +**Семантика контейнеров:** +- Несколько прямых child-узлов внутри ``/``/``/`` располагаются **рядом** друг с другом (отдельные слоты на стороне). +- `` — контейнер-«ячейка»: вложенные ``/`` располагаются **друг под другом** (стек). +- Атрибут `id` у `` и `` — произвольный uuid экземпляра (Конфигуратор генерирует свой при сохранении). Привязка к платформенной панели — только через `` внутри ``. +- `` объявляет, что панель доступна пользователю. Если панель не размещена в `top/left/right/bottom`, она остаётся скрытой, но доступна через «Вид → Настройка панелей». + +**Дефолтная раскладка** (как в типовых ERP/БП ≥ 8.3.24): «Панель открытых» в `top`, «Панель разделов» в `left`; «Функций», «Избранного», «История» — только в `panelDef`, по умолчанию не размещены. + +> Замечание: в типовых конфигурациях встречается также `` — наследие от старых версий платформы. В новых конфигурациях с нуля Конфигуратор её не создаёт; не закладывайте на неё логику. + ### 4.3. Начальная страница | Файл | Описание | diff --git a/tests/skills/cases/cf-init/basic.json b/tests/skills/cases/cf-init/basic.json index bfc9218c..c2a18c01 100644 --- a/tests/skills/cases/cf-init/basic.json +++ b/tests/skills/cases/cf-init/basic.json @@ -1,7 +1,13 @@ { "name": "Пустая конфигурация", - "params": { "name": "ТестоваяКонфигурация" }, + "params": { + "name": "ТестоваяКонфигурация" + }, "expect": { - "files": ["Configuration.xml", "Languages/Русский.xml"] + "files": [ + "Configuration.xml", + "Languages/Русский.xml", + "Ext/ClientApplicationInterface.xml" + ] } -} +} \ No newline at end of file diff --git a/tests/skills/cases/cf-init/minimal.json b/tests/skills/cases/cf-init/minimal.json index e8ee2ee3..18f2cd28 100644 --- a/tests/skills/cases/cf-init/minimal.json +++ b/tests/skills/cases/cf-init/minimal.json @@ -1,7 +1,13 @@ { "name": "Минимальная конфигурация (только имя)", - "params": { "name": "МинКонф" }, + "params": { + "name": "МинКонф" + }, "expect": { - "files": ["Configuration.xml", "Languages/Русский.xml"] + "files": [ + "Configuration.xml", + "Languages/Русский.xml", + "Ext/ClientApplicationInterface.xml" + ] } -} +} \ No newline at end of file diff --git a/tests/skills/cases/cf-init/snapshots/basic/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cf-init/snapshots/basic/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cf-init/snapshots/basic/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-init/snapshots/minimal/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cf-init/snapshots/minimal/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cf-init/snapshots/minimal/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-init/snapshots/with-compat-mode/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cf-init/snapshots/with-compat-mode/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cf-init/snapshots/with-compat-mode/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-init/snapshots/with-synonym/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cf-init/snapshots/with-synonym/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cf-init/snapshots/with-synonym/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-init/snapshots/with-vendor/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cf-init/snapshots/with-vendor/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/cf-init/snapshots/with-vendor/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/cf-init/with-compat-mode.json b/tests/skills/cases/cf-init/with-compat-mode.json index 815daa99..62dfa0a1 100644 --- a/tests/skills/cases/cf-init/with-compat-mode.json +++ b/tests/skills/cases/cf-init/with-compat-mode.json @@ -1,8 +1,17 @@ { "name": "Конфигурация с CompatibilityMode", - "params": { "name": "ТестСовместимость" }, - "args_extra": ["-CompatibilityMode", "Version8_3_17"], + "params": { + "name": "ТестСовместимость" + }, + "args_extra": [ + "-CompatibilityMode", + "Version8_3_17" + ], "expect": { - "files": ["Configuration.xml", "Languages/Русский.xml"] + "files": [ + "Configuration.xml", + "Languages/Русский.xml", + "Ext/ClientApplicationInterface.xml" + ] } -} +} \ No newline at end of file diff --git a/tests/skills/cases/cf-init/with-synonym.json b/tests/skills/cases/cf-init/with-synonym.json index 4c0853f9..72591060 100644 --- a/tests/skills/cases/cf-init/with-synonym.json +++ b/tests/skills/cases/cf-init/with-synonym.json @@ -1,9 +1,18 @@ { "name": "Конфигурация с синонимом", - "params": { "name": "ТестСиноним" }, - "args_extra": ["-Synonym", "Тестовый синоним конфигурации"], + "params": { + "name": "ТестСиноним" + }, + "args_extra": [ + "-Synonym", + "Тестовый синоним конфигурации" + ], "expect": { - "files": ["Configuration.xml", "Languages/Русский.xml"], + "files": [ + "Configuration.xml", + "Languages/Русский.xml", + "Ext/ClientApplicationInterface.xml" + ], "stdoutContains": "ТестСиноним" } -} +} \ No newline at end of file diff --git a/tests/skills/cases/cf-init/with-vendor.json b/tests/skills/cases/cf-init/with-vendor.json index a8136a32..04edb945 100644 --- a/tests/skills/cases/cf-init/with-vendor.json +++ b/tests/skills/cases/cf-init/with-vendor.json @@ -1,9 +1,20 @@ { "name": "Конфигурация с поставщиком и версией", - "params": { "name": "Бухгалтерия" }, - "args_extra": ["-Vendor", "Тест", "-Version", "2.0.1"], + "params": { + "name": "Бухгалтерия" + }, + "args_extra": [ + "-Vendor", + "Тест", + "-Version", + "2.0.1" + ], "expect": { - "files": ["Configuration.xml", "Languages/Русский.xml"], + "files": [ + "Configuration.xml", + "Languages/Русский.xml", + "Ext/ClientApplicationInterface.xml" + ], "stdoutContains": "Бухгалтерия" } -} +} \ No newline at end of file