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