Compare commits

..
Author SHA1 Message Date
github-actions[bot] b9eb4fd480 Auto-build: claude-code (python) from 8826a88 2026-07-20 17:20:59 +00:00
3013 changed files with 339 additions and 195407 deletions
-32
View File
@@ -1,32 +0,0 @@
{
"name": "cc-1c-skills",
"interface": {
"displayName": "1C Skills"
},
"plugins": [
{
"name": "1c-skills",
"source": {
"source": "url",
"url": "https://github.com/Nikolay-Shirokov/cc-1c-skills.git",
"ref": "port-codex"
},
"policy": {
"installation": "AVAILABLE"
},
"category": "Development"
},
{
"name": "1c-skills-py",
"source": {
"source": "url",
"url": "https://github.com/Nikolay-Shirokov/cc-1c-skills.git",
"ref": "port-codex-py"
},
"policy": {
"installation": "AVAILABLE"
},
"category": "Development"
}
]
}
-24
View File
@@ -1,24 +0,0 @@
{
"$schema": "https://json.schemastore.org/claude-code-marketplace-manifest.json",
"name": "cc-1c-skills",
"description": "Маркетплейс навыков для разработки на платформе 1С:Предприятие",
"owner": {
"name": "Nikolay Shirokov"
},
"plugins": [
{
"name": "1c-skills",
"source": "./",
"description": "[PowerShell] Навыки для разработки на 1С:Предприятие 8.3 — абстракции над XML-форматами и CLI конфигуратора, плюс глаза и руки для тестирования через веб-клиент."
},
{
"name": "1c-skills-py",
"source": {
"source": "github",
"repo": "Nikolay-Shirokov/cc-1c-skills",
"ref": "port-claude-code-py"
},
"description": "[Python] То же — для Linux/Mac или когда PowerShell недоступен."
}
]
}
+2 -2
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "1c-skills",
"description": "[PowerShell] Навыки для разработки на 1С:Предприятие 8.3 — абстракции над XML-форматами и CLI конфигуратора, плюс глаза и руки для тестирования через веб-клиент.",
"name": "1c-skills-py",
"description": "[Python] Навыки для разработки на 1С:Предприятие 8.3 — абстракции над XML-форматами и CLI конфигуратора, плюс глаза и руки для тестирования через веб-клиент. Linux/Mac или когда PowerShell недоступен.",
"author": {
"name": "Nikolay Shirokov"
},
+1 -1
View File
@@ -24,7 +24,7 @@ allowed-tools:
| `NoValidate` | Пропустить авто-валидацию |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cf-edit.ps1" -ConfigPath '<path>' -Operation modify-property -Value 'Version=1.0.0.1'
python "${CLAUDE_SKILL_DIR}/scripts/cf-edit.py" -ConfigPath '<path>' -Operation modify-property -Value 'Version=1.0.0.1'
```
## Операции
+1 -1
View File
@@ -23,7 +23,7 @@ allowed-tools:
| `OutFile` | Записать результат в файл (UTF-8 BOM) |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cf-info.ps1" -ConfigPath "<путь>"
python "${CLAUDE_SKILL_DIR}/scripts/cf-info.py" -ConfigPath "<путь>"
```
## Три режима
+1 -1
View File
@@ -24,7 +24,7 @@ allowed-tools:
| `CompatibilityMode` | Режим совместимости (default: `Version8_3_24`) |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cf-init.ps1" -Name "МояКонфигурация"
python "${CLAUDE_SKILL_DIR}/scripts/cf-init.py" -Name "МояКонфигурация"
```
## Примеры
+2 -2
View File
@@ -24,6 +24,6 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cf-validate.ps1" -ConfigPath "upload/cfempty"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cf-validate.ps1" -ConfigPath "upload/cfempty/Configuration.xml"
python "${CLAUDE_SKILL_DIR}/scripts/cf-validate.py" -ConfigPath "upload/cfempty"
python "${CLAUDE_SKILL_DIR}/scripts/cf-validate.py" -ConfigPath "upload/cfempty/Configuration.xml"
```
+1 -1
View File
@@ -71,7 +71,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-borrow.ps1" -ExtensionPath src -ConfigPath C:\cfsrc\erp -Object "Catalog.Контрагенты"
python "${CLAUDE_SKILL_DIR}/scripts/cfe-borrow.py" -ExtensionPath src -ConfigPath C:\cfsrc\erp -Object "Catalog.Контрагенты"
```
## Примеры
+1 -1
View File
@@ -23,7 +23,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-diff.ps1" -ExtensionPath src -ConfigPath C:\cfsrc\erp -Mode A
python "${CLAUDE_SKILL_DIR}/scripts/cfe-diff.py" -ExtensionPath src -ConfigPath C:\cfsrc\erp -Mode A
```
## Mode A — обзор расширения
+1 -1
View File
@@ -44,7 +44,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-init.ps1" -Name "МоёРасширение"
python "${CLAUDE_SKILL_DIR}/scripts/cfe-init.py" -Name "МоёРасширение"
```
## Примеры
+1 -1
View File
@@ -110,7 +110,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-patch-method.ps1" -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
python "${CLAUDE_SKILL_DIR}/scripts/cfe-patch-method.py" -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
```
## Примеры
+2 -2
View File
@@ -24,6 +24,6 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-validate.ps1" -ExtensionPath "src"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-validate.ps1" -ExtensionPath "src/Configuration.xml"
python "${CLAUDE_SKILL_DIR}/scripts/cfe-validate.py" -ExtensionPath "src"
python "${CLAUDE_SKILL_DIR}/scripts/cfe-validate.py" -ExtensionPath "src/Configuration.xml"
```
+5 -5
View File
@@ -31,7 +31,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-create.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-create.py" <параметры>
```
### Параметры скрипта
@@ -57,14 +57,14 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-create.ps1" <п
```powershell
# Создать файловую базу
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-create.ps1" -InfoBasePath "C:\Bases\NewDB"
python "${CLAUDE_SKILL_DIR}/scripts/db-create.py" -InfoBasePath "C:\Bases\NewDB"
# Создать серверную базу
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-create.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test"
python "${CLAUDE_SKILL_DIR}/scripts/db-create.py" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test"
# Создать из шаблона CF
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-create.ps1" -InfoBasePath "C:\Bases\NewDB" -UseTemplate "C:\Templates\config.cf"
python "${CLAUDE_SKILL_DIR}/scripts/db-create.py" -InfoBasePath "C:\Bases\NewDB" -UseTemplate "C:\Templates\config.cf"
# Создать и добавить в список баз
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-create.ps1" -InfoBasePath "C:\Bases\NewDB" -AddToList -ListName "Новая база"
python "${CLAUDE_SKILL_DIR}/scripts/db-create.py" -InfoBasePath "C:\Bases\NewDB" -AddToList -ListName "Новая база"
```
+4 -4
View File
@@ -35,7 +35,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.py" <параметры>
```
### Параметры скрипта
@@ -58,11 +58,11 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.ps1" <п
```powershell
# Выгрузка конфигурации (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "C:\backup\config.cf"
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "C:\backup\config.cf"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -OutputFile "config.cf"
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.py" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -OutputFile "config.cf"
# Выгрузка расширения
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "ext.cfe" -Extension "МоёРасширение"
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-cf.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "ext.cfe" -Extension "МоёРасширение"
```
+3 -3
View File
@@ -38,7 +38,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-dt.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-dt.py" <параметры>
```
### Параметры скрипта
@@ -59,10 +59,10 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-dt.ps1" <п
```powershell
# Выгрузка ИБ (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-dt.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "C:\backup\base.dt"
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-dt.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "C:\backup\base.dt"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-dt.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -OutputFile "base.dt"
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-dt.py" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -OutputFile "base.dt"
```
## Связанные навыки
+6 -6
View File
@@ -37,7 +37,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.py" <параметры>
```
### Параметры скрипта
@@ -74,17 +74,17 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.ps1" <
```powershell
# Полная выгрузка (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.ps1" -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.py" -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full
# Инкрементальная выгрузка
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Changes
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Changes
# Частичная выгрузка
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Partial -Objects "Справочник.Номенклатура,Документ.Заказ"
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Partial -Objects "Справочник.Номенклатура,Документ.Заказ"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -ConfigDir "C:\WS\cfsrc" -Mode Full
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.py" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -ConfigDir "C:\WS\cfsrc" -Mode Full
# Выгрузка расширения
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\ext_src" -Mode Full -Extension "МоёРасширение"
python "${CLAUDE_SKILL_DIR}/scripts/db-dump-xml.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\ext_src" -Mode Full -Extension "МоёРасширение"
```
+4 -4
View File
@@ -36,7 +36,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.py" <параметры>
```
### Параметры скрипта
@@ -63,11 +63,11 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.ps1" <п
```powershell
# Файловая база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "C:\backup\config.cf"
python "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "C:\backup\config.cf"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test" -UserName "Admin" -Password "secret" -InputFile "config.cf"
python "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.py" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test" -UserName "Admin" -Password "secret" -InputFile "config.cf"
# Загрузка расширения
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "ext.cfe" -Extension "МоёРасширение"
python "${CLAUDE_SKILL_DIR}/scripts/db-load-cf.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "ext.cfe" -Extension "МоёРасширение"
```
+3 -3
View File
@@ -52,7 +52,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-dt.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-load-dt.py" <параметры>
```
### Параметры скрипта
@@ -80,10 +80,10 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-dt.ps1" <п
```powershell
# Файловая база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-dt.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "C:\backup\base.dt"
python "${CLAUDE_SKILL_DIR}/scripts/db-load-dt.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "C:\backup\base.dt"
# Серверная база с ускорением загрузки
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-dt.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test" -UserName "Admin" -Password "secret" -InputFile "base.dt" -JobsCount 4
python "${CLAUDE_SKILL_DIR}/scripts/db-load-dt.py" -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test" -UserName "Admin" -Password "secret" -InputFile "base.dt" -JobsCount 4
```
## Связанные навыки
+3 -3
View File
@@ -38,7 +38,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-git.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-load-git.py" <параметры>
```
### Параметры скрипта
@@ -70,8 +70,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-git.ps1" <
```powershell
# Все незафиксированные изменения
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-git.ps1" -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\WS\cfsrc" -Source All -UpdateDB
python "${CLAUDE_SKILL_DIR}/scripts/db-load-git.py" -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\WS\cfsrc" -Source All -UpdateDB
# Из диапазона коммитов
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-git.ps1" -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\WS\cfsrc" -Source Commit -CommitRange "HEAD~3..HEAD"
python "${CLAUDE_SKILL_DIR}/scripts/db-load-git.py" -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\WS\cfsrc" -Source Commit -CommitRange "HEAD~3..HEAD"
```
+5 -5
View File
@@ -38,7 +38,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.py" <параметры>
```
### Параметры скрипта
@@ -88,14 +88,14 @@ Documents/Заказ/Forms/ФормаДокумента.xml
```powershell
# Полная загрузка
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.ps1" -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full
python "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.py" -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full
# Частичная загрузка конкретных файлов
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Partial -Files "Catalogs/Номенклатура.xml,Catalogs/Номенклатура/Ext/ObjectModule.bsl"
python "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Partial -Files "Catalogs/Номенклатура.xml,Catalogs/Номенклатура/Ext/ObjectModule.bsl"
# Загрузка расширения
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\ext_src" -Mode Full -Extension "МоёРасширение"
python "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\ext_src" -Mode Full -Extension "МоёРасширение"
# Загрузка + обновление БД в одном запуске
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full -UpdateDB
python "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full -UpdateDB
```
+5 -5
View File
@@ -36,7 +36,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-run.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-run.py" <параметры>
```
### Параметры скрипта
@@ -63,14 +63,14 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-run.ps1" <пар
```powershell
# Простой запуск
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-run.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin"
python "${CLAUDE_SKILL_DIR}/scripts/db-run.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin"
# Запуск с обработкой
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-run.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Execute "C:\epf\МояОбработка.epf"
python "${CLAUDE_SKILL_DIR}/scripts/db-run.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Execute "C:\epf\МояОбработка.epf"
# Открыть по навигационной ссылке
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-run.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -URL "e1cib/data/Справочник.Номенклатура"
python "${CLAUDE_SKILL_DIR}/scripts/db-run.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -URL "e1cib/data/Справочник.Номенклатура"
# Серверная база с параметром запуска
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-run.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -CParam "ЗапуститьОбновление"
python "${CLAUDE_SKILL_DIR}/scripts/db-run.py" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -CParam "ЗапуститьОбновление"
```
+4 -4
View File
@@ -35,7 +35,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/db-update.py" <параметры>
```
### Параметры скрипта
@@ -76,11 +76,11 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" <п
```powershell
# Обычное обновление (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin"
python "${CLAUDE_SKILL_DIR}/scripts/db-update.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin"
# Динамическое обновление (серверная база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -Dynamic "+"
python "${CLAUDE_SKILL_DIR}/scripts/db-update.py" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -Dynamic "+"
# Обновление расширения
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Extension "МоёРасширение"
python "${CLAUDE_SKILL_DIR}/scripts/db-update.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Extension "МоёРасширение"
```
+3 -3
View File
@@ -40,7 +40,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-build.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/epf-build.py" <параметры>
```
### Параметры скрипта
@@ -62,8 +62,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-build.ps1" <п
```powershell
# Сборка обработки (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-build.ps1" -InfoBasePath "C:\Bases\MyDB" -SourceFile "src/МояОбработка.xml" -OutputFile "build/МояОбработка.epf"
python "${CLAUDE_SKILL_DIR}/scripts/epf-build.py" -InfoBasePath "C:\Bases\MyDB" -SourceFile "src/МояОбработка.xml" -OutputFile "build/МояОбработка.epf"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-build.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -SourceFile "src/МояОбработка.xml" -OutputFile "build/МояОбработка.epf"
python "${CLAUDE_SKILL_DIR}/scripts/epf-build.py" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -SourceFile "src/МояОбработка.xml" -OutputFile "build/МояОбработка.epf"
```
+3 -3
View File
@@ -39,7 +39,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-dump.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/epf-dump.py" <параметры>
```
### Параметры скрипта
@@ -62,8 +62,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-dump.ps1" <па
```powershell
# Разборка обработки (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-dump.ps1" -InfoBasePath "C:\Bases\MyDB" -InputFile "build/МояОбработка.epf" -OutputDir "src"
python "${CLAUDE_SKILL_DIR}/scripts/epf-dump.py" -InfoBasePath "C:\Bases\MyDB" -InputFile "build/МояОбработка.epf" -OutputDir "src"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-dump.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -InputFile "build/МояОбработка.epf" -OutputDir "src"
python "${CLAUDE_SKILL_DIR}/scripts/epf-dump.py" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -InputFile "build/МояОбработка.epf" -OutputDir "src"
```
+1 -1
View File
@@ -30,7 +30,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/init.ps1" -Name "<Name>" [-Synonym "<Synonym>"] [-SrcDir "<SrcDir>"]
python "${CLAUDE_SKILL_DIR}/scripts/init.py" -Name "<Name>" [-Synonym "<Synonym>"] [-SrcDir "<SrcDir>"]
```
## Дальнейшие шаги
+2 -2
View File
@@ -24,7 +24,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-validate.ps1" -ObjectPath "src/МояОбработка"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/epf-validate.ps1" -ObjectPath "src/МояОбработка/МояОбработка.xml"
python "${CLAUDE_SKILL_DIR}/scripts/epf-validate.py" -ObjectPath "src/МояОбработка"
python "${CLAUDE_SKILL_DIR}/scripts/epf-validate.py" -ObjectPath "src/МояОбработка/МояОбработка.xml"
```
+3 -3
View File
@@ -42,7 +42,7 @@ allowed-tools:
Используй общий скрипт из epf-build:
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-build/scripts/epf-build.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/../epf-build/scripts/epf-build.py" <параметры>
```
### Параметры скрипта
@@ -64,8 +64,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-build/scripts/epf-bu
```powershell
# Сборка отчёта (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-build/scripts/epf-build.ps1" -InfoBasePath "C:\Bases\MyDB" -SourceFile "src/МойОтчёт.xml" -OutputFile "build/МойОтчёт.erf"
python "${CLAUDE_SKILL_DIR}/../epf-build/scripts/epf-build.py" -InfoBasePath "C:\Bases\MyDB" -SourceFile "src/МойОтчёт.xml" -OutputFile "build/МойОтчёт.erf"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-build/scripts/epf-build.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -SourceFile "src/МойОтчёт.xml" -OutputFile "build/МойОтчёт.erf"
python "${CLAUDE_SKILL_DIR}/../epf-build/scripts/epf-build.py" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -SourceFile "src/МойОтчёт.xml" -OutputFile "build/МойОтчёт.erf"
```
+3 -3
View File
@@ -41,7 +41,7 @@ allowed-tools:
Используй общий скрипт из epf-dump:
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-dump/scripts/epf-dump.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/../epf-dump/scripts/epf-dump.py" <параметры>
```
### Параметры скрипта
@@ -64,8 +64,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-dump/scripts/epf-dum
```powershell
# Разборка отчёта (файловая база)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-dump/scripts/epf-dump.ps1" -InfoBasePath "C:\Bases\MyDB" -InputFile "build/МойОтчёт.erf" -OutputDir "src"
python "${CLAUDE_SKILL_DIR}/../epf-dump/scripts/epf-dump.py" -InfoBasePath "C:\Bases\MyDB" -InputFile "build/МойОтчёт.erf" -OutputDir "src"
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-dump/scripts/epf-dump.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -InputFile "build/МойОтчёт.erf" -OutputDir "src"
python "${CLAUDE_SKILL_DIR}/../epf-dump/scripts/epf-dump.py" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -InputFile "build/МойОтчёт.erf" -OutputDir "src"
```
+1 -1
View File
@@ -31,7 +31,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/init.ps1" -Name "<Name>" [-Synonym "<Synonym>"] [-SrcDir "<SrcDir>"] [-WithSKD]
python "${CLAUDE_SKILL_DIR}/scripts/init.py" -Name "<Name>" [-Synonym "<Synonym>"] [-SrcDir "<SrcDir>"] [-WithSKD]
```
## Дальнейшие шаги
+2 -2
View File
@@ -26,7 +26,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-validate/scripts/epf-validate.ps1" -ObjectPath "src/МойОтчёт"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/../epf-validate/scripts/epf-validate.ps1" -ObjectPath "src/МойОтчёт/МойОтчёт.xml"
python "${CLAUDE_SKILL_DIR}/../epf-validate/scripts/epf-validate.py" -ObjectPath "src/МойОтчёт"
python "${CLAUDE_SKILL_DIR}/../epf-validate/scripts/epf-validate.py" -ObjectPath "src/МойОтчёт/МойОтчёт.xml"
```
+1 -1
View File
@@ -32,7 +32,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-add.ps1" -ObjectPath "<ObjectPath>" -FormName "<FormName>" [-Purpose "<Purpose>"] [-Synonym "<Synonym>"] [-SetDefault]
python "${CLAUDE_SKILL_DIR}/scripts/form-add.py" -ObjectPath "<ObjectPath>" -FormName "<FormName>" [-Purpose "<Purpose>"] [-Synonym "<Synonym>"] [-SetDefault]
```
## Purpose — назначение формы
+2 -2
View File
@@ -29,10 +29,10 @@ allowed-tools:
```powershell
# Режим JSON DSL
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" -JsonPath "<json>" -OutputPath "<Form.xml>"
python "${CLAUDE_SKILL_DIR}/scripts/form-compile.py" -JsonPath "<json>" -OutputPath "<Form.xml>"
# Режим from-object (объект и purpose выводятся из OutputPath; Document и Catalog)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-compile.ps1" -FromObject -OutputPath "<.../TypePlural/ObjectName/Forms/FormName/Ext/Form.xml>"
python "${CLAUDE_SKILL_DIR}/scripts/form-compile.py" -FromObject -OutputPath "<.../TypePlural/ObjectName/Forms/FormName/Ext/Form.xml>"
```
## JSON DSL — справка
+1 -1
View File
@@ -31,7 +31,7 @@ allowed-tools:
| `OutputPath` | Путь к выходному JSON. Если не задан — JSON в stdout |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-decompile.ps1" -FormPath "<Form.xml>" -OutputPath "<out.json>"
python "${CLAUDE_SKILL_DIR}/scripts/form-decompile.py" -FormPath "<Form.xml>" -OutputPath "<out.json>"
```
## Что получаешь
+1 -1
View File
@@ -29,7 +29,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-edit.ps1" -FormPath "<путь>" -JsonPath "<путь>"
python "${CLAUDE_SKILL_DIR}/scripts/form-edit.py" -FormPath "<путь>" -JsonPath "<путь>"
```
## JSON формат
+1 -1
View File
@@ -15,7 +15,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-info.ps1" -FormPath "<путь к Form.xml>"
python "${CLAUDE_SKILL_DIR}/scripts/form-info.py" -FormPath "<путь к Form.xml>"
```
## Параметры
+1 -1
View File
@@ -31,7 +31,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/remove-form.ps1" -ObjectName "<ObjectName>" -FormName "<FormName>" [-SrcDir "<SrcDir>"]
python "${CLAUDE_SKILL_DIR}/scripts/remove-form.py" -ObjectName "<ObjectName>" -FormName "<FormName>" [-SrcDir "<SrcDir>"]
```
## Что удаляется
+2 -2
View File
@@ -23,7 +23,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-validate.ps1" -FormPath "Catalogs/Номенклатура/Forms/ФормаЭлемента"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/form-validate.ps1" -FormPath "src/МояОбработка/Forms/Форма/Ext/Form.xml"
python "${CLAUDE_SKILL_DIR}/scripts/form-validate.py" -FormPath "Catalogs/Номенклатура/Forms/ФормаЭлемента"
python "${CLAUDE_SKILL_DIR}/scripts/form-validate.py" -FormPath "src/МояОбработка/Forms/Форма/Ext/Form.xml"
```
+1 -1
View File
@@ -30,7 +30,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/add-help.ps1" -ObjectName "<ObjectName>" [-Lang "<Lang>"] [-SrcDir "<SrcDir>"]
python "${CLAUDE_SKILL_DIR}/scripts/add-help.py" -ObjectName "<ObjectName>" [-Lang "<Lang>"] [-SrcDir "<SrcDir>"]
```
## Что делает скрипт
+2 -2
View File
@@ -29,13 +29,13 @@ allowed-tools:
### Inline mode
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/interface-edit.ps1" -CIPath '<path>' -Operation hide -Value '<cmd>'
python "${CLAUDE_SKILL_DIR}/scripts/interface-edit.py" -CIPath '<path>' -Operation hide -Value '<cmd>'
```
### JSON mode
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/interface-edit.ps1" -CIPath '<path>' -DefinitionFile '<json>'
python "${CLAUDE_SKILL_DIR}/scripts/interface-edit.py" -CIPath '<path>' -DefinitionFile '<json>'
```
## Операции
+2 -2
View File
@@ -24,6 +24,6 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/interface-validate.ps1" -CIPath "Subsystems/Продажи"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/interface-validate.ps1" -CIPath "Subsystems/Продажи/Ext/CommandInterface.xml"
python "${CLAUDE_SKILL_DIR}/scripts/interface-validate.py" -CIPath "Subsystems/Продажи"
python "${CLAUDE_SKILL_DIR}/scripts/interface-validate.py" -CIPath "Subsystems/Продажи/Ext/CommandInterface.xml"
```
+1 -1
View File
@@ -24,7 +24,7 @@ allowed-tools:
3. Изменить созданный объект — `/meta-edit`; проверить — `/meta-validate`.
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-compile.ps1" -JsonPath "<json>" -OutputDir "<ConfigDir>"
python "${CLAUDE_SKILL_DIR}/scripts/meta-compile.py" -JsonPath "<json>" -OutputDir "<ConfigDir>"
```
| Параметр | Описание |
+1 -1
View File
@@ -38,7 +38,7 @@ allowed-tools:
| `OutputPath` | Путь к выходному JSON. Если не задан — JSON в stdout |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-decompile.ps1" -ObjectPath "<Объект.xml>" -OutputPath "<out.json>"
python "${CLAUDE_SKILL_DIR}/scripts/meta-decompile.py" -ObjectPath "<Объект.xml>" -OutputPath "<out.json>"
```
Неподдерживаемый тип объекта или не-`MetaDataObject` root → ненулевой код выхода и сообщение в stderr.
+2 -2
View File
@@ -18,13 +18,13 @@ allowed-tools:
### Inline mode (простые операции)
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-edit.ps1" -ObjectPath "<path>" -Operation <op> -Value "<val>"
python "${CLAUDE_SKILL_DIR}/scripts/meta-edit.py" -ObjectPath "<path>" -Operation <op> -Value "<val>"
```
### JSON mode (сложные/комбинированные)
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-edit.ps1" -DefinitionFile "<json>" -ObjectPath "<path>"
python "${CLAUDE_SKILL_DIR}/scripts/meta-edit.py" -DefinitionFile "<json>" -ObjectPath "<path>"
```
| Параметр | Описание |
+1 -1
View File
@@ -3,7 +3,7 @@
Для сложных и комбинированных операций используйте JSON-файл вместо inline-режима.
```powershell
powershell.exe -NoProfile -File .claude/skills/meta-edit/scripts/meta-edit.ps1 -DefinitionFile "<json>" -ObjectPath "<path>"
python .claude/skills/meta-edit/scripts/meta-edit.py -DefinitionFile "<json>" -ObjectPath "<path>"
```
## add — добавить элементы
+1 -1
View File
@@ -23,7 +23,7 @@ allowed-tools:
| `OutFile` | Записать результат в файл (UTF-8 BOM) |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-info.ps1" -ObjectPath "<путь>"
python "${CLAUDE_SKILL_DIR}/scripts/meta-info.py" -ObjectPath "<путь>"
```
## Три режима
+1 -1
View File
@@ -32,7 +32,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-remove.ps1" -ConfigDir "<путь>" -Object "Catalog.Товары"
python "${CLAUDE_SKILL_DIR}/scripts/meta-remove.py" -ConfigDir "<путь>" -Object "Catalog.Товары"
```
## Поддерживаемые типы
+2 -2
View File
@@ -24,6 +24,6 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-validate.ps1" -ObjectPath "Catalogs/Номенклатура/Номенклатура.xml"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-validate.ps1" -ObjectPath "Catalogs/Банки|Documents/Заказ"
python "${CLAUDE_SKILL_DIR}/scripts/meta-validate.py" -ObjectPath "Catalogs/Номенклатура/Номенклатура.xml"
python "${CLAUDE_SKILL_DIR}/scripts/meta-validate.py" -ObjectPath "Catalogs/Банки|Documents/Заказ"
```
+1 -1
View File
@@ -29,7 +29,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.ps1" -JsonPath "<путь>.json" -OutputPath "<путь>/Template.xml"
python "${CLAUDE_SKILL_DIR}/scripts/mxl-compile.py" -JsonPath "<путь>.json" -OutputPath "<путь>/Template.xml"
```
## Рабочий процесс
+1 -1
View File
@@ -29,7 +29,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-decompile.ps1" -TemplatePath "<путь>/Template.xml" [-OutputPath "<путь>.json"]
python "${CLAUDE_SKILL_DIR}/scripts/mxl-decompile.py" -TemplatePath "<путь>/Template.xml" [-OutputPath "<путь>.json"]
```
## Рабочий процесс
+2 -2
View File
@@ -38,12 +38,12 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-info.ps1" -TemplatePath "<путь>"
python "${CLAUDE_SKILL_DIR}/scripts/mxl-info.py" -TemplatePath "<путь>"
```
Или по имени обработки/макета:
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-info.ps1" -ProcessorName "<Имя>" -TemplateName "<Макет>" [-SrcDir "<каталог>"]
python "${CLAUDE_SKILL_DIR}/scripts/mxl-info.py" -ProcessorName "<Имя>" -TemplateName "<Макет>" [-SrcDir "<каталог>"]
```
Дополнительные флаги:
+2 -2
View File
@@ -23,7 +23,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-validate.ps1" -TemplatePath "Catalogs/Номенклатура/Templates/Макет"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/mxl-validate.ps1" -TemplatePath "src/МояОбработка/Templates/ПечатнаяФорма"
python "${CLAUDE_SKILL_DIR}/scripts/mxl-validate.py" -TemplatePath "Catalogs/Номенклатура/Templates/Макет"
python "${CLAUDE_SKILL_DIR}/scripts/mxl-validate.py" -TemplatePath "src/МояОбработка/Templates/ПечатнаяФорма"
```
+1 -1
View File
@@ -21,7 +21,7 @@ allowed-tools:
| `OutputDir` | Корень выгрузки конфигурации (где `Configuration.xml`, `Roles/` и т.д.) |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-compile.ps1" -JsonPath "<json>" -OutputDir "<ConfigDir>"
python "${CLAUDE_SKILL_DIR}/scripts/role-compile.py" -JsonPath "<json>" -OutputDir "<ConfigDir>"
```
Создаёт `{OutputDir}/Roles/Имя.xml` и `{OutputDir}/Roles/Имя/Ext/Rights.xml`. Регистрирует `<Role>` в `Configuration.xml`.
+1 -1
View File
@@ -22,7 +22,7 @@ allowed-tools:
## Запуск скрипта
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-info.ps1" -RightsPath <path> -OutFile <output.txt>
python "${CLAUDE_SKILL_DIR}/scripts/role-info.py" -RightsPath <path> -OutFile <output.txt>
```
### Параметры
+1 -1
View File
@@ -23,5 +23,5 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/role-validate.ps1" -RightsPath "Roles/МояРоль"
python "${CLAUDE_SKILL_DIR}/scripts/role-validate.py" -RightsPath "Roles/МояРоль"
```
+2 -2
View File
@@ -23,10 +23,10 @@ allowed-tools:
```powershell
# Из файла
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-compile.ps1" -DefinitionFile "<json>" -OutputPath "<Template.xml>"
python "${CLAUDE_SKILL_DIR}/scripts/skd-compile.py" -DefinitionFile "<json>" -OutputPath "<Template.xml>"
# Из строки (без промежуточного файла)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-compile.ps1" -Value '<json-string>' -OutputPath "<Template.xml>"
python "${CLAUDE_SKILL_DIR}/scripts/skd-compile.py" -Value '<json-string>' -OutputPath "<Template.xml>"
```
## JSON DSL — краткий справочник
+1 -1
View File
@@ -31,7 +31,7 @@ allowed-tools:
| `OutputPath` | Путь к выходному JSON. Если не задан — JSON в stdout |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-decompile.ps1" -TemplatePath "<Template.xml>" -OutputPath "<out.json>"
python "${CLAUDE_SKILL_DIR}/scripts/skd-decompile.py" -TemplatePath "<Template.xml>" -OutputPath "<out.json>"
```
## Что получаешь
+1 -1
View File
@@ -25,7 +25,7 @@ allowed-tools:
| `NoSelection` | (опц.) Не добавлять поле в selection варианта |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-edit.ps1" -TemplatePath "<path>" -Operation <op> -Value "<value>"
python "${CLAUDE_SKILL_DIR}/scripts/skd-edit.py" -TemplatePath "<path>" -Operation <op> -Value "<value>"
```
## Пакетный режим (batch)
+1 -1
View File
@@ -25,7 +25,7 @@ allowed-tools:
| `OutFile` | Записать результат в файл (UTF-8 BOM) |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-info.ps1" -TemplatePath "<путь>"
python "${CLAUDE_SKILL_DIR}/scripts/skd-info.py" -TemplatePath "<путь>"
```
С указанием режима:
+2 -2
View File
@@ -24,6 +24,6 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-validate.ps1" -TemplatePath "src/МойОтчёт/Templates/ОсновнаяСхема"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/skd-validate.ps1" -TemplatePath "Catalogs/Номенклатура/Templates/СКД/Ext/Template.xml"
python "${CLAUDE_SKILL_DIR}/scripts/skd-validate.py" -TemplatePath "src/МойОтчёт/Templates/ОсновнаяСхема"
python "${CLAUDE_SKILL_DIR}/scripts/skd-validate.py" -TemplatePath "Catalogs/Номенклатура/Templates/СКД/Ext/Template.xml"
```
+1 -1
View File
@@ -24,7 +24,7 @@ allowed-tools:
| `NoValidate` | Пропустить авто-валидацию |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/subsystem-compile.ps1" -Value '<json>' -OutputDir '<ConfigDir>'
python "${CLAUDE_SKILL_DIR}/scripts/subsystem-compile.py" -Value '<json>' -OutputDir '<ConfigDir>'
```
## JSON-определение
+1 -1
View File
@@ -24,7 +24,7 @@ allowed-tools:
| `NoValidate` | Пропустить авто-валидацию |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/subsystem-edit.ps1" -SubsystemPath '<path>' -Operation add-content -Value 'Catalog.Товары'
python "${CLAUDE_SKILL_DIR}/scripts/subsystem-edit.py" -SubsystemPath '<path>' -Operation add-content -Value 'Catalog.Товары'
```
## Операции
+1 -1
View File
@@ -23,7 +23,7 @@ allowed-tools:
| `OutFile` | Записать результат в файл (UTF-8 BOM) |
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/subsystem-info.ps1" -SubsystemPath "<путь>"
python "${CLAUDE_SKILL_DIR}/scripts/subsystem-info.py" -SubsystemPath "<путь>"
```
## Пять режимов
+2 -2
View File
@@ -24,6 +24,6 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/subsystem-validate.ps1" -SubsystemPath "Subsystems/Продажи"
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/subsystem-validate.ps1" -SubsystemPath "Subsystems/Продажи.xml"
python "${CLAUDE_SKILL_DIR}/scripts/subsystem-validate.py" -SubsystemPath "Subsystems/Продажи"
python "${CLAUDE_SKILL_DIR}/scripts/subsystem-validate.py" -SubsystemPath "Subsystems/Продажи.xml"
```
+1 -1
View File
@@ -28,7 +28,7 @@ allowed-tools:
`-Path` — тот же путь, который отклонил `support-guard` (объект, форма, макет или каталог дампа).
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/support-edit.ps1" -Path "Catalogs/Контрагенты.xml" -Set editable
python "${CLAUDE_SKILL_DIR}/scripts/support-edit.py" -Path "Catalogs/Контрагенты.xml" -Set editable
```
## editable или off-support?
+2 -2
View File
@@ -33,7 +33,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/add-template.ps1" -ObjectName "<ObjectName>" -TemplateName "<TemplateName>" -TemplateType "<TemplateType>" [-Synonym "<Synonym>"] [-SrcDir "<SrcDir>"] [-SetMainSKD]
python "${CLAUDE_SKILL_DIR}/scripts/add-template.py" -ObjectName "<ObjectName>" -TemplateName "<TemplateName>" -TemplateType "<TemplateType>" [-Synonym "<Synonym>"] [-SrcDir "<SrcDir>"] [-SetMainSKD]
```
## Пример
@@ -41,7 +41,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/add-template.ps1" -
Добавить основную СКД к отчёту в расширении:
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/add-template.ps1" -ObjectName "ОтчётПродажи" -TemplateName "ОсновнаяСхемаКомпоновкиДанных" -TemplateType "DataCompositionSchema" -SrcDir "src/cfe/МоёРасширение/Reports"
python "${CLAUDE_SKILL_DIR}/scripts/add-template.py" -ObjectName "ОтчётПродажи" -TemplateName "ОсновнаяСхемаКомпоновкиДанных" -TemplateType "DataCompositionSchema" -SrcDir "src/cfe/МоёРасширение/Reports"
```
## Маппинг типов
+1 -1
View File
@@ -31,7 +31,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/remove-template.ps1" -ObjectName "<ObjectName>" -TemplateName "<TemplateName>" [-SrcDir "<SrcDir>"]
python "${CLAUDE_SKILL_DIR}/scripts/remove-template.py" -ObjectName "<ObjectName>" -TemplateName "<TemplateName>" [-SrcDir "<SrcDir>"]
```
## Что удаляется
+3 -3
View File
@@ -26,7 +26,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-info.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/web-info.py" <параметры>
```
### Параметры скрипта
@@ -55,8 +55,8 @@ Module: C:/Program Files/1cv8/8.3.24.1691/bin/wsap24.dll
```powershell
# Статус по умолчанию
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-info.ps1"
python "${CLAUDE_SKILL_DIR}/scripts/web-info.py"
# Указать путь к Apache
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-info.ps1" -ApachePath "C:\tools\apache24"
python "${CLAUDE_SKILL_DIR}/scripts/web-info.py" -ApachePath "C:\tools\apache24"
```
+5 -5
View File
@@ -41,7 +41,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-publish.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/web-publish.py" <параметры>
```
### Параметры скрипта
@@ -88,14 +88,14 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-publish.ps1" <
```powershell
# Файловая база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-publish.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin"
python "${CLAUDE_SKILL_DIR}/scripts/web-publish.py" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin"
# С явным именем публикации и портом
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-publish.ps1" -InfoBasePath "C:\Bases\MyDB" -AppName "mydb" -Port 9090
python "${CLAUDE_SKILL_DIR}/scripts/web-publish.py" -InfoBasePath "C:\Bases\MyDB" -AppName "mydb" -Port 9090
# Серверная база
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-publish.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret"
python "${CLAUDE_SKILL_DIR}/scripts/web-publish.py" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret"
# Ручной режим (только инструкция)
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-publish.ps1" -InfoBasePath "C:\Bases\MyDB" -Manual
python "${CLAUDE_SKILL_DIR}/scripts/web-publish.py" -InfoBasePath "C:\Bases\MyDB" -Manual
```
+3 -3
View File
@@ -26,7 +26,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-stop.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/web-stop.py" <параметры>
```
### Параметры скрипта
@@ -45,8 +45,8 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-stop.ps1" <па
```powershell
# Остановить Apache
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-stop.ps1"
python "${CLAUDE_SKILL_DIR}/scripts/web-stop.py"
# С указанием пути
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-stop.ps1" -ApachePath "C:\tools\apache24"
python "${CLAUDE_SKILL_DIR}/scripts/web-stop.py" -ApachePath "C:\tools\apache24"
```
+4 -2
View File
@@ -129,7 +129,7 @@ Switch to an already-open tab/window (fuzzy match).
### Reading form state
#### `getFormState()` → `{ form, formCount, openForms, fields, buttons, tabs, navigation?, table, tables, filters, reportSettings? }`
#### `getFormState()` → `{ form, formCount, openForms, title, fields, buttons, tabs, navigation?, table, tables, filters, reportSettings? }`
Returns current form structure. This is the primary way to understand what's on screen.
**form** — active form number, or `null` when no form is open (desktop).
@@ -142,6 +142,8 @@ Returns current form structure. This is the primary way to understand what's on
**openTabs** — array of `{ name, active? }` from the open-windows tab bar. Only present when the tab bar is enabled in 1C settings. Do NOT rely on this — use `formCount`/`openForms` instead.
**title** — caption of the active form (`"Контрагенты"`, `"Заказ поставщику ТД00-000052 от 05.07.2022"`). Read from the form's own header, which does not depend on the open-windows tab bar; when the form shows no header, falls back to the active tab's caption, and is `null` when neither is available.
**fields** — each field has: `name`, `value`, `label?`, `actions?` (select, clear, open), `required?` (true for unfilled mandatory fields), `disabled?` (control is unavailable). `buttons[]` carry `disabled?` too.
**navigation** — form navigation panel links (for objects with subordinate catalogs): `[{ name, active? }]`. Clickable via `clickElement()`. Only present when the form has a navigation panel (e.g. "Основное", "Объекты метаданных", "Подсистемы").
@@ -170,7 +172,7 @@ const form = await getFormState();
**confirmation** — if present, a Yes/No dialog is shown. Call `clickElement('Да')` or `clickElement('Нет')`.
**errors.stateText** — array of SpreadsheetDocument state messages (e.g. `"Не установлено значение параметра \"X\""`, `"Отчет не сформирован..."`, `"Изменились настройки..."`). Present when the report area shows an info bar instead of data.
**errors.stateText** — array of SpreadsheetDocument state messages (e.g. `"Не установлено значение параметра \"X\""`, `"Отчет не сформирован..."`, `"Изменились настройки..."`). Present when the report area shows an info bar instead of data. The same info bar carries `"Поиск..."` while a list is still searching — actions do not return while it is up, so a filtered list never hands you the previous rows.
### Reading data
+8 -6
View File
@@ -10,6 +10,8 @@ node $RUN test <dir|file>... [flags]
Positional args are test paths (files and/or dirs, multiple allowed). URL is NOT positional — it comes from `webtest.config.mjs`; override with `--url=<url>`.
`webtest.config.mjs` and `_hooks.mjs` always come from the suite root, whatever path you pass: `test tests/myapp/sales/` and `test tests/myapp/sales/01-order.test.mjs` both run under the config and hooks of `tests/myapp/`, no `--url=` needed. Paths from two different suites in one run are refused — pass one suite and narrow with `--grep=` / `--tags=`.
Tests live next to the project they cover (not inside the skill). Convention: `tests/` at the project root, with `_hooks.mjs` and `webtest.config.mjs` at the suite root. Tests are ES modules with `*.test.mjs` suffix.
## When to choose `test` over `exec`
@@ -69,7 +71,7 @@ tests/<app-name>/
01-end-to-end.test.mjs # multi-user
```
Per-folder `_hooks.mjs` / `webtest.config.mjs` inside the application subfolder are NOT supported — only the application-root copies are loaded.
Per-folder `_hooks.mjs` / `webtest.config.mjs` inside the application subfolder are NOT supported — only the application-root copies are loaded, whichever subfolder you point the runner at.
## Test file anatomy
@@ -184,8 +186,8 @@ assert.match(string, regex, msg?) // regex.test(string)
await assert.throws(asyncFn, msg?) // passes if fn throws (use await)
// 1C-specific — operate on getFormState() / readTable() output
assert.formHasField(state, 'Контрагент', msg?) // state.fields[name] exists
assert.formTitle(state, expected, msg?) // state.title includes expected
assert.formHasField(state, 'Контрагент', msg?) // fields[] contains a field with that name
assert.formTitle(state, expected, msg?) // state.title includes expected (null title → fails saying so)
assert.tableHasRow(table, predicate, msg?) // predicate: object (partial match) or fn(row) => bool
// object form: { 'Наименование': 'Тест' }
// fn form: r => r['Сумма'] > 100
@@ -316,7 +318,7 @@ export default async function({ clerk, manager, step, assert }) {
});
await step('Кладовщик видит новый статус', async () => {
const s = await clerk.getFormState();
assert.equal(s.fields['Статус']?.value, 'Утверждён');
assert.equal(s.fields.find(f => f.name === 'Статус')?.value, 'Утверждён');
});
await step('Освободить сессию кладовщика', async () => {
await manager.closeContext('clerk'); // free a 1C license for the next test
@@ -339,7 +341,7 @@ export default async function({ openCommand, clickElement, getFormState, assert,
await clickElement('Создать');
await clickElement('Провести');
const s = await getFormState();
assert.ok(s.errorModal || s.fields['Контрагент']?.required,
assert.ok(s.errorModal || s.fields.find(f => f.name === 'Контрагент')?.required,
'Должна быть ошибка валидации или поле помечено обязательным');
}
```
@@ -359,7 +361,7 @@ export const params = [
export default async function({ fillFields, getFormState, assert }, { type, field, value }) {
await fillFields({ [field]: value });
const state = await getFormState();
assert.equal(state.fields[field]?.value, String(value));
assert.equal(state.fields.find(f => f.name === field)?.value, String(value));
}
```
@@ -1,4 +1,4 @@
// web-test cli/commands/test v1.8 — regression test runner
// web-test cli/commands/test v1.9 — regression test runner
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import { existsSync, writeFileSync, mkdirSync, renameSync, copyFileSync, unlinkSync } from 'fs';
import { resolve, dirname, basename, relative } from 'path';
@@ -9,6 +9,7 @@ import { createAssertions } from '../test-runner/assertions.mjs';
import { buildSeverityIndex } from '../test-runner/severity.mjs';
import { writeAllure, buildJUnit, syncAllureExtras } from '../test-runner/reporters.mjs';
import { discoverTests, resetState } from '../test-runner/discover.mjs';
import { findSuiteRoot, startDirOf } from '../test-runner/suite-root.mjs';
import { planEviction, touchLru, dropLru } from '../test-runner/context-pool.mjs';
export async function cmdTest(rawArgs) {
@@ -78,12 +79,24 @@ export async function cmdTest(rawArgs) {
die(`Test path not found: "${p}". To run a subset use --grep= / --tags=, or pass an existing dir/file.`);
}
// Load config if exists. config (webtest.config.mjs) and hooks (_hooks.mjs) resolve from
// the FIRST path's directory — list paths from the same suite folder.
const firstPath = resolve(testPaths[0]);
const isFile = firstPath.endsWith('.test.mjs');
const testDir = isFile ? dirname(firstPath) : firstPath;
const configPath = resolve(testDir, 'webtest.config.mjs');
// Suite root — the directory `webtest.config.mjs`, `_hooks.mjs`, `_allure/` and report paths
// all hang off. It is NOT the passed path: walking up to the nearest marker is what makes
// `test tests/myapp/sales/` work, as docs/web-test-regression-spec.md has always promised.
// Resolving from the passed path instead lost the hooks of any subfolder run — silently, so
// the run went ahead against an unprepared stand.
const startDirs = testPaths.map(p => startDirOf(p));
const roots = startDirs.map(d => findSuiteRoot(d));
// Paths from different suites must not share hooks — that used to resolve to "first path
// wins", silently running suite B's tests under suite A's preparation.
const distinct = [...new Set(roots.map(r => r?.root ?? null))];
if (distinct.length > 1) {
const lines = testPaths.map((p, i) => ` ${p}${roots[i]?.root ?? '(корень не найден)'}`);
die(`Paths belong to different suites — config and hooks would be ambiguous:\n${lines.join('\n')}\n` +
`Run them separately, or pass one suite root and narrow with --grep= / --tags=.`);
}
const suiteRoot = roots[0]?.root ?? startDirs[0];
const suiteRootFound = !!roots[0];
const configPath = resolve(suiteRoot, 'webtest.config.mjs');
let config = {};
if (existsSync(configPath)) {
const mod = await import('file:///' + configPath.replace(/\\/g, '/'));
@@ -103,7 +116,16 @@ export async function cmdTest(rawArgs) {
if (url) contextSpecs[defaultContextName] = { ...contextSpecs[defaultContextName], url };
} else {
const fallbackUrl = url || config.url;
if (!fallbackUrl) die('No URL provided and no webtest.config.mjs found');
// Name the real problem: with no suite root there is no config to take a URL from — and,
// more dangerously, no `_hooks.mjs` either. The old wording talked only about the URL and
// sent readers looking in the wrong place.
if (!fallbackUrl) {
die(suiteRootFound
? `No URL: ${configPath} defines neither "contexts" nor "url", and --url= was not given.`
: `Suite root not found above "${testPaths[0]}" — no webtest.config.mjs / _hooks.mjs up to ` +
`the repository (or working) directory, so there is no URL and no stand preparation.\n` +
`Pass the suite root (e.g. tests/myapp/) and narrow with --grep= / --tags=, or give --url=.`);
}
contextSpecs.default = { url: fallbackUrl };
}
if (!contextSpecs[defaultContextName]) {
@@ -175,7 +197,7 @@ export async function cmdTest(rawArgs) {
}
const reportDir = opts.reportDir
? resolve(opts.reportDir)
: (opts.report && !reportToStdout ? dirname(resolve(opts.report)) : testDir);
: (opts.report && !reportToStdout ? dirname(resolve(opts.report)) : suiteRoot);
if (opts.screenshot !== 'off') {
try { mkdirSync(reportDir, { recursive: true }); } catch {}
// 1C-error screenshots (taken inside the action wrapper) default to a single
@@ -194,7 +216,10 @@ export async function cmdTest(rawArgs) {
for (const file of testFiles) {
const mod = await import('file:///' + file.replace(/\\/g, '/'));
const base = {
file: relative(testDir, file).replace(/\\/g, '/'),
// Relative to the SUITE ROOT, not to the passed path — otherwise the same test gets a
// different id depending on how it was launched (`sales/01-x.test.mjs` vs `01-x.test.mjs`),
// and Allure history / JUnit trends treat the two as unrelated tests.
file: relative(suiteRoot, file).replace(/\\/g, '/'),
name: mod.name || basename(file, '.test.mjs'),
tags: mod.tags || [],
timeout: mod.timeout || opts.timeout,
@@ -229,7 +254,7 @@ export async function cmdTest(rawArgs) {
});
// Load hooks
const hooksPath = resolve(testDir, '_hooks.mjs');
const hooksPath = resolve(suiteRoot, '_hooks.mjs');
let hooks = {};
if (existsSync(hooksPath)) {
hooks = await import('file:///' + hooksPath.replace(/\\/g, '/'));
@@ -239,7 +264,17 @@ export async function cmdTest(rawArgs) {
// In `--report -` mode the machine JSON/XML takes over stdout, so progress moves to stderr.
const W = reportToStdout ? process.stderr : process.stdout;
W.write(`\nweb-test -- ${url}\n`);
W.write(`Running ${filtered.length} tests from ${relative(process.cwd(), testDir).replace(/\\/g, '/') || '.'}/\n\n`);
// Always name the resolved suite root: a climb that landed on the wrong directory is then
// visible in the first line of output instead of being diagnosed from symptoms later.
const rel = (p) => relative(process.cwd(), p).replace(/\\/g, '/') || '.';
const shownPaths = testPaths.map(p => rel(resolve(p))).filter(p => p !== rel(suiteRoot));
W.write(`Running ${filtered.length} tests from ${rel(suiteRoot)}/`);
W.write(shownPaths.length ? ` (paths: ${shownPaths.join(', ')})\n\n` : `\n\n`);
if (!suiteRootFound) {
// Not fatal — a one-off test outside any suite is legitimate. But a missing suite root also
// means no `_hooks.mjs` was even looked for above, so the stand is whatever it was.
process.stderr.write(`! no suite root (webtest.config.mjs / _hooks.mjs) found above ${rel(startDirs[0])} — running without hooks\n`);
}
const startedAt = new Date().toISOString();
const results = [];
@@ -819,10 +854,10 @@ export async function cmdTest(rawArgs) {
if (opts.format === 'allure') {
// Guard against a result-producing path that skipped recordResult; normally a no-op.
if (!allureWritten) writeAllure(results, reportDir, severityIndex);
syncAllureExtras(testDir, reportDir);
syncAllureExtras(suiteRoot, reportDir);
} else if (opts.format === 'junit') {
if (reportToStdout) process.stdout.write(buildJUnit(report, testDir) + '\n');
else writeFileSync(resolve(opts.report), buildJUnit(report, testDir));
if (reportToStdout) process.stdout.write(buildJUnit(report, suiteRoot) + '\n');
else writeFileSync(resolve(opts.report), buildJUnit(report, suiteRoot));
} else if (reportToStdout) {
out(report);
} else if (opts.report) {
@@ -1,4 +1,4 @@
// web-test cli/test-runner/assertions v1.0 — ctx.assert API
// web-test cli/test-runner/assertions v1.1 — ctx.assert API
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
export function createAssertions() {
@@ -37,11 +37,23 @@ export function createAssertions() {
throw new AssertionError(msg || 'Expected function to throw');
},
// 1C-specific
// `fields` is an ARRAY of { name, value, ... } — indexing it by field name yields undefined,
// which used to make this assertion throw on every call, including the valid ones.
formHasField(state, fieldName, msg) {
if (!state?.fields?.[fieldName]) throw new AssertionError(msg || `Field "${fieldName}" not found in form. Available: ${Object.keys(state?.fields || {}).join(', ')}`, null, fieldName);
const names = (state?.fields || []).map(f => f.name);
if (!names.includes(fieldName)) {
throw new AssertionError(msg || `Field "${fieldName}" not found in form. Available: ${names.join(', ')}`, null, fieldName);
}
},
formTitle(state, expected, msg) {
if (!state?.title?.includes(expected)) throw new AssertionError(msg || `Form title "${state?.title}" does not contain "${expected}"`, state?.title, expected);
// `title` is null when the form exposes no caption and the open-windows panel is off —
// say so instead of reporting a mismatch against "null".
if (state?.title == null) {
throw new AssertionError(msg || `Form title is not available (state.title is null), expected it to contain "${expected}"`, null, expected);
}
if (!state.title.includes(expected)) {
throw new AssertionError(msg || `Form title "${state.title}" does not contain "${expected}"`, state.title, expected);
}
},
tableHasRow(table, predicate, msg) {
const rows = table?.rows || [];
@@ -1,4 +1,4 @@
// web-test cli/test-runner/discover v1.3 — test file discovery + state reset between tests
// web-test cli/test-runner/discover v1.4 — test file discovery + state reset between tests
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import { existsSync, readdirSync } from 'fs';
import { resolve } from 'path';
@@ -73,7 +73,9 @@ export async function resetState(ctx) {
return {
clean: false, attempts, lastError,
form: state.form,
title: state.activeTab || null,
// state.title is the form's own caption; activeTab reads the open-windows panel, which the
// user can switch off — keep it only as the fallback it always was.
title: state.title || state.activeTab || null,
modal: !!state.modal,
};
} catch (e) {
@@ -0,0 +1,55 @@
// web-test cli/test-runner/suite-root v1.0 — locate the suite root above a given test path
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import { existsSync, statSync } from 'fs';
import { resolve, dirname } from 'path';
// Files that MARK a suite root. Both count, not just the config: `webtest.config.mjs` is
// optional (a single-URL suite may pass --url= instead), and a suite that ships only
// `_hooks.mjs` must still be found — otherwise its stand preparation is silently skipped,
// which is worse than any URL error.
const MARKERS = ['webtest.config.mjs', '_hooks.mjs'];
// Files that BOUND the climb. A boundary never selects a root — it only stops the search,
// so a wrong boundary degrades to "root not found" (= the pre-v1.9 behaviour plus a clear
// message) and can never produce a wrong root. `package.json` is deliberately absent: it
// occurs nested and would stop the climb below a legitimate suite root.
const BOUNDARIES = ['.git', '.v8-project.json'];
const isDir = (p) => { try { return statSync(p).isDirectory(); } catch { return false; } };
/**
* Walk up from `startPath` looking for a suite root.
*
* @param {string} startPath A test file or directory (absolute or cwd-relative).
* @param {{cwd?: string}} [opts]
* @returns {{root: string, marker: string} | null} null when no marker was found within bounds.
*
* Stops after examining the first directory that contains `.git` / `.v8-project.json`
* (that directory IS examined for markers), or — when neither is met — after examining `cwd`.
* A path outside `cwd` degenerates to the filesystem root; the marker requirement still
* makes a wrong hit unlikely, and the resolved root is printed in the run banner.
*/
export function findSuiteRoot(startPath, { cwd = process.cwd() } = {}) {
const full = resolve(startPath);
let dir = isDir(full) ? full : dirname(full);
const cwdAbs = resolve(cwd);
while (true) {
for (const m of MARKERS) {
if (existsSync(resolve(dir, m))) return { root: dir, marker: m };
}
const atBoundary = BOUNDARIES.some(b => existsSync(resolve(dir, b))) || dir === cwdAbs;
const parent = dirname(dir);
if (atBoundary || parent === dir) return null;
dir = parent;
}
}
/**
* The directory a path contributes to root resolution — its own dir for a file, itself for
* a directory. Also the fallback root when no marker is found (pre-v1.9 behaviour).
*/
export function startDirOf(testPath) {
const full = resolve(testPath);
return isDir(full) ? full : dirname(full);
}
@@ -1,4 +1,4 @@
// web-test dom/form-state v1.0 — combined detectForm + readForm + open tabs
// web-test dom/form-state v1.1 — combined detectForm + readForm + open tabs + form caption
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import { DETECT_FORM_FN, DETECT_FORMS_FN, READ_FORM_FN } from './_shared.mjs';
@@ -26,7 +26,27 @@ export function getFormStateScript() {
openTabs.push(entry);
});
const activeTab = openTabs.find(t => t.active)?.name || null;
const result = { form: formNum, activeTab, openForms: meta.allForms, formCount: meta.formCount, ...formData };
// Caption of the ACTIVE form. Lives in an attribute, not in text — the div itself is empty:
// <div class="toplineBox" data-title="Контрагенты">
// <div id="VW_page1headerTopLine_title" class="toplineBoxTitle" title="Контрагенты"></div>
// Header numbering (VW_page<M>) does not match form numbering (form<N>), so the header cannot
// be picked by form number. Several headers can be visible at once — with a selection form up,
// BOTH the parent form's header and the pop-up's are visible — so "first visible" would report
// the parent's caption for the pop-up: a plausible, wrong answer.
// Priority is therefore the one already measured for the close cross (dom/forms.mjs
// closeCrossScript): floating window (ps<N>, highest index = topmost) → the form's own header →
// and only then the open-windows tab, which the user can switch off in 1C settings.
// Anchored on ids, not on the visible text, so a non-Russian locale keeps working.
const heads = [...document.querySelectorAll('[id*="headerTopLine_title"]')]
.filter(e => e.offsetWidth > 0 && e.offsetHeight > 0);
const floating = heads.filter(e => /ps\\d+headerTopLine_title$/.test(e.id));
const own = heads.filter(e => /^VW_page\\d+headerTopLine_title$/.test(e.id));
const head = floating.pop() || own.pop() || null;
let title = head
? (head.getAttribute('title') || head.parentElement?.getAttribute('data-title') || null)
: null;
if (!title) title = activeTab;
const result = { form: formNum, activeTab, title, openForms: meta.allForms, formCount: meta.formCount, ...formData };
if (meta.modal) result.modal = true;
if (openTabs.length) result.openTabs = openTabs;
return result;
@@ -1,4 +1,4 @@
// web-test core/state v1.17 — module-level state for the web-test engine.
// web-test core/state v1.18 — module-level state for the web-test engine.
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
//
// Holds the single browser/page/recorder slot plus the multi-context registry,
@@ -80,6 +80,11 @@ export const ACTION_WAIT = 2000; // fallback minimum wait
export const MAX_WAIT = 10000; // max wait for stability
export const POLL_INTERVAL = 200; // polling interval
export const STABLE_CYCLES = 3; // consecutive stable cycles needed
// Ceiling for the case where 1C is VISIBLY still working (its "Поиск…" state window is up).
// Higher than MAX_WAIT on purpose: a search on a production-sized list legitimately runs for
// tens of seconds, and returning mid-search hands the caller the previous rows — a wrong
// result that looks like a right one. Bounded so a wedged operation still ends the wait.
export const BUSY_MAX_WAIT = 60000;
// 1C browser extension ID (stable across versions, defined by key in manifest.json)
export const EXT_ID = 'pbhelknnhilelbnhfpcjlcabhmfangik';
@@ -1,30 +1,49 @@
// web-test core/wait v1.17 — Smart wait helpers: DOM stability polling, JS-expression polling, CDP network monitor.
// web-test core/wait v1.18 — Smart wait helpers: DOM stability polling, JS-expression polling, CDP network monitor.
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import { page, MAX_WAIT, POLL_INTERVAL, STABLE_CYCLES } from './state.mjs';
import { page, MAX_WAIT, BUSY_MAX_WAIT, POLL_INTERVAL, STABLE_CYCLES } from './state.mjs';
import { detectFormScript } from '../../dom.mjs';
/**
* Smart wait: poll until DOM is stable and no loading indicators are visible.
* Checks: form number change, loading indicators, DOM stability.
* Checks: form number change, loading indicators, busy state window, DOM stability.
* @param {number|null} previousFormNum — form number before the action (null = don't check)
*/
export async function waitForStable(previousFormNum = null) {
let stableCount = 0;
let lastSnapshot = '';
const start = Date.now();
let deadline = start + MAX_WAIT;
while (Date.now() - start < MAX_WAIT) {
while (Date.now() < deadline) {
await page.waitForTimeout(POLL_INTERVAL);
// Check for loading indicators
const status = await page.evaluate(`(() => {
const loading = document.querySelector('.loadingImage, .waitCurtain, .progressBar');
const isLoading = loading && loading.offsetWidth > 0;
// While a dynamic list is still searching, 1C floats a state window over the grid
// ("Поиск…") — and NOTHING else in the DOM says so: the old rows stay put, the element
// counters below don't move, so the page looks perfectly stable with stale data.
// Match busy markers by text, never "state window present": the same carrier also holds
// TERMINAL report messages ("Отчет не сформирован", "Не установлено значение параметра"),
// and waiting for those to disappear would hang until the timeout on every report.
const busy = [...document.querySelectorAll('.stateWindowSupportSurface')].some(el =>
el.offsetWidth > 0 && /^\\s*(Поиск|Ожид|Searching|Please wait)/i.test(el.innerText || ''));
const formCount = document.querySelectorAll('input.editInput[id], a.press[id]').length;
return { isLoading, formCount };
return { isLoading, busy, formCount };
})()`);
// A visible busy indicator outranks DOM stability — it is the only evidence we get that the
// server is still working. Push the deadline while it lasts (bounded by BUSY_MAX_WAIT) instead
// of reporting "stable": returning mid-search is what handed a caller the previous rows and
// let the next click open the wrong document.
if (status.busy) {
deadline = Math.min(Date.now() + MAX_WAIT, start + BUSY_MAX_WAIT);
stableCount = 0;
continue;
}
if (status.isLoading) {
stableCount = 0;
continue;
+4 -4
View File
@@ -35,7 +35,7 @@ allowed-tools:
## Команда
```powershell
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.ps1" <параметры>
python "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.py" <параметры>
```
### Параметры скрипта
@@ -52,11 +52,11 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.ps1"
```powershell
# Удалить одну публикацию
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.ps1" -AppName "bpdemo"
python "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.py" -AppName "bpdemo"
# Удалить все публикации
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.ps1" -All
python "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.py" -All
# С указанием пути
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.ps1" -AppName "mydb" -ApachePath "C:\tools\apache24"
python "${CLAUDE_SKILL_DIR}/scripts/web-unpublish.py" -AppName "mydb" -ApachePath "C:\tools\apache24"
```
-7
View File
@@ -1,7 +0,0 @@
# Коммиты, которые git blame должен «проскакивать» (механические правки —
# не меняют авторство содержимого). Включить локально:
# git config blame.ignoreRevsFile .git-blame-ignore-revs
# GitHub/GitLab уважают этот файл в blame-UI автоматически.
# chore(repo): нормализация EOL к LF + .gitattributes
26888a07d58351755fb8e487727c00d5b611eb95
-23
View File
@@ -1,23 +0,0 @@
# EOL policy
# ─────────────────────────────────────────────────────────────────────────────
# Авторский контент нормализуем к LF: инструмент правки (Edit) всегда пишет LF,
# поэтому единый LF убирает EOL-шум в диффах и ловушку «не правь CRLF-файл».
# git с eol=lf конвертит ТОЛЬКО CR<->LF и не трогает BOM (BOM — байты контента),
# поэтому BOM на .ps1 сохраняется.
*.ps1 text eol=lf
*.psm1 text eol=lf
*.py text eol=lf
*.mjs text eol=lf
*.md text eol=lf
*.json text eol=lf
.gitignore text eol=lf
# .bsl уже целиком LF — пин фиксирует статус-кво от будущего дрейфа.
*.bsl text eol=lf
# Данные 1С НЕ трогаем. *.xml — реальные выгрузки 1С (EOL местами значим,
# правим не мы, а навыки): оставляем как есть, под управление не берём.
# autocrlf=false и отсутствие text-атрибута => git хранит их байты как есть.
# Бинарники 1С
*.bin binary
-26
View File
@@ -1,26 +0,0 @@
# 1C Skills for {{PLATFORM_LABEL}} ({{RUNTIME_LABEL}})
Автоматическая сборка из [main]({{MAIN_REPO_URL}}) — навыки 1С:Предприятие 8.3 для AI-агента **{{PLATFORM_LABEL}}** с рантаймом **{{RUNTIME_LABEL}}**.
> Эта ветка генерируется CI на каждый push в main. **Не редактируйте напрямую** — все правки идут в [main]({{MAIN_REPO_URL}}).
## Установка
1. Скачайте ZIP этой ветки: **Code → Download ZIP** (или `git archive`).
2. Распакуйте в корень своего проекта — должна появиться папка `{{PLATFORM_DIR}}/`.
3. Запустите {{PLATFORM_LABEL}} из этого проекта — навыки станут доступны.
## Требования
{{RUNTIME_REQUIREMENTS}}
- **1С:Предприятие 8.3** — для сборки/разборки EPF/ERF и работы с базами.
- **Node.js 18+** — для `/web-test`.
## Документация
Полные гайды, спецификации и описание навыков — в [main]({{MAIN_REPO_URL}}).
---
Source: {{MAIN_REPO_URL}}
Build commit: `{{COMMIT_SHA}}`
-31
View File
@@ -1,31 +0,0 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "{{PLUGIN_NAME}}",
"description": "[Python] Навыки для разработки на 1С:Предприятие 8.3 — абстракции над XML-форматами и CLI конфигуратора, плюс глаза и руки для тестирования через веб-клиент. Linux/Mac или когда PowerShell недоступен.",
"author": {
"name": "Nikolay Shirokov"
},
"homepage": "https://github.com/Nikolay-Shirokov/cc-1c-skills",
"repository": "https://github.com/Nikolay-Shirokov/cc-1c-skills",
"license": "MIT",
"keywords": [
"1c",
"1c-dev",
"cf",
"cfe",
"epf",
"erf",
"metadata",
"configuration",
"extension",
"form",
"report",
"skd",
"data-processor",
"mxl",
"web-client",
"testing",
"test-automation"
],
"skills": "./.claude/skills/"
}
-36
View File
@@ -1,36 +0,0 @@
{
"name": "{{PLUGIN_NAME}}",
"version": "{{VERSION}}",
"description": "[{{RUNTIME_LABEL}}] Навыки для разработки на 1С:Предприятие 8.3 — абстракции над XML-форматами и CLI конфигуратора, плюс глаза и руки для тестирования через веб-клиент.",
"author": {
"name": "Nikolay Shirokov"
},
"homepage": "https://github.com/Nikolay-Shirokov/cc-1c-skills",
"repository": "https://github.com/Nikolay-Shirokov/cc-1c-skills",
"license": "MIT",
"keywords": [
"1c",
"1c-dev",
"cf",
"cfe",
"epf",
"erf",
"metadata",
"configuration",
"extension",
"form",
"report",
"skd",
"data-processor",
"mxl",
"web-client",
"testing",
"test-automation"
],
"skills": "./.codex/skills/",
"interface": {
"displayName": "1C Skills ({{RUNTIME_LABEL}})",
"shortDescription": "{{SHORT_DESCRIPTION}}",
"category": "Development"
}
}
-246
View File
@@ -1,246 +0,0 @@
name: Build port branches
on:
push:
branches: [main]
paths:
- '.claude/skills/**'
- 'scripts/switch.py'
- 'requirements.txt'
- '.github/templates/README.port.md.tmpl'
- '.github/templates/codex-plugin.json.tmpl'
- '.github/templates/claude-plugin.json.tmpl'
- '.github/workflows/build-ports.yml'
- 'LICENSE'
workflow_dispatch:
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- platform: claude-code
runtime: python
branch: port-claude-code-py
label: Claude Code
target_dir: .claude/skills
- platform: cursor
runtime: powershell
branch: port-cursor
label: Cursor
target_dir: .cursor/skills
- platform: cursor
runtime: python
branch: port-cursor-py
label: Cursor
target_dir: .cursor/skills
- platform: codex
runtime: powershell
branch: port-codex
label: Codex
target_dir: .codex/skills
- platform: codex
runtime: python
branch: port-codex-py
label: Codex
target_dir: .codex/skills
- platform: copilot
runtime: powershell
branch: port-copilot
label: GitHub Copilot
target_dir: .github/skills
- platform: copilot
runtime: python
branch: port-copilot-py
label: GitHub Copilot
target_dir: .github/skills
- platform: augment
runtime: powershell
branch: port-augment
label: Augment
target_dir: .augment/skills
- platform: augment
runtime: python
branch: port-augment-py
label: Augment
target_dir: .augment/skills
- platform: cline
runtime: powershell
branch: port-cline
label: Cline
target_dir: .cline/skills
- platform: cline
runtime: python
branch: port-cline-py
label: Cline
target_dir: .cline/skills
- platform: kilo
runtime: powershell
branch: port-kilo
label: Kilo Code
target_dir: .kilocode/skills
- platform: kilo
runtime: python
branch: port-kilo-py
label: Kilo Code
target_dir: .kilocode/skills
- platform: kiro
runtime: powershell
branch: port-kiro
label: Kiro
target_dir: .kiro/skills
- platform: kiro
runtime: python
branch: port-kiro-py
label: Kiro
target_dir: .kiro/skills
- platform: gemini
runtime: powershell
branch: port-gemini
label: Gemini CLI
target_dir: .gemini/skills
- platform: gemini
runtime: python
branch: port-gemini-py
label: Gemini CLI
target_dir: .gemini/skills
- platform: opencode
runtime: powershell
branch: port-opencode
label: OpenCode
target_dir: .opencode/skills
- platform: opencode
runtime: python
branch: port-opencode-py
label: OpenCode
target_dir: .opencode/skills
- platform: roo
runtime: powershell
branch: port-roo
label: Roo Code
target_dir: .roo/skills
- platform: roo
runtime: python
branch: port-roo-py
label: Roo Code
target_dir: .roo/skills
- platform: windsurf
runtime: powershell
branch: port-windsurf
label: Windsurf
target_dir: .windsurf/skills
- platform: windsurf
runtime: python
branch: port-windsurf-py
label: Windsurf
target_dir: .windsurf/skills
- platform: codeassistant
runtime: powershell
branch: port-codeassistant
label: Yandex Code Assistant
target_dir: .codeassistant/skills
- platform: codeassistant
runtime: python
branch: port-codeassistant-py
label: Yandex Code Assistant
target_dir: .codeassistant/skills
- platform: agents
runtime: powershell
branch: port-agents
label: Agent Skills
target_dir: .agents/skills
- platform: agents
runtime: python
branch: port-agents-py
label: Agent Skills
target_dir: .agents/skills
steps:
- name: Checkout main
uses: actions/checkout@v5
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: Build skills tree for ${{ matrix.platform }} (${{ matrix.runtime }})
run: |
python scripts/switch.py "${{ matrix.platform }}" \
--project-dir build \
--runtime "${{ matrix.runtime }}"
- name: Render port README
env:
PLATFORM_LABEL: ${{ matrix.label }}
PLATFORM_DIR: ${{ matrix.target_dir }}
RUNTIME: ${{ matrix.runtime }}
RUNTIME_LABEL: ${{ matrix.runtime == 'powershell' && 'PowerShell' || 'Python' }}
COMMIT_SHA: ${{ github.sha }}
MAIN_REPO_URL: https://github.com/${{ github.repository }}
run: |
if [ "$RUNTIME" = "powershell" ]; then
RUNTIME_REQUIREMENTS='- **Windows** с PowerShell 5.1+ (входит в Windows).'
else
RUNTIME_REQUIREMENTS='- **Python 3.9+**. Установка зависимостей: `pip install -r requirements.txt` (lxml, Pillow, psutil).'
fi
sed \
-e "s|{{PLATFORM_LABEL}}|${PLATFORM_LABEL}|g" \
-e "s|{{PLATFORM_DIR}}|${PLATFORM_DIR}|g" \
-e "s|{{RUNTIME_LABEL}}|${RUNTIME_LABEL}|g" \
-e "s|{{RUNTIME_REQUIREMENTS}}|${RUNTIME_REQUIREMENTS}|g" \
-e "s|{{COMMIT_SHA}}|${COMMIT_SHA}|g" \
-e "s|{{MAIN_REPO_URL}}|${MAIN_REPO_URL}|g" \
.github/templates/README.port.md.tmpl > build/README.md
- name: Render Codex plugin manifest
if: matrix.platform == 'codex'
env:
PLUGIN_NAME: ${{ matrix.runtime == 'python' && '1c-skills-py' || '1c-skills' }}
RUNTIME_LABEL: ${{ matrix.runtime == 'powershell' && 'PowerShell' || 'Python' }}
SHORT_DESCRIPTION: ${{ matrix.runtime == 'python' && 'Python runtime (Linux/Mac/Windows)' || 'PowerShell runtime (Windows-first)' }}
COMMIT_SHA: ${{ github.sha }}
run: |
VERSION="$(date -u +%Y.%-m.%-d)+${COMMIT_SHA::7}"
mkdir -p build/.codex-plugin
sed \
-e "s|{{PLUGIN_NAME}}|${PLUGIN_NAME}|g" \
-e "s|{{VERSION}}|${VERSION}|g" \
-e "s|{{RUNTIME_LABEL}}|${RUNTIME_LABEL}|g" \
-e "s|{{SHORT_DESCRIPTION}}|${SHORT_DESCRIPTION}|g" \
.github/templates/codex-plugin.json.tmpl > build/.codex-plugin/plugin.json
- name: Render Claude plugin manifest (Py variant)
if: matrix.platform == 'claude-code' && matrix.runtime == 'python'
env:
PLUGIN_NAME: 1c-skills-py
run: |
mkdir -p build/.claude-plugin
sed -e "s|{{PLUGIN_NAME}}|${PLUGIN_NAME}|g" \
.github/templates/claude-plugin.json.tmpl > build/.claude-plugin/plugin.json
- name: Copy LICENSE
run: cp LICENSE build/LICENSE
- name: Copy requirements.txt (Python builds only)
if: matrix.runtime == 'python'
run: cp requirements.txt build/requirements.txt
- name: Force-push orphan snapshot to ${{ matrix.branch }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cd build
git init -q -b master
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add -A
git commit -q -m "Auto-build: ${{ matrix.platform }} (${{ matrix.runtime }}) from ${GITHUB_SHA::7}"
git push --force \
"https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git" \
"master:${{ matrix.branch }}"
-52
View File
@@ -1,52 +0,0 @@
# Реальные выгрузки обработок (примеры, не для версионирования)
upload/
# Результаты сборки
build/
base/
*.epf
*.log
# Временные файлы тестов
test-tmp/
# Локальные настройки Claude Code
.claude/settings.local.json
# Инструменты (portable Apache и т.д.)
tools/
# Отладка навыков (eval, trigger-test, run_loop результаты)
debug/
# Кэш тестов навыков
tests/skills/.cache/
# Python кэш
__pycache__/
# Локальный реестр баз данных 1С
.v8-project.json
# web-test: Node.js зависимости и runtime-артефакты
.claude/skills/web-test/scripts/node_modules/
.claude/skills/web-test/.browser-session.json
# Скриншоты и видео (артефакты тестирования web-test)
*.png
*.mp4
# Навыки, скопированные для других AI-платформ (генерируются scripts/switch.py)
.agents/skills/
.augment/
.cline/
.codex/
.cursor/
.gemini/
.github/skills/
.kilocode/
.kiro/
.opencode/
.roo/
.windsurf/
debug-templates.txt
-35
View File
@@ -1,35 +0,0 @@
{
"v8path": "C:\\Program Files\\1cv8\\8.3.24.1691\\bin",
"databases": [
{
"id": "dev",
"name": "Разработка",
"type": "file",
"path": "C:\\Bases\\MyApp_Dev",
"user": "Администратор",
"password": "",
"aliases": ["dev", "разработка"],
"branches": ["dev", "develop", "feature/*"],
"configSrc": "src\\cf",
"webUrl": "http://localhost:8081/dev"
},
{
"id": "test",
"name": "Тестовая",
"type": "server",
"server": "srv01",
"ref": "MyApp_Test",
"user": "Администратор",
"password": "",
"aliases": ["test", "тест", "тестовая"],
"branches": ["main", "release/*"]
}
],
"default": "dev",
"webPath": "C:\\tools\\apache24",
"ffmpegPath": "C:\\tools\\ffmpeg\\bin\\ffmpeg.exe",
"tts": {
"provider": "edge",
"voice": "ru-RU-DmitryNeural"
}
}
+15 -269
View File
@@ -1,280 +1,26 @@
# 1C Skills for Claude Code
# 1C Skills for Claude Code (Python)
> **Проект живой, активно развивается** — добавляются новые возможности, отлавливаются и исправляются баги, производится оптимизация. Следите за обновлениями.
Автоматическая сборка из [main](https://github.com/Nikolay-Shirokov/cc-1c-skills) — навыки 1С:Предприятие 8.3 для AI-агента **Claude Code** с рантаймом **Python**.
Набор навыков для AI-агентов (в первую очередь для [Claude Code](https://docs.anthropic.com/en/docs/claude-code/skills)), помогающий охватить полный цикл разработки на платформе 1С:Предприятие 8.3 — от создания конфигураций, расширений, внешних обработок и отчётов до загрузки изменений в информационную базу, обновления, запуска, публикации на веб-сервере (портативная версия Apache), тестирования через веб-клиент и записи видеоинструкций.
> Эта ветка генерируется CI на каждый push в main. **Не редактируйте напрямую** — все правки идут в [main](https://github.com/Nikolay-Shirokov/cc-1c-skills).
Навыки дают модели готовые абстракции над XML-форматами и CLI конфигуратора — чтобы работать с сутью задачи, а не с деталями реализации. А веб-тестирование даёт ей глаза и руки для взаимодействия с интерфейсом 1С.
## Установка
## Версии навыков для разных платформ
> **PS** — версия со скриптами на PowerShell (стандартная, для Windows). **Py** — версия со скриптами на Python (если PowerShell не подходит). Можно начать с **PS** — это основной вариант.
**Claude Code** [PS](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/main) · [Py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-claude-code-py) — **Cursor** [PS](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-cursor) · [Py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-cursor-py) — **Codex** [PS](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-codex) · [Py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-codex-py) — [Другие платформы →](#поддерживаемые-платформы)
## Быстрый старт
Скопируйте каталог `.claude/skills/` из этого репозитория в корень вашего проекта. Навыки станут доступны при запуске Claude Code из этого каталога.
```
МойПроект/
├── .claude/skills/ ← скопировать сюда
└── ...
```
Или установите как плагин Claude Code:
```
/plugin marketplace add https://github.com/Nikolay-Shirokov/cc-1c-skills
/plugin install 1c-skills@cc-1c-skills # PowerShell (Windows)
/plugin install 1c-skills-py@cc-1c-skills # Python (Linux/Mac или если PS недоступен)
```
Или установите как плагин OpenAI Codex:
```
codex plugin marketplace add Nikolay-Shirokov/cc-1c-skills
codex /plugins # выберите 1c-skills (PowerShell) или 1c-skills-py (Python) и нажмите Install
```
Или используйте скрипт установки:
```bash
git clone https://github.com/Nikolay-Shirokov/cc-1c-skills.git tools/cc-1c-skills
# Копия (рекомендуется): независимая копия, обновление — повторный запуск
python tools/cc-1c-skills/scripts/switch.py claude-code --project-dir .
# Ссылки (экспериментально): обновления подхватываются через git pull
python tools/cc-1c-skills/scripts/switch.py claude-code --project-dir . --link
# Интерактивный режим: пошаговый выбор платформы, способа установки и рантайма
python tools/cc-1c-skills/scripts/switch.py
```
Не обязательно запоминать команды и параметры — просто опишите задачу своими словами, Claude сам подберёт нужные навыки. Слеш-команды (например `/epf-init МояОбработка`) тоже работают — для точного контроля.
## Группы навыков
| Группа | Навыки | Описание | Гайд |
|--------|--------|----------|------|
| Внешние обработки (EPF) | 7 навыков `/epf-*` | Создание, сборка, разборка, валидация обработок из XML-исходников | [Подробнее](docs/epf-guide.md) |
| Внешние отчёты (ERF) | 4 навыка `/erf-*` | Создание, сборка, разборка, валидация внешних отчётов | [Подробнее](docs/epf-guide.md#внешние-отчёты-erf) |
| Универсальные операции | `/template-add`, `/template-remove`, `/help-add`, `/form-remove` | Добавление/удаление макетов, форм, справки для любых объектов | [Подробнее](docs/epf-guide.md#универсальные-навыки) |
| Табличный документ (MXL) | 4 навыка `/mxl-*` | Анализ, создание, компиляция макетов печатных форм | [Подробнее](docs/mxl-guide.md) |
| Управляемые формы (Form) | 6 навыков `/form-*` | Создание, анализ, генерация, модификация, валидация управляемых форм | [Подробнее](docs/form-guide.md) |
| Роли (Role) | 3 навыка `/role-*` | Анализ прав роли, создание из JSON DSL, валидация | [Подробнее](docs/role-guide.md) |
| Схема компоновки (СКД) | 4 навыка `/skd-*` | Анализ, генерация из JSON DSL, точечное редактирование, валидация схем компоновки данных | [Подробнее](docs/skd-guide.md) |
| Метаданные конфигурации | 5 навыков `/meta-*` | Создание, анализ, редактирование, удаление, валидация объектов метаданных (23 типа) | [Подробнее](docs/meta-guide.md) |
| Корневая конфигурация | 4 навыка `/cf-*` | Создание, анализ, редактирование, валидация корневых файлов конфигурации | [Подробнее](docs/cf-guide.md) |
| Расширения (CFE) | 5 навыков `/cfe-*` | Создание, заимствование, перехват методов, валидация, анализ расширений | [Подробнее](docs/cfe-guide.md) |
| Подсистемы (Subsystem) | 4 навыка `/subsystem-*` | Анализ, создание, редактирование, валидация подсистем конфигурации | [Подробнее](docs/subsystem-guide.md) |
| Командный интерфейс (CI) | 2 навыка `/interface-*` | Редактирование и валидация CommandInterface.xml подсистем | [Подробнее](docs/subsystem-guide.md) |
| Базы данных (DB) | 9 навыков `/db-*` | Создание баз, загрузка/выгрузка конфигураций, обновление БД, загрузка из Git | [Подробнее](docs/db-guide.md) |
| Веб-публикация (Web) | 4 навыка `/web-*` | Публикация баз через Apache, статус, остановка, удаление публикаций | [Подробнее](docs/web-guide.md) |
| Тестирование (Web) | `/web-test` | Взаимодействие с веб-клиентом 1С — навигация, формы, таблицы, отчёты, тестирование | [Подробнее](docs/web-test-guide.md) |
| Запись видео (Web) | `/web-test` | Запись видеоинструкций с субтитрами, подсветкой и TTS-озвучкой | [Подробнее](docs/web-test-recording-guide.md) |
| Регресс прикладного решения (Web) | `/web-test` | Автоматический регресс конфигурации: тесты, проверки, отчёты, прогон после правок | [Подробнее](docs/web-test-regression-guide.md) |
| Утилиты | `/img-grid` | Наложение сетки на изображение для определения пропорций колонок | — |
1. Скачайте ZIP этой ветки: **Code → Download ZIP** (или `git archive`).
2. Распакуйте в корень своего проекта — должна появиться папка `.claude/skills/`.
3. Запустите Claude Code из этого проекта — навыки станут доступны.
## Требования
- **Windows** с PowerShell 5.1+ (входит в Windows) — рантайм по умолчанию
- **1С:Предприятие 8.3** — для сборки/разборки EPF/ERF (навыки генерации XML работают без платформы)
- **Node.js 18+** — для `/web-test` (тестирование через браузер)
- **Python 3.9+**. Установка зависимостей: `pip install -r requirements.txt` (lxml, Pillow, psutil).
- **1С:Предприятие 8.3** — для сборки/разборки EPF/ERF и работы с базами.
- **Node.js 18+** — для `/web-test`.
<a id="поддерживаемые-платформы"></a>
### Другие AI-платформы
## Документация
Навыки построены на открытом стандарте [Agent Skills](https://agentskills.io/specification) и совместимы с любой платформой, поддерживающей этот формат. Самый быстрый путь — скачать готовую сборку под нужную платформу из ветки ниже (**Code → Download ZIP**) и распаковать в корень своего проекта.
Полные гайды, спецификации и описание навыков — в [main](https://github.com/Nikolay-Shirokov/cc-1c-skills).
#### Поддерживаемые платформы
---
| Платформа | Целевой каталог | PowerShell | Python |
|-----------|----------------|------------|--------|
| Claude Code | `.claude/skills/` | [main](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/main) | [port-claude-code-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-claude-code-py) |
| Cursor | `.cursor/skills/` | [port-cursor](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-cursor) | [port-cursor-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-cursor-py) |
| OpenAI Codex | `.codex/skills/` | [port-codex](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-codex) | [port-codex-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-codex-py) |
| GitHub Copilot | `.github/skills/` | [port-copilot](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-copilot) | [port-copilot-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-copilot-py) |
| Augment | `.augment/skills/` | [port-augment](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-augment) | [port-augment-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-augment-py) |
| Cline | `.cline/skills/` | [port-cline](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-cline) | [port-cline-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-cline-py) |
| Kilo Code | `.kilocode/skills/` | [port-kilo](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-kilo) | [port-kilo-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-kilo-py) |
| Kiro | `.kiro/skills/` | [port-kiro](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-kiro) | [port-kiro-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-kiro-py) |
| Gemini CLI | `.gemini/skills/` | [port-gemini](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-gemini) | [port-gemini-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-gemini-py) |
| OpenCode | `.opencode/skills/` | [port-opencode](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-opencode) | [port-opencode-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-opencode-py) |
| Roo Code | `.roo/skills/` | [port-roo](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-roo) | [port-roo-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-roo-py) |
| Windsurf | `.windsurf/skills/` | [port-windsurf](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-windsurf) | [port-windsurf-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-windsurf-py) |
| Yandex Code Assistant | `.codeassistant/skills/` | [port-codeassistant](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-codeassistant) | [port-codeassistant-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-codeassistant-py) |
| Agent Skills | `.agents/skills/` | [port-agents](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-agents) | [port-agents-py](https://github.com/Nikolay-Shirokov/cc-1c-skills/tree/port-agents-py) |
Готовые ветки `port-*` пересобираются автоматически на каждое изменение в навыках. Если нужна свежая сборка прямо сейчас — соберите [локально через `switch.py`](#альтернативный-способ--собрать-локально-через-switchpy).
Некоторые платформы (Augment, Cline, VS Code/Copilot) также сканируют `.claude/skills/` как fallback — для них достаточно `main`.
<a id="альтернативный-способ--собрать-локально-через-switchpy"></a>
#### Альтернативный способ — собрать локально через `switch.py`
Если нужна свежая сборка под свою платформу (или платформа ещё не в матрице port-веток):
```bash
python scripts/switch.py # интерактивный режим
python scripts/switch.py cursor # скопировать навыки для Cursor
python scripts/switch.py cursor --runtime python # Cursor + Python-рантайм
python scripts/switch.py claude-code --project-dir /my/proj # установить копию в проект
python scripts/switch.py claude-code --project-dir /my/proj --link # ссылки вместо копий
python scripts/switch.py --undo cursor # удалить копию / ссылки
```
Если репозиторий склонирован внутрь проекта (например, в `tools/cc-1c-skills`), используйте `--project-dir` для установки навыков в целевой проект.
**Ссылки vs копии.** Флаг `--link` (экспериментальный) создаёт directory junction (Windows) или symlink (Linux/Mac) вместо копирования файлов. Обновления в источнике автоматически подхватываются во всех подключённых проектах — достаточно `git pull`. Ссылки доступны только для платформы Claude Code (для остальных платформ требуется перезапись путей в SKILL.md). Удаление ссылок: `--undo` — безопасно удаляет только ссылки, не трогая источник.
> ⚠ **Известные ограничения `--link`:** Node.js резолвит `__dirname` через junction к реальному пути источника, а не к каталогу проекта. Это может приводить к тому, что навыки с Node.js-скриптами (например, `/web-test`) будут записывать файлы в каталог репозитория навыков вместо каталога проекта. При возникновении проблем переключитесь на копирование (без `--link`).
Автоактивация — основной режим: просто опишите задачу своими словами, ассистент сам подберёт нужный навык по `description` в SKILL.md. Слеш-команды (например `/epf-init`) — для точного контроля, когда нужно вызвать конкретный навык.
### Переключение рантайма (PowerShell ↔ Python)
На Windows рекомендуется PS1-рантайм (по умолчанию). Python-порты — для **Linux/Mac** или если PowerShell недоступен. PS1-скрипты — мастер-версия; Python-порты производные (см. [Python Porting Guide](docs/python-porting-guide.md)).
```bash
python scripts/switch.py --runtime python # переключить на Python
python scripts/switch.py --runtime powershell # вернуть на PowerShell
```
Дополнительные зависимости Python-рантайма (Python 3.9+), одной командой — `pip install -r requirements.txt`:
- `lxml>=4.9.0` — для навыков, работающих с DOM (edit/validate/info)
- `Pillow>=10.0.0` — для `/img-grid` (чтение изображений и наложение сетки)
- `psutil>=5.9.0` — для web-навыков (управление Apache)
Параметры скриптов идентичны для обоих рантаймов — переключение меняет только интерпретатор в вызовах. Подробнее: [Python Porting Guide](docs/python-porting-guide.md).
## Спецификации
Полный индекс с оглавлением по всем 44 типам объектов: **[Сводный индекс спецификаций](docs/1c-specs-index.md)**
- [XML-формат выгрузки обработок](docs/1c-epf-spec.md) — структура XML-файлов, namespace, элементы форм
- [XML-формат внешних отчётов](docs/1c-erf-spec.md) — отличия ERF от EPF, Properties, MainDataCompositionSchema
- [Управляемая форма](docs/1c-form-spec.md) — Form.xml, элементы, команды, реквизиты
- [Встроенная справка](docs/1c-help-spec.md) — Help.xml, HTML-страницы, кнопка справки на форме
- [Пакетный режим конфигуратора 1С](docs/build-spec.md) — команды `1cv8.exe`, DESIGNER, ENTERPRISE, CREATEINFOBASE
- [Табличный документ (MXL)](docs/1c-spreadsheet-spec.md) — XML-формат SpreadsheetDocument, совместимость версий
- [MXL DSL](docs/mxl-dsl-spec.md) — JSON-формат описания макета для `/mxl-compile` и `/mxl-decompile`
- [Form DSL](docs/form-dsl-spec.md) — JSON-формат описания формы для `/form-compile`
- [Роли (Rights.xml)](docs/1c-role-spec.md) — XML-формат прав роли, типы объектов, RLS
- [Role DSL](docs/role-dsl-spec.md) — JSON-формат описания ролей для `/role-compile`
- [Схема компоновки данных (DCS)](docs/1c-dcs-spec.md) — XML-формат DataCompositionSchema, 930 схем проанализировано
- [SKD DSL](docs/skd-dsl-spec.md) — JSON-формат описания СКД для `/skd-compile`
- [Объекты конфигурации](docs/1c-config-objects-spec.md) — XML-формат объектов метаданных конфигурации (23 типа)
- [Подсистемы и командный интерфейс](docs/1c-subsystem-spec.md) — XML-формат подсистем, CommandInterface.xml, секции видимости/размещения/порядка
- [Корневая конфигурация](docs/1c-configuration-spec.md) — XML-формат Configuration.xml, ConfigDumpInfo.xml, Languages/, 44 типа ChildObjects
- [Расширения конфигурации (CFE)](docs/1c-extension-spec.md) — XML-формат выгрузки расширений конфигурации
- [Веб-публикация 1С](docs/web-spec.md) — VRD, httpd.conf, wsap24.dll, portable Apache
## Структура репозитория
```
.claude/skills/ # Навыки Claude Code
├── epf-init/ # Создание обработки
├── epf-build/ # Сборка EPF
├── epf-dump/ # Разборка EPF
├── epf-bsp-init/ # Регистрация БСП
├── epf-bsp-add-command/ # Команда БСП
├── epf-validate/ # Валидация обработки
├── erf-init/ # Создание внешнего отчёта
├── erf-build/ # Сборка ERF
├── erf-dump/ # Разборка ERF
├── erf-validate/ # Валидация отчёта
├── template-add/ # Добавление макета (универсальный)
├── template-remove/ # Удаление макета (универсальный)
├── form-add/ # Добавление формы (универсальный)
├── form-remove/ # Удаление формы (универсальный)
├── help-add/ # Добавление справки (универсальный)
├── mxl-info/ # Анализ макета
├── mxl-validate/ # Валидация макета
├── mxl-compile/ # Компиляция макета из JSON
├── mxl-decompile/ # Декомпиляция макета в JSON
├── form-info/ # Анализ структуры управляемой формы
├── form-compile/ # Компиляция формы из JSON
├── form-validate/ # Валидация формы
├── form-edit/ # Добавление элементов в форму
├── form-patterns/ # Справочник паттернов компоновки форм
├── role-info/ # Анализ прав роли
├── role-compile/ # Создание роли из JSON DSL
├── role-validate/ # Валидация роли
├── skd-info/ # Анализ схемы компоновки данных
├── skd-compile/ # Компиляция СКД из JSON DSL
├── skd-edit/ # Точечное редактирование СКД (25 операций)
├── skd-validate/ # Валидация СКД
├── meta-info/ # Структура объекта метаданных
├── meta-compile/ # Создание объекта метаданных
├── meta-edit/ # Редактирование объекта метаданных
├── meta-remove/ # Удаление объекта метаданных
├── meta-validate/ # Валидация объекта метаданных
├── cf-info/ # Анализ структуры конфигурации
├── cf-init/ # Создание пустой конфигурации
├── cf-edit/ # Редактирование конфигурации
├── cf-validate/ # Валидация конфигурации
├── cfe-init/ # Создание расширения
├── cfe-borrow/ # Заимствование объектов
├── cfe-patch-method/ # Перехват методов
├── cfe-validate/ # Валидация расширения
├── cfe-diff/ # Анализ и сравнение
├── subsystem-info/ # Анализ структуры подсистемы
├── subsystem-compile/ # Создание подсистемы из JSON
├── subsystem-edit/ # Редактирование подсистемы
├── subsystem-validate/ # Валидация подсистемы
├── interface-edit/ # Редактирование CommandInterface.xml
├── interface-validate/ # Валидация CommandInterface.xml
├── db-list/ # Управление реестром баз данных
├── db-create/ # Создание информационной базы
├── db-dump-cf/ # Выгрузка конфигурации в CF
├── db-load-cf/ # Загрузка конфигурации из CF
├── db-dump-xml/ # Выгрузка конфигурации в XML
├── db-load-xml/ # Загрузка конфигурации из XML
├── db-update/ # Обновление конфигурации БД
├── db-run/ # Запуск 1С:Предприятие
├── db-load-git/ # Загрузка изменений из Git
├── web-publish/ # Публикация базы через Apache
├── web-info/ # Статус Apache и публикаций
├── web-stop/ # Остановка Apache
├── web-unpublish/ # Удаление публикации
├── web-test/ # Тестирование через веб-клиент 1С
└── img-grid/ # Сетка для анализа изображений
scripts/
└── switch.py # Переключение платформы и рантайма (13 платформ)
docs/
├── epf-guide.md # Гайд: внешние обработки и отчёты
├── mxl-guide.md # Гайд: табличный документ
├── form-guide.md # Гайд: управляемые формы
├── role-guide.md # Гайд: роли
├── skd-guide.md # Гайд: схема компоновки данных
├── meta-guide.md # Гайд: объекты метаданных конфигурации
├── cf-guide.md # Гайд: корневые файлы конфигурации
├── cfe-guide.md # Гайд: расширения конфигурации (CFE)
├── subsystem-guide.md # Гайд: подсистемы и командный интерфейс
├── v8-project-guide.md # Гайд: конфигурация проекта (.v8-project.json)
├── db-guide.md # Гайд: базы данных 1С
├── web-guide.md # Гайд: веб-публикация через Apache
├── web-test-guide.md # Гайд: тестирование через веб-клиент
├── web-test-recording-guide.md # Гайд: запись видеоинструкций
├── web-test-regression-guide.md # Гайд: регресс прикладного решения
├── 1c-epf-spec.md # Спецификация XML-формата (EPF)
├── 1c-erf-spec.md # Спецификация XML-формата (ERF)
├── 1c-form-spec.md # Спецификация управляемых форм
├── 1c-help-spec.md # Спецификация встроенной справки
├── 1c-config-objects-spec.md # Спецификация объектов конфигурации
├── build-spec.md # Пакетный режим конфигуратора 1С
├── 1c-spreadsheet-spec.md # Спецификация табличного документа
├── mxl-dsl-spec.md # Спецификация MXL DSL
├── form-dsl-spec.md # Спецификация Form DSL
├── meta-dsl-spec.md # Спецификация Meta DSL
├── 1c-role-spec.md # Спецификация ролей (Rights.xml)
├── 1c-dcs-spec.md # Спецификация СКД (DataCompositionSchema)
├── skd-dsl-spec.md # Спецификация SKD DSL
├── role-dsl-spec.md # Спецификация Role DSL
├── 1c-extension-spec.md # Спецификация расширений конфигурации (CFE)
├── 1c-subsystem-spec.md # Спецификация подсистем и командного интерфейса
├── web-spec.md # Спецификация веб-публикации (VRD, httpd.conf, Apache)
└── python-porting-guide.md # Руководство по Python-портам навыков
```
Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
Build commit: `8826a8842730ff43daae9f76556c8bf78a17dbe6`
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-1043
View File
File diff suppressed because it is too large Load Diff
-785
View File
@@ -1,785 +0,0 @@
# Спецификация XML-формата выгрузки внешней обработки 1С
Формат: XML-выгрузка внешней обработки (ExternalDataProcessor) из конфигуратора 1С:Предприятие 8.3.
Версия формата: `2.17`.
> **Связанная спецификация**: Для внешних отчётов (ExternalReport / ERF) см. [1c-erf-spec.md](1c-erf-spec.md). Формат отчётов основан на формате обработок с дополнительными свойствами для СКД и вариантов.
## 1. Структура каталогов
```
<ИмяОбработки>.xml # Корневой файл метаданных
<ИмяОбработки>/
Ext/
ObjectModule.bsl # Модуль объекта (опционально)
Help.xml # Метаданные справки (опционально)
Help/
ru.html # HTML-страница справки
Forms/
<ИмяФормы>.xml # Метаданные формы
<ИмяФормы>/
Ext/
Form.xml # Описание формы (элементы, реквизиты, команды)
Form/
Module.bsl # Модуль формы
Templates/
<ИмяМакета>.xml # Метаданные макета
<ИмяМакета>/
Ext/
Template.<расш> # Тело макета: .html, .xml (mxl) и др.
```
Обработка может содержать:
- 0..N реквизитов объекта (описаны в корневом XML)
- 0..N табличных частей (описаны в корневом XML)
- 0..N форм (каталог `Forms/`)
- 0..N макетов (каталог `Templates/`)
- 0..1 модуль объекта (`Ext/ObjectModule.bsl`)
- 0..1 встроенная справка (`Ext/Help.xml` + `Ext/Help/<язык>.html`), см. [1c-help-spec.md](1c-help-spec.md)
## 2. Пространства имён XML
### 2.1. Файлы метаданных (корневой XML, формы, макеты)
Корневой элемент — `<MetaDataObject>`, пространство имён:
```
xmlns="http://v8.1c.ru/8.3/MDClasses"
```
Полный набор деклараций (можно копировать как есть):
```xml
<MetaDataObject
xmlns="http://v8.1c.ru/8.3/MDClasses"
xmlns:app="http://v8.1c.ru/8.2/managed-application/core"
xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config"
xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi"
xmlns:ent="http://v8.1c.ru/8.1/data/enterprise"
xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform"
xmlns:style="http://v8.1c.ru/8.1/data/ui/style"
xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system"
xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:v8ui="http://v8.1c.ru/8.1/data/ui"
xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web"
xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows"
xmlns:xen="http://v8.1c.ru/8.3/xcf/enums"
xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef"
xmlns:xr="http://v8.1c.ru/8.3/xcf/readable"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.17">
```
### 2.2. Описание формы (Form.xml)
Корневой элемент — `<Form>`, пространство имён:
```
xmlns="http://v8.1c.ru/8.3/xcf/logform"
```
Полный набор деклараций:
```xml
<Form
xmlns="http://v8.1c.ru/8.3/xcf/logform"
xmlns:app="http://v8.1c.ru/8.2/managed-application/core"
xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config"
xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core"
xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"
xmlns:ent="http://v8.1c.ru/8.1/data/enterprise"
xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform"
xmlns:style="http://v8.1c.ru/8.1/data/ui/style"
xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system"
xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:v8ui="http://v8.1c.ru/8.1/data/ui"
xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web"
xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows"
xmlns:xr="http://v8.1c.ru/8.3/xcf/readable"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.17">
```
**Ключевое отличие**: файлы метаданных используют `http://v8.1c.ru/8.3/MDClasses`, описание формы — `http://v8.1c.ru/8.3/xcf/logform`.
## 3. Корневой файл обработки (`<Имя>.xml`)
Определяет имя обработки, синоним, форму по умолчанию и список дочерних объектов.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="..." version="2.17">
<ExternalDataProcessor uuid="<UUID>">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>c3831ec8-d8d5-4f93-8a22-f9bfae07327f</xr:ClassId>
<xr:ObjectId><UUID></xr:ObjectId>
</xr:ContainedObject>
<xr:GeneratedType name="ExternalDataProcessorObject.<Имя>" category="Object">
<xr:TypeId><UUID></xr:TypeId>
<xr:ValueId><UUID></xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name><Имя></Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content><Представление></v8:content>
</v8:item>
</Synonym>
<Comment/>
<DefaultForm>ExternalDataProcessor.<Имя>.Form.<ИмяФормы></DefaultForm>
<AuxiliaryForm/>
</Properties>
<ChildObjects>
<!-- Реквизиты объекта (опционально) -->
<Attribute uuid="<UUID>">...</Attribute>
<!-- Табличные части (опционально) -->
<TabularSection uuid="<UUID>">...</TabularSection>
<!-- Формы -->
<Form><ИмяФормы></Form>
<!-- Макеты -->
<Template><ИмяМакета></Template>
</ChildObjects>
</ExternalDataProcessor>
</MetaDataObject>
```
### Правила
| Элемент | Описание |
|---------|----------|
| `ClassId` | Всегда `c3831ec8-d8d5-4f93-8a22-f9bfae07327f` (идентификатор класса ExternalDataProcessor) |
| `ObjectId`, `TypeId`, `ValueId` | Уникальные UUID, генерируются при создании |
| `DefaultForm` | Полный путь: `ExternalDataProcessor.<Имя>.Form.<ИмяФормы>` |
| `<Form>`, `<Template>` | Только имена (без путей), соответствуют именам подкаталогов в `Forms/` и `Templates/` |
| `<Attribute>` | Реквизиты объекта обработки (полное описание с типами) |
| `<TabularSection>` | Полное описание табличных частей объекта (включая реквизиты ТЧ с типами) |
### Порядок элементов в ChildObjects
Порядок дочерних объектов **фиксирован**:
1. `<Attribute>` — реквизиты объекта (0..N)
2. `<TabularSection>` — табличные части (0..N)
3. `<Form>` — формы (0..N)
4. `<Template>` — макеты (0..N)
### Реквизиты объекта
Если обработка имеет реквизиты объекта, они описываются в `<ChildObjects>` корневого файла:
```xml
<Attribute uuid="<UUID>">
<Properties>
<Name><ИмяРеквизита></Name>
<Synonym/>
<Comment/>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>10</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
```
#### Свойства реквизита объекта (полный перечень)
Порядок фиксирован:
| Свойство | Тип | Описание | Значение по умолчанию |
|----------|-----|----------|----------------------|
| `Name` | string | Имя реквизита | — |
| `Synonym` | LocalString | Синоним (отображаемое имя) | — |
| `Comment` | string | Комментарий | пустой |
| `Type` | TypeDescription | Тип данных | — |
| `PasswordMode` | boolean | Режим пароля | `false` |
| `Format` | string | Формат вывода | пустой |
| `EditFormat` | string | Формат редактирования | пустой |
| `ToolTip` | LocalString | Подсказка | пустой |
| `MarkNegatives` | boolean | Выделять отрицательные | `false` |
| `Mask` | string | Маска ввода | пустой |
| `MultiLine` | boolean | Многострочный | `false` |
| `ExtendedEdit` | boolean | Расширенное редактирование | `false` |
| `MinValue` | any | Минимальное значение | `xsi:nil="true"` |
| `MaxValue` | any | Максимальное значение | `xsi:nil="true"` |
| `FillChecking` | enum | Проверка заполнения | `DontCheck` |
| `ChoiceFoldersAndItems` | enum | Выбор групп и элементов | `Items` |
| `ChoiceParameterLinks` | list | Связи параметров выбора | пустой |
| `ChoiceParameters` | list | Параметры выбора | пустой |
| `QuickChoice` | enum | Быстрый выбор | `Auto` |
| `CreateOnInput` | enum | Создание при вводе | `Auto` |
| `ChoiceForm` | string | Форма выбора | пустой |
| `LinkByType` | ref | Связь по типу | пустой |
| `ChoiceHistoryOnInput` | enum | История выбора при вводе | `Auto` |
#### Типы реквизитов
| v8:Type | Описание | Квалификаторы |
|---------|----------|---------------|
| `xs:string` | Строка | `v8:StringQualifiers`: `Length`, `AllowedLength` (Variable/Fixed) |
| `xs:boolean` | Булево | — |
| `xs:decimal` | Число | `v8:NumberQualifiers`: `Digits`, `FractionDigits`, `AllowedSign` (Any/Nonnegative) |
| `xs:dateTime` | Дата | `v8:DateQualifiers`: `DateFractions` (Date/Time/DateTime) |
| `cfg:CatalogRef.<Имя>` | Ссылка на справочник | — |
| `cfg:DocumentRef.<Имя>` | Ссылка на документ | — |
| `cfg:EnumRef.<Имя>` | Ссылка на перечисление | — |
> **Примечание**: Ссылочные типы (`cfg:CatalogRef.*` и т.д.) работают **только** при наличии в информационной базе конфигурации с соответствующими объектами.
### Табличные части объекта
Если обработка имеет табличные части, они описываются в `<ChildObjects>` корневого файла:
```xml
<TabularSection uuid="<UUID>">
<InternalInfo>
<xr:GeneratedType name="DataProcessorTabularSection.<ИмяОбработки>.<ИмяТЧ>" category="TabularSection">
<xr:TypeId><UUID></xr:TypeId>
<xr:ValueId><UUID></xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DataProcessorTabularSectionRow.<ИмяОбработки>.<ИмяТЧ>" category="TabularSectionRow">
<xr:TypeId><UUID></xr:TypeId>
<xr:ValueId><UUID></xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name><ИмяТЧ></Name>
<Synonym>...</Synonym>
<Comment/>
<ToolTip/>
<FillChecking>DontCheck</FillChecking>
<StandardAttributes>
<xr:StandardAttribute name="LineNumber">
<!-- Стандартные свойства реквизита -->
</xr:StandardAttribute>
</StandardAttributes>
</Properties>
<ChildObjects>
<Attribute uuid="<UUID>">
<Properties>
<Name><ИмяРеквизита></Name>
<Synonym/>
<Comment/>
<Type>...</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
</ChildObjects>
</TabularSection>
```
> **Важно**: Реквизиты табличных частей имеют 2 дополнительных свойства по сравнению с реквизитами объекта: `FillFromFillingValue` и `FillValue`. Они вставляются между `MaxValue` и `FillChecking`. При этом свойства `Indexing`, `FullTextSearch`, `DataHistory` и `Use` **отсутствуют** как у реквизитов объекта, так и у реквизитов ТЧ обработок/отчётов (в отличие от хранимых объектов конфигурации).
## 4. Метаданные формы (`Forms/<Имя>.xml`)
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="..." version="2.17">
<Form uuid="<UUID>">
<Properties>
<Name><ИмяФормы></Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content><Представление></v8:content>
</v8:item>
</Synonym>
<Comment/>
<FormType>Managed</FormType>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UsePurposes>
<v8:Value xsi:type="app:ApplicationUsePurpose">PlatformApplication</v8:Value>
</UsePurposes>
<ExtendedPresentation/>
</Properties>
</Form>
</MetaDataObject>
```
`FormType` — всегда `Managed` для управляемых форм.
## 5. Метаданные макета (`Templates/<Имя>.xml`)
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="..." version="2.17">
<Template uuid="<UUID>">
<Properties>
<Name><ИмяМакета></Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content><Представление></v8:content>
</v8:item>
</Synonym>
<Comment/>
<TemplateType><ТипМакета></TemplateType>
</Properties>
</Template>
</MetaDataObject>
```
### Типы макетов
| Значение `TemplateType` | Расширение файла тела | Описание |
|---|---|---|
| `SpreadsheetDocument` | `.xml` | Табличный документ (MXL в XML) |
| `DataCompositionSchema` | `.xml` | Схема компоновки данных (СКД), см. [1c-dcs-spec.md](1c-dcs-spec.md) |
| `HTMLDocument` | `.html` | HTML-документ |
| `TextDocument` | `.txt` | Текстовый документ |
| `BinaryData` | `.bin` | Двоичные данные |
| `ActiveDocument` | `.xml` | Активный документ |
## 6. Описание формы (`Form.xml`)
Самый сложный файл. Содержит три корневых секции:
- `<ChildItems>` — дерево элементов формы (визуальная структура)
- `<Attributes>` — реквизиты формы (данные)
- `<Commands>` — команды формы
### 6.1. Общая структура
```xml
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" ... version="2.17">
<Title>...</Title>
<AutoTitle>false</AutoTitle>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<Autofill>false</Autofill>
</AutoCommandBar>
<Events>
<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
</Events>
<ChildItems>
<!-- Элементы формы -->
</ChildItems>
<Attributes>
<!-- Реквизиты формы -->
</Attributes>
<Commands>
<!-- Команды формы -->
</Commands>
</Form>
```
### 6.2. Идентификаторы (id)
- Каждый элемент, реквизит и команда имеет уникальный `id` (целое число).
- `id` уникален в пределах своей секции: элементы, реквизиты и команды нумеруются независимо.
- `id="-1"` зарезервирован для `AutoCommandBar` формы.
- `id` колонок (`Column`) — уникальны в пределах своего реквизита.
### 6.3. Элементы формы (`<ChildItems>`)
#### Типы элементов
| XML-тег | Описание | Ключевые свойства |
|---------|----------|-------------------|
| `UsualGroup` | Обычная группа | `Group` (Vertical/Horizontal), `Representation`, `ShowTitle` |
| `Button` | Кнопка | `Type` (UsualButton/CommandBarButton), `CommandName` |
| `InputField` | Поле ввода | `DataPath`, `MinValue`, `MaxValue` |
| `CheckBoxField` | Флажок | `DataPath`, `CheckBoxType`, `ThreeState`, `ReadOnly` |
| `LabelField` | Поле надписи | `DataPath` (только отображение) |
| `LabelDecoration` | Декорация-надпись | `Title` (статический текст) |
| `FormTree` | Дерево формы | `DataPath`, `Header`, `RowPictureDataPath` |
| `Table` | Таблица формы | `DataPath`, `Representation` (List/Tree), `ChangeRowSet` |
| `HTMLDocumentField` | Поле HTML-документа | `DataPath` |
| `CommandBar` | Командная панель (внутри элемента) | `Autofill` |
| `Popup` | Подменю на командной панели | `Title`, `Picture` |
#### Правила DataPath
- Простые реквизиты: `DataPath` = имя реквизита формы. Пример: `<DataPath>СтрокаПоиска</DataPath>`
- Колонки таблицы/дерева (реквизит формы): `<ИмяРеквизита>.<ИмяКолонки>`. Пример: `<DataPath>ТаблицаРеквизитов.Пометка</DataPath>`
- Табличные части объекта: `Объект.<ИмяТЧ>.<ИмяРеквизита>`. Пример: `<DataPath>Объект.ТЧМетаданные.Флаг</DataPath>`
#### ExtendedTooltip
Каждый элемент формы **должен** иметь дочерний `<ExtendedTooltip>`. Минимальная форма:
```xml
<ExtendedTooltip name="<ИмяЭлемента>ExtendedTooltip" id="<ID>"/>
```
Имя: `<ИмяРодительскогоЭлемента>ExtendedTooltip`. Может содержать `<Title>` с текстом подсказки.
#### ContextMenu
Элементы, поддерживающие контекстное меню (`InputField`, `CheckBoxField`, `LabelField`, `FormTree`, `Table`, `HTMLDocumentField`), **должны** иметь:
```xml
<ContextMenu name="<ИмяЭлемента>КонтекстноеМеню" id="<ID>"/>
```
#### Пример: группа с кнопками
```xml
<UsualGroup name="ГруппаКоманд" id="1">
<Title><v8:item><v8:lang>ru</v8:lang><v8:content>Команды</v8:content></v8:item></Title>
<Representation>None</Representation>
<ShowTitle>false</ShowTitle>
<ExtendedTooltip name="ГруппаКомандExtendedTooltip" id="100"/>
<ChildItems>
<Button name="КнопкаПостроить" id="2">
<Type>UsualButton</Type>
<Title>...</Title>
<CommandName>Form.Command.Построить</CommandName>
<ExtendedTooltip name="КнопкаПостроитьExtendedTooltip" id="101"/>
</Button>
</ChildItems>
</UsualGroup>
```
#### Пример: FormTree (дерево)
```xml
<FormTree name="ДеревоМетаданных" id="11">
<DataPath>ДеревоМетаданных</DataPath>
<TitleLocation>None</TitleLocation>
<ContextMenu name="ДеревоМетаданныхКонтекстноеМеню" id="12"/>
<ExtendedTooltip name="ДеревоМетаданныхExtendedTooltip" id="108"/>
<CommandBar name="ДеревоМетаданныхКоманднаяПанель" id="13">
<Autofill>false</Autofill>
<ExtendedTooltip name="ДеревоМетаданныхКоманднаяПанельExtendedTooltip" id="109"/>
</CommandBar>
<Header>false</Header>
<RowPictureDataPath>ДеревоМетаданных.ИндексКартинки</RowPictureDataPath>
<Events>
<Event name="OnActivateRow">ДеревоМетаданныхПриАктивизацииСтроки</Event>
</Events>
<ChildItems>
<!-- Колонки как дочерние элементы -->
<CheckBoxField name="ДеревоМетаданныхПометка" id="14">
<DataPath>ДеревоМетаданных.Пометка</DataPath>
...
</CheckBoxField>
</ChildItems>
</FormTree>
```
#### Пример: Table (таблица, привязанная к реквизиту формы типа ValueTable)
```xml
<Table name="ТаблицаРеквизитов" id="26">
<DataPath>ТаблицаРеквизитов</DataPath>
<TitleLocation>None</TitleLocation>
<ContextMenu name="ТаблицаРеквизитовКонтекстноеМеню" id="27"/>
<ExtendedTooltip name="ТаблицаРеквизитовExtendedTooltip" id="119"/>
<CommandBar name="ТаблицаРеквизитовКоманднаяПанель" id="28">
<Autofill>false</Autofill>
<ExtendedTooltip name="ТаблицаРеквизитовКоманднаяПанельExtendedTooltip" id="120"/>
</CommandBar>
<ChangeRowSet>false</ChangeRowSet>
<ChangeRowOrder>false</ChangeRowOrder>
<ChildItems>
<CheckBoxField name="ТаблицаРеквизитовПометка" id="29">
<DataPath>ТаблицаРеквизитов.Пометка</DataPath>
...
</CheckBoxField>
</ChildItems>
</Table>
```
#### Table: режим дерева
Элемент `Table` может отображать данные как дерево через `<Representation>Tree</Representation>`. В этом случае реквизит формы должен иметь тип `v8:ValueTree`.
```xml
<Table name="ДеревоМетаданных" id="238">
<Representation>Tree</Representation>
<DataPath>ДеревоМетаданных</DataPath>
...
</Table>
```
> **Примечание**: Элемент `FormTree` — альтернативный способ отобразить дерево. `FormTree` не требует явного указания `<Representation>`, дерево подразумевается. `Table` с `<Representation>Tree</Representation>` — более полный элемент с дополнительными возможностями (SearchStringAddition, ViewStatusAddition и др.).
#### Table: привязка к ТЧ объекта vs реквизит формы
| Источник данных | DataPath таблицы | DataPath колонки | Тип реквизита |
|---|---|---|---|
| Табличная часть объекта | `Объект.<ИмяТЧ>` | `Объект.<ИмяТЧ>.<ИмяРеквизита>` | (определён в корневом XML) |
| Реквизит формы (ValueTable) | `<ИмяРеквизита>` | `<ИмяРеквизита>.<ИмяКолонки>` | `v8:ValueTable` |
| Реквизит формы (ValueTree) | `<ИмяРеквизита>` | `<ИмяРеквизита>.<ИмяКолонки>` | `v8:ValueTree` |
### 6.4. Реквизиты формы (`<Attributes>`)
#### Примитивные типы
```xml
<Attribute name="СтрокаПоиска" id="18">
<Title><v8:item><v8:lang>ru</v8:lang><v8:content>Строка поиска</v8:content></v8:item></Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>200</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
</Attribute>
```
#### Таблица типов
| v8:Type | Описание | Квалификаторы |
|---------|----------|---------------|
| `xs:string` | Строка | `v8:StringQualifiers`: `Length` (0 = неограниченная), `AllowedLength` (Variable/Fixed) |
| `xs:boolean` | Булево | — |
| `xs:decimal` | Число | `v8:NumberQualifiers`: `Digits`, `FractionDigits`, `AllowedSign` (Any/Nonnegative) |
| `xs:dateTime` | Дата | `v8:DateQualifiers`: `DateFractions` (Date/Time/DateTime) |
| `v8:ValueTable` | Таблица значений | Должен содержать `<Columns>` |
| `v8:ValueTree` | Дерево значений | Должен содержать `<Columns>` |
| `v8:UUID` | Уникальный идентификатор | — |
| `cfg:ExternalDataProcessorObject.<Имя>` | Объект обработки (основной реквизит) | `<MainAttribute>true</MainAttribute>` |
| `cfg:CatalogRef.<Имя>` | Ссылка на справочник | — |
| `xmlns:mxl="http://v8.1c.ru/8.2/data/spreadsheet"` `mxl:SpreadsheetDocument` | Табличный документ | Требует дополнительное объявление namespace `mxl` |
> **ВАЖНО**: Для коллекций (ValueTable, ValueTree) тип **обязателен**. Пустой `<Type/>` приведёт к ошибке «Неверный путь к данным» при обращении к колонкам через DataPath.
#### Коллекции: ValueTable и ValueTree
```xml
<Attribute name="ТаблицаРеквизитов" id="8">
<Title>...</Title>
<Type>
<v8:Type>v8:ValueTable</v8:Type>
</Type>
<Columns>
<Column name="Пометка" id="1">
<Title>...</Title>
<Type>
<v8:Type>xs:boolean</v8:Type>
</Type>
</Column>
<Column name="ИмяРеквизита" id="2">
<Title>...</Title>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>150</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
</Column>
</Columns>
</Attribute>
```
Для дерева — `v8:ValueTree`, структура аналогична.
#### Основной реквизит (Объект)
Связывает форму с объектом обработки. Обязателен для доступа к табличным частям и модулю объекта.
```xml
<Attribute name="Объект" id="20">
<Type>
<v8:Type>cfg:ExternalDataProcessorObject.<ИмяОбработки></v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
```
### 6.5. Команды формы (`<Commands>`)
```xml
<Command name="Построить" id="1">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Построить</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Построить ER-диаграмму</v8:content>
</v8:item>
</ToolTip>
<Action>КомандаПостроить</Action>
<CurrentRowUse>DontUse</CurrentRowUse>
</Command>
```
Команда привязывается к кнопке через `CommandName`:
```xml
<Button ...>
<CommandName>Form.Command.Построить</CommandName>
</Button>
```
### 6.6. События формы и элементов
#### События формы
```xml
<Events>
<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
<Event name="OnOpen">ПриОткрытии</Event>
</Events>
```
#### События элементов (внутри элемента)
```xml
<Events>
<Event name="OnChange">ДеревоМетаданныхПометкаПриИзменении</Event>
<Event name="OnActivateRow">ДеревоМетаданныхПриАктивизацииСтроки</Event>
</Events>
```
| Имя события | Описание |
|-------------|----------|
| `OnCreateAtServer` | При создании на сервере (форма) |
| `OnOpen` | При открытии (форма) |
| `OnChange` | При изменении (элементы ввода, флажки) |
| `OnActivateRow` | При активизации строки (дерево, таблица) |
| `OnEditEnd` | При окончании редактирования (таблица) |
## 7. Модули BSL
### 7.1. Модуль объекта (`ObjectModule.bsl`)
Серверная логика без контекста формы. Доступен через `РеквизитФормыВЗначение("Объект")`.
```bsl
// Экспортные функции — API объекта
Функция ПолучитьДанные() Экспорт
// ...
КонецФункции
```
### 7.2. Модуль формы (`Module.bsl`)
Обработчики событий формы, элементов и команд.
Директивы компиляции:
- `&НаСервере` — выполняется на сервере, есть доступ к реквизитам формы
- `&НаКлиенте` — выполняется на клиенте
- `&НаСервереБезКонтекста` — на сервере без контекста формы
```bsl
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
// ... вызовы функций модуля объекта
КонецПроцедуры
#КонецОбласти
```
## 8. Генерация UUID
Все UUID в XML-файлах должны быть валидными UUID v4. Формат: `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`.
При генерации нового проекта каждый UUID должен быть уникальным. UUID используются для:
- Идентификации объекта обработки (`ExternalDataProcessor uuid`)
- Внутренних типов (`ContainedObject`, `GeneratedType`)
- Форм (`Form uuid`)
- Макетов (`Template uuid`)
- Табличных частей и их реквизитов
## 9. Известные ошибки и подводные камни
### «Неверный путь к данным» для колонок таблицы
**Проблема**: При загрузке формы конфигуратор выдаёт ошибку «Неверный путь к данным: <Реквизит>.<Колонка>» для всех колонок таблицы.
**Причина**: Реквизит формы с колонками (`<Columns>`) не имеет правильного типа. Для коллекций тип обязателен:
- `v8:ValueTable` для таблиц
- `v8:ValueTree` для деревьев
**Неправильно**:
```xml
<Attribute name="МояТаблица" id="1">
<Type/> <!-- ОШИБКА: тип пустой -->
<Columns>...</Columns>
</Attribute>
```
**Правильно**:
```xml
<Attribute name="МояТаблица" id="1">
<Type>
<v8:Type>v8:ValueTable</v8:Type> <!-- Тип обязателен -->
</Type>
<Columns>...</Columns>
</Attribute>
```
### BOM в файлах метаданных
Файлы метаданных (корневой XML, формы, макеты), выгруженные конфигуратором, содержат BOM (Byte Order Mark, `\xEF\xBB\xBF`) в начале. Файл `Form.xml` (описание формы) и `.bsl`-модули — **без BOM**. При ручном создании файлов рекомендуется следовать этому же правилу, хотя конфигуратор принимает файлы и без BOM.
### Кодировка
Все файлы — UTF-8. XML-файлы имеют заголовок `<?xml version="1.0" encoding="UTF-8"?>`.
## 10. Чеклист для создания новой обработки
1. Сгенерировать UUID для каждого объекта (обработка, реквизиты, формы, макеты, ТЧ)
2. Создать структуру каталогов (раздел 1)
3. Создать корневой XML (раздел 3) с правильными ChildObjects:
- Порядок: Attribute → TabularSection → Form → Template
- GeneratedType для ТЧ: `DataProcessorTabularSection.<Имя>.<ТЧ>` (не `ExternalDataProcessorTabularSection`!)
4. Для каждой формы:
- Создать `<Имя>.xml` (раздел 4)
- Создать `Form.xml` (раздел 6) — проверить пространство имён!
- Создать `Module.bsl` (раздел 7.2)
5. Для каждого макета:
- Создать `<Имя>.xml` (раздел 5) с правильным TemplateType
- Создать тело макета (`Template.<расш>`)
6. При необходимости создать `ObjectModule.bsl` (раздел 7.1)
7. Проверить:
- Все `<Type>` для коллекций содержат `v8:ValueTable` / `v8:ValueTree`
- Все `DataPath` корректны (особенно для колонок таблиц)
- Все элементы имеют `ExtendedTooltip`
- Все ID уникальны в пределах своих секций
- `DefaultForm` в корневом файле соответствует реальному имени формы
-628
View File
@@ -1,628 +0,0 @@
# Спецификация XML-формата выгрузки внешнего отчёта 1С
Формат: XML-выгрузка внешнего отчёта (ExternalReport) из конфигуратора 1С:Предприятие 8.3.
Версия формата: `2.17`.
> **Связь с другими спецификациями**:
> - Структура каталогов, пространства имён, формат форм и макетов — идентичны [спецификации внешней обработки (EPF)](1c-epf-spec.md).
> - Формат СКД-макетов — см. [спецификацию СКД](1c-dcs-spec.md).
> - Формат форм — см. [спецификацию форм](1c-form-spec.md).
> - Формат MXL-макетов — см. [спецификацию табличного документа](mxl-dsl-spec.md).
>
> Данный документ описывает **только** отличия внешнего отчёта от внешней обработки.
## 1. Структура каталогов
```
<ИмяОтчёта>.xml # Корневой файл метаданных
<ИмяОтчёта>/
Ext/
ObjectModule.bsl # Модуль объекта (опционально)
Help.xml # Метаданные справки (опционально)
Help/
ru.html # HTML-страница справки
Forms/
<ИмяФормы>.xml # Метаданные формы
<ИмяФормы>/
Ext/
Form.xml # Описание формы
Form/
Module.bsl # Модуль формы
Templates/
<ИмяМакета>.xml # Метаданные макета
<ИмяМакета>/
Ext/
Template.<расш> # Тело макета
```
Структура полностью совпадает с EPF. Отчёт может содержать:
- 0..N реквизитов объекта (описаны в корневом XML)
- 0..N табличных частей (описаны в корневом XML)
- 0..N форм (каталог `Forms/`)
- 0..N макетов (каталог `Templates/`) — включая СКД и MXL-макеты печатных форм
- 0..1 модуль объекта (`Ext/ObjectModule.bsl`)
- 0..1 встроенная справка (`Ext/Help.xml` + `Ext/Help/<язык>.html`)
## 2. Корневой файл отчёта (`<Имя>.xml`)
### 2.1. Общая структура
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="..." version="2.17">
<ExternalReport uuid="<UUID>">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>e41aff26-25cf-4bb6-b6c1-3f478a75f374</xr:ClassId>
<xr:ObjectId><UUID></xr:ObjectId>
</xr:ContainedObject>
<xr:GeneratedType name="ExternalReportObject.<Имя>" category="Object">
<xr:TypeId><UUID></xr:TypeId>
<xr:ValueId><UUID></xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name><Имя></Name>
<Synonym>...</Synonym>
<Comment/>
<DefaultForm/>
<AuxiliaryForm/>
<MainDataCompositionSchema/>
<DefaultSettingsForm/>
<AuxiliarySettingsForm/>
<DefaultVariantForm/>
<VariantsStorage/>
<SettingsStorage/>
</Properties>
<ChildObjects>
<!-- Реквизиты объекта (опционально) -->
<Attribute uuid="<UUID>">...</Attribute>
<!-- Табличные части (опционально) -->
<TabularSection uuid="<UUID>">...</TabularSection>
<!-- Формы -->
<Form><ИмяФормы></Form>
<!-- Макеты -->
<Template><ИмяМакета></Template>
</ChildObjects>
</ExternalReport>
</MetaDataObject>
```
### 2.2. Отличия от EPF
| Элемент | EPF | ERF |
|---------|-----|-----|
| Корневой элемент | `<ExternalDataProcessor>` | `<ExternalReport>` |
| ClassId | `c3831ec8-d8d5-4f93-8a22-f9bfae07327f` | `e41aff26-25cf-4bb6-b6c1-3f478a75f374` |
| GeneratedType (Object) | `ExternalDataProcessorObject.<Имя>` | `ExternalReportObject.<Имя>` |
| GeneratedType (ТЧ) | `DataProcessorTabularSection.<Имя>.<ТЧ>` | `ReportTabularSection.<Имя>.<ТЧ>` |
| GeneratedType (строка ТЧ) | `DataProcessorTabularSectionRow.<Имя>.<ТЧ>` | `ReportTabularSectionRow.<Имя>.<ТЧ>` |
| Путь к форме | `ExternalDataProcessor.<Имя>.Form.<Форма>` | `ExternalReport.<Имя>.Form.<Форма>` |
| Путь к макету | `ExternalDataProcessor.<Имя>.Template.<Макет>` | `ExternalReport.<Имя>.Template.<Макет>` |
| Тип реквизита формы | `cfg:ExternalDataProcessorObject.<Имя>` | `cfg:ExternalReportObject.<Имя>` |
### 2.3. Свойства (Properties)
Свойства EPF (`Name`, `Synonym`, `Comment`, `DefaultForm`, `AuxiliaryForm`) сохраняются. Добавляются **6 свойств**, специфичных для отчёта:
| Свойство | Описание | Пример значения |
|----------|----------|-----------------|
| `MainDataCompositionSchema` | Основная СКД отчёта. Полный путь к макету-СКД | `ExternalReport.<Имя>.Template.ОсновнаяСхемаКомпоновкиДанных` |
| `DefaultSettingsForm` | Форма настроек отчёта | `ExternalReport.<Имя>.Form.ФормаНастроек` |
| `AuxiliarySettingsForm` | Дополнительная форма настроек | (обычно пустой) |
| `DefaultVariantForm` | Форма вариантов отчёта | `ExternalReport.<Имя>.Form.ФормаВарианта` |
| `VariantsStorage` | Хранилище вариантов отчёта | `SettingsStorage.ХранилищеВариантовОтчетов` |
| `SettingsStorage` | Хранилище настроек | (обычно пустой) |
**Порядок свойств фиксирован**: Name → Synonym → Comment → DefaultForm → AuxiliaryForm → MainDataCompositionSchema → DefaultSettingsForm → AuxiliarySettingsForm → DefaultVariantForm → VariantsStorage → SettingsStorage.
Если значение отсутствует, элемент остаётся пустым (самозакрывающимся):
```xml
<DefaultForm/>
<MainDataCompositionSchema>ExternalReport.МойОтчёт.Template.ОсновнаяСхемаКомпоновкиДанных</MainDataCompositionSchema>
<VariantsStorage/>
```
## 3. Реквизиты объекта (Attribute)
В отличие от EPF (где реквизиты не документированы), внешний отчёт часто имеет реквизиты объекта. Они размещаются в `<ChildObjects>` корневого файла **перед** `<TabularSection>`, `<Form>` и `<Template>`:
```xml
<Attribute uuid="<UUID>">
<Properties>
<Name>Реквизит1</Name>
<Synonym/>
<Comment/>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>10</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
```
### Типы реквизитов
Типы реквизитов объекта аналогичны типам реквизитов форм:
| v8:Type | Описание | Квалификаторы |
|---------|----------|---------------|
| `xs:string` | Строка | `v8:StringQualifiers`: `Length`, `AllowedLength` |
| `xs:boolean` | Булево | — |
| `xs:decimal` | Число | `v8:NumberQualifiers`: `Digits`, `FractionDigits`, `AllowedSign` |
| `xs:dateTime` | Дата | `v8:DateQualifiers`: `DateFractions` |
| `cfg:CatalogRef.<Имя>` | Ссылка на справочник | — |
| `cfg:DocumentRef.<Имя>` | Ссылка на документ | — |
| `cfg:EnumRef.<Имя>` | Ссылка на перечисление | — |
> **Примечание**: Ссылочные типы (`cfg:CatalogRef.*` и т.д.) в контексте внешнего отчёта работают **только** при наличии в информационной базе конфигурации с соответствующими объектами.
### Свойства реквизита объекта (полный перечень)
Порядок фиксирован:
| Свойство | Тип | Описание |
|----------|-----|----------|
| `Name` | string | Имя реквизита |
| `Synonym` | LocalString | Синоним (отображаемое имя) |
| `Comment` | string | Комментарий |
| `Type` | TypeDescription | Тип данных (см. таблицу типов выше) |
| `PasswordMode` | boolean | Режим пароля (`false`) |
| `Format` | string | Формат вывода |
| `EditFormat` | string | Формат редактирования |
| `ToolTip` | LocalString | Подсказка |
| `MarkNegatives` | boolean | Выделять отрицательные (`false`) |
| `Mask` | string | Маска ввода |
| `MultiLine` | boolean | Многострочный (`false`) |
| `ExtendedEdit` | boolean | Расширенное редактирование (`false`) |
| `MinValue` | any | Минимальное значение (`xsi:nil="true"`) |
| `MaxValue` | any | Максимальное значение (`xsi:nil="true"`) |
| `FillChecking` | enum | Проверка заполнения (`DontCheck`) |
| `ChoiceFoldersAndItems` | enum | Выбор групп и элементов (`Items`) |
| `ChoiceParameterLinks` | list | Связи параметров выбора |
| `ChoiceParameters` | list | Параметры выбора |
| `QuickChoice` | enum | Быстрый выбор (`Auto`) |
| `CreateOnInput` | enum | Создание при вводе (`Auto`) |
| `ChoiceForm` | string | Форма выбора |
| `LinkByType` | ref | Связь по типу |
| `ChoiceHistoryOnInput` | enum | История выбора при вводе (`Auto`) |
## 4. Табличные части (TabularSection)
Структура полностью аналогична EPF, отличаются только имена GeneratedType:
```xml
<TabularSection uuid="<UUID>">
<InternalInfo>
<xr:GeneratedType name="ReportTabularSection.<ИмяОтчёта>.<ИмяТЧ>" category="TabularSection">
<xr:TypeId><UUID></xr:TypeId>
<xr:ValueId><UUID></xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="ReportTabularSectionRow.<ИмяОтчёта>.<ИмяТЧ>" category="TabularSectionRow">
<xr:TypeId><UUID></xr:TypeId>
<xr:ValueId><UUID></xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name><ИмяТЧ></Name>
<Synonym/>
<Comment/>
<ToolTip/>
<FillChecking>DontCheck</FillChecking>
</Properties>
<ChildObjects>
<Attribute uuid="<UUID>">
<Properties>
<!-- Те же свойства, что у реквизитов объекта, -->
<!-- плюс два дополнительных: -->
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<!-- ... остальные совпадают -->
</Properties>
</Attribute>
</ChildObjects>
</TabularSection>
```
**Важно**: Реквизиты табличной части имеют 2 дополнительных свойства по сравнению с реквизитами объекта:
- `FillFromFillingValue` — заполнять из значения заполнения (`false`)
- `FillValue` — значение заполнения (`xsi:nil="true"` или `xsi:type="xs:string"` и т.д.)
Эти свойства вставляются между `MaxValue` и `FillChecking`.
## 5. Порядок элементов в ChildObjects
Порядок дочерних объектов **фиксирован**:
1. `<Attribute>` — реквизиты объекта (0..N)
2. `<TabularSection>` — табличные части (0..N)
3. `<Form>` — формы (0..N)
4. `<Template>` — макеты (0..N)
## 6. Формы отчёта
### 6.1. Метаданные формы (`Forms/<Имя>.xml`)
Формат метаданных формы полностью совпадает с EPF — см. [спецификацию EPF, раздел 4](1c-epf-spec.md).
### 6.2. Специфика Form.xml для отчётов
Формы отчёта имеют дополнительные свойства в `<Form>`, которых нет у форм обработки:
| Свойство | Описание | Допустимые значения |
|----------|----------|---------------------|
| `ReportFormType` | Тип формы отчёта | `Main`, `Settings`, `Variant` |
| `ReportResult` | Имя реквизита-результата | Имя реквизита типа SpreadsheetDocument |
| `DetailsData` | Имя реквизита данных расшифровки | Имя строкового реквизита |
| `CustomSettingsFolder` | Группа пользовательских настроек | Имя элемента UsualGroup на форме |
Эти свойства размещаются в начале `<Form>`, после `<CommandBarLocation>` и до `<AutoCommandBar>`.
### 6.3. Основная форма отчёта (ReportFormType = Main)
Форма для отображения результата отчёта.
```xml
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" ... version="2.17">
<CommandBarLocation>None</CommandBarLocation>
<ReportResult>Результат</ReportResult>
<DetailsData>ДанныеРасшифровки</DetailsData>
<ReportFormType>Main</ReportFormType>
<CustomSettingsFolder>КомпоновщикНастроекПользовательскиеНастройки</CustomSettingsFolder>
<AutoCommandBar name="" id="-1">
<Autofill>false</Autofill>
</AutoCommandBar>
<ChildItems>
<CommandBar name="ОсновнаяКоманднаяПанель" id="1">
<Title>...</Title>
<CommandSource>Form</CommandSource>
<ExtendedTooltip name="ОсновнаяКоманднаяПанельРасширеннаяПодсказка" id="2"/>
</CommandBar>
<UsualGroup name="КомпоновщикНастроекПользовательскиеНастройки" id="3">
<Title>...</Title>
<VerticalStretch>false</VerticalStretch>
<Group>Vertical</Group>
<ShowTitle>false</ShowTitle>
<ExtendedTooltip name="КомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка" id="4"/>
</UsualGroup>
<SpreadSheetDocumentField name="Результат" id="5">
<DataPath>Результат</DataPath>
<DefaultItem>true</DefaultItem>
<TitleLocation>None</TitleLocation>
<Width>100</Width>
<ContextMenu name="РезультатКонтекстноеМеню" id="6"/>
<ExtendedTooltip name="РезультатРасширеннаяПодсказка" id="7"/>
</SpreadSheetDocumentField>
</ChildItems>
<Attributes>
<Attribute name="Отчет" id="1">
<Type>
<v8:Type>cfg:ExternalReportObject.<ИмяОтчёта></v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
<Attribute name="Результат" id="2">
<Title>...</Title>
<Type>
<v8:Type xmlns:mxl="http://v8.1c.ru/8.2/data/spreadsheet">mxl:SpreadsheetDocument</v8:Type>
</Type>
</Attribute>
<Attribute name="ДанныеРасшифровки" id="3">
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>0</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
</Attribute>
</Attributes>
</Form>
```
**Ключевые элементы основной формы отчёта:**
| Элемент | Описание |
|---------|----------|
| `SpreadSheetDocumentField` | Поле табличного документа для вывода результата. Привязано к реквизиту типа `mxl:SpreadsheetDocument` |
| Реквизит `Отчет` | Основной реквизит (`MainAttribute=true`), тип `cfg:ExternalReportObject.<Имя>` |
| Реквизит `Результат` | Табличный документ. Тип `mxl:SpreadsheetDocument` (требует дополнительный namespace `xmlns:mxl`) |
| Реквизит `ДанныеРасшифровки` | Строка неограниченной длины для данных расшифровки |
| Группа `КомпоновщикНастроекПользовательскиеНастройки` | Контейнер для пользовательских настроек СКД |
### 6.4. Форма настроек (ReportFormType = Settings)
Форма настроек отчёта для пользователя.
```xml
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" ... version="2.17">
<CommandBarLocation>Bottom</CommandBarLocation>
<VerticalScroll>useIfNecessary</VerticalScroll>
<ReportFormType>Settings</ReportFormType>
<CustomSettingsFolder>КомпоновщикНастроекПользовательскиеНастройки</CustomSettingsFolder>
<AutoCommandBar name="" id="-1">
<HorizontalAlign>Right</HorizontalAlign>
</AutoCommandBar>
<ChildItems>
<UsualGroup name="КомпоновщикНастроекПользовательскиеНастройки" id="1">
<Title>...</Title>
<Group>Vertical</Group>
<Representation>None</Representation>
<ShowTitle>false</ShowTitle>
<ExtendedTooltip name="КомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка" id="2"/>
</UsualGroup>
</ChildItems>
<Attributes>
<Attribute name="Отчет" id="1">
<Type>
<v8:Type>cfg:ExternalReportObject.<ИмяОтчёта></v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
</Attributes>
</Form>
```
### 6.5. Форма варианта (ReportFormType = Variant)
Форма для настройки варианта отчёта (структуры, группировок, фильтров).
```xml
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" ... version="2.17">
<CommandBarLocation>Bottom</CommandBarLocation>
<CollapseItemsByImportanceVariant>DontUse</CollapseItemsByImportanceVariant>
<ReportFormType>Variant</ReportFormType>
<AutoCommandBar name="" id="-1">
<HorizontalAlign>Right</HorizontalAlign>
</AutoCommandBar>
<ChildItems>
<Table name="КомпоновщикНастроекНастройки" id="1">
<Representation>Tree</Representation>
<DataPath>Отчет.SettingsComposer.Settings</DataPath>
<!-- ... элементы управления деревом настроек -->
</Table>
<!-- Страницы настроек (параметры, поля, фильтры и т.д.) -->
</ChildItems>
<!-- ... -->
</Form>
```
Форма варианта обычно содержит сложную структуру с деревом настроек (`Table` с `Representation=Tree` и `DataPath=Отчет.SettingsComposer.Settings`) и множеством страниц для редактирования параметров, полей, фильтров, сортировки и условного оформления.
### 6.6. Элемент SpreadSheetDocumentField
Специфичный для отчётов элемент формы — поле табличного документа. Используется для отображения результата отчёта.
```xml
<SpreadSheetDocumentField name="Результат" id="5">
<DataPath>Результат</DataPath>
<DefaultItem>true</DefaultItem>
<TitleLocation>None</TitleLocation>
<Width>100</Width>
<ContextMenu name="РезультатКонтекстноеМеню" id="6"/>
<ExtendedTooltip name="РезультатРасширеннаяПодсказка" id="7"/>
</SpreadSheetDocumentField>
```
| Свойство | Описание |
|----------|----------|
| `DataPath` | Путь к реквизиту типа SpreadsheetDocument |
| `DefaultItem` | Элемент по умолчанию (`true`) |
| `TitleLocation` | Расположение заголовка (`None`) |
| `Width` | Ширина в символах |
## 7. Модуль объекта
### 7.1. Событие ПриКомпоновкеРезультата
Основное событие модуля объекта отчёта. Вызывается платформой при формировании результата. Позволяет перехватить стандартную обработку СКД.
```bsl
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// СтандартнаяОбработка = Ложь; // отключить стандартное формирование по СКД
// Собственная логика формирования отчёта
КонецПроцедуры
```
Параметры:
- `ДокументРезультат` — табличный документ для вывода результата
- `ДанныеРасшифровки` — данные расшифровки
- `СтандартнаяОбработка` — если установить `Ложь`, платформа не будет сама формировать отчёт по СКД
### 7.2. Директива условной компиляции
В ERP-отчётах модуль объекта часто обёрнут в директиву условной компиляции:
```bsl
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
// ... весь код модуля ...
#КонецЕсли
```
### 7.3. Типичные процедуры модуля объекта отчёта
| Процедура | Описание |
|-----------|----------|
| `ПриКомпоновкеРезультата` | Событие формирования результата |
| `ИнициализироватьОтчет` | Инициализация отчёта (экспорт, для БСП) |
| `ОпределитьНастройкиФормы` | Определение настроек формы (экспорт, для БСП) |
| `ПередЗагрузкойНастроекВКомпоновщик` | Предобработка настроек (экспорт, для БСП) |
## 8. Макеты (Templates)
### 8.1. СКД-макет (DataCompositionSchema)
Основной макет отчёта. Обязателен, если указан `MainDataCompositionSchema`.
```xml
<!-- Метаданные: Templates/ОсновнаяСхемаКомпоновкиДанных.xml -->
<Template uuid="<UUID>">
<Properties>
<Name>ОсновнаяСхемаКомпоновкиДанных</Name>
<Synonym>...</Synonym>
<Comment/>
<TemplateType>DataCompositionSchema</TemplateType>
</Properties>
</Template>
```
Тело СКД: `Templates/ОсновнаяСхемаКомпоновкиДанных/Ext/Template.xml` — формат описан в [спецификации СКД](1c-dcs-spec.md).
### 8.2. MXL-макеты печатных форм (SpreadsheetDocument)
Отчёты часто содержат MXL-макеты для вывода печатных форм.
```xml
<!-- Метаданные: Templates/ПФ_MXL_КарточкаУчета.xml -->
<Template uuid="<UUID>">
<Properties>
<Name>ПФ_MXL_КарточкаУчета</Name>
<Synonym>...</Synonym>
<Comment/>
<TemplateType>SpreadsheetDocument</TemplateType>
</Properties>
</Template>
```
Тело макета: `Templates/ПФ_MXL_КарточкаУчета/Ext/Template.xml` — формат MXL.
Конвенция именования MXL-макетов: `ПФ_MXL_<НазваниеПечатнойФормы>`.
## 9. Сравнение с отчётом конфигурации (Report)
| Аспект | ExternalReport (ERF) | Report (в конфигурации) |
|--------|---------------------|------------------------|
| Корневой элемент | `<ExternalReport>` | `<Report>` |
| ClassId | `e41aff26-25cf-4bb6-b6c1-3f478a75f374` | (нет ContainedObject) |
| GeneratedType (Object) | `ExternalReportObject.<Имя>` | `ReportObject.<Имя>` |
| GeneratedType (Manager) | — | `ReportManager.<Имя>` |
| Тип реквизита формы | `cfg:ExternalReportObject.<Имя>` | `cfg:ReportObject.<Имя>` |
| Дополнительные свойства | — | `UseStandardCommands`, `IncludeHelpInContents`, `ExtendedPresentation`, `Explanation` |
| Формы по умолчанию | Могут ссылаться на свои формы | Могут ссылаться на `CommonForm.*` |
| Хранение | Файл `.erf` | В составе конфигурации |
## 10. Минимальный пример
### Пустой отчёт (без СКД, форм, модулей)
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses"
xmlns:app="http://v8.1c.ru/8.2/managed-application/core"
xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config"
xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi"
xmlns:ent="http://v8.1c.ru/8.1/data/enterprise"
xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform"
xmlns:style="http://v8.1c.ru/8.1/data/ui/style"
xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system"
xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:v8ui="http://v8.1c.ru/8.1/data/ui"
xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web"
xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows"
xmlns:xen="http://v8.1c.ru/8.3/xcf/enums"
xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef"
xmlns:xr="http://v8.1c.ru/8.3/xcf/readable"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.17">
<ExternalReport uuid="b38bc179-9b8a-4eb3-9422-96c6eded1ac3">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>e41aff26-25cf-4bb6-b6c1-3f478a75f374</xr:ClassId>
<xr:ObjectId>38f084a4-47ce-4e67-ab4b-ac6323b9da08</xr:ObjectId>
</xr:ContainedObject>
<xr:GeneratedType name="ExternalReportObject.МойОтчёт" category="Object">
<xr:TypeId>1fd37c7e-ade2-47ac-8dae-3fafeec96943</xr:TypeId>
<xr:ValueId>b85e1756-f044-4907-b4bd-75a57649c486</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>МойОтчёт</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Мой отчёт</v8:content>
</v8:item>
</Synonym>
<Comment/>
<DefaultForm/>
<AuxiliaryForm/>
<MainDataCompositionSchema/>
<DefaultSettingsForm/>
<AuxiliarySettingsForm/>
<DefaultVariantForm/>
<VariantsStorage/>
<SettingsStorage/>
</Properties>
<ChildObjects/>
</ExternalReport>
</MetaDataObject>
```
### Отчёт с СКД
Добавляется ссылка на СКД в `MainDataCompositionSchema` и макет-СКД в `ChildObjects`:
```xml
<Properties>
...
<MainDataCompositionSchema>ExternalReport.МойОтчёт.Template.ОсновнаяСхемаКомпоновкиДанных</MainDataCompositionSchema>
...
</Properties>
<ChildObjects>
<Template>ОсновнаяСхемаКомпоновкиДанных</Template>
</ChildObjects>
```
Плюс файлы:
- `Templates/ОсновнаяСхемаКомпоновкиДанных.xml` (метаданные, `TemplateType=DataCompositionSchema`)
- `Templates/ОсновнаяСхемаКомпоновкиДанных/Ext/Template.xml` (тело СКД)
## 11. Чеклист для создания внешнего отчёта
1. Сгенерировать UUID для каждого объекта (отчёт, реквизиты, ТЧ, формы, макеты)
2. Создать структуру каталогов (раздел 1)
3. Создать корневой XML (раздел 2) с:
- `ClassId = e41aff26-25cf-4bb6-b6c1-3f478a75f374`
- `GeneratedType name="ExternalReportObject.<Имя>"`
- Корректными путями в `MainDataCompositionSchema`, `DefaultForm` и др.
- Правильным порядком элементов в `ChildObjects`
4. Создать СКД-макет (раздел 8.1):
- Метаданные с `TemplateType=DataCompositionSchema`
- Тело СКД по [спецификации СКД](1c-dcs-spec.md)
5. При необходимости создать формы (раздел 6):
- Указать `ReportFormType` (`Main` / `Settings` / `Variant`)
- Основная форма: `ReportResult`, `DetailsData`, `SpreadSheetDocumentField`
- Основной реквизит: `cfg:ExternalReportObject.<Имя>`
6. При необходимости создать `ObjectModule.bsl` (раздел 7)
7. При необходимости создать MXL-макеты печатных форм (раздел 8.2)
8. Проверить:
- Все пути используют префикс `ExternalReport.<Имя>` (не `ExternalDataProcessor`)
- Тип основного реквизита формы: `cfg:ExternalReportObject.<Имя>`
- `MainDataCompositionSchema` соответствует реальному макету в `ChildObjects`
- Порядок в `ChildObjects`: Attribute → TabularSection → Form → Template
- Все UUID уникальны
File diff suppressed because it is too large Load Diff
-1221
View File
File diff suppressed because it is too large Load Diff
-151
View File
@@ -1,151 +0,0 @@
# Встроенная справка внешней обработки 1С
Спецификация добавления встроенной справки (Help) к внешней обработке (EPF) в формате XML-выгрузки версии 2.17.
## 1. Структура файлов
```
<ИмяОбработки>/
Ext/
Help.xml # Метаданные справки (обязательно)
Help/
ru.html # HTML-страница справки на русском языке
```
Справка **не регистрируется** в `ChildObjects` корневого XML обработки — достаточно наличия файлов `Help.xml` и `Help/<язык>.html` в каталоге `Ext/`.
## 2. Help.xml — метаданные справки
Пространство имён: `http://v8.1c.ru/8.3/xcf/extrnprops` (то же, что у Template.xml).
```xml
<?xml version="1.0" encoding="UTF-8"?>
<Help xmlns="http://v8.1c.ru/8.3/xcf/extrnprops"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.17">
<Page>ru</Page>
</Help>
```
Элемент `<Page>` указывает код языка. Имя файла страницы: `<код_языка>.html`. Может быть несколько элементов `<Page>` для разных языков.
## 3. HTML-страница справки
Формат: HTML 4.0 Transitional, кодировка UTF-8.
### Минимальный шаблон
```html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"/>
</head>
<body>
Содержимое справки
</body>
</html>
```
### Обязательные элементы head
| Элемент | Назначение |
|---------|------------|
| `<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>` | Кодировка UTF-8 |
| `<link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"/>` | Стили справки 1С (протокол `v8help://`) |
### Поддерживаемая разметка
Стандартный HTML 4.0: `<h1>`..`<h4>`, `<p>`, `<ul>`, `<ol>`, `<li>`, `<table>`, `<strong>`, `<em>`, `<a>`, `<br>`, `<pre>` и др. Стили 1С автоматически форматируют заголовки и абзацы.
## 4. Метаданные формы — IncludeHelpInContents
В файле метаданных формы (`Forms/<ИмяФормы>.xml`) должен быть элемент:
```xml
<IncludeHelpInContents>false</IncludeHelpInContents>
```
Полный контекст в файле формы:
```xml
<Form uuid="...">
<Properties>
<Name>ОсновнаяФорма</Name>
...
<FormType>Managed</FormType>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UsePurposes>...</UsePurposes>
<ExtendedPresentation/>
</Properties>
</Form>
```
Значение `false` — справка не включается в общее оглавление справочной системы (стандартное поведение для внешних обработок).
## 5. Кнопка вызова справки на форме
Для вызова справки используется стандартная команда платформы `Form.StandardCommand.Help`.
### Вариант А: кнопка в AutoCommandBar формы
Простейший способ — добавить кнопку в автокомандную панель формы (`id="-1"`):
```xml
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<Autofill>false</Autofill>
<ChildItems>
<Button name="ФормаСправка" id="<свободный_id>">
<Type>CommandBarButton</Type>
<CommandName>Form.StandardCommand.Help</CommandName>
<ExtendedTooltip name="ФормаСправкаExtendedTooltip" id="<свободный_id>"/>
</Button>
</ChildItems>
</AutoCommandBar>
```
Кнопка появится на автокомандной панели формы (верхняя строка). Подходит для простых форм.
### Вариант Б: кнопка в пользовательской CommandBar
Если форма не использует AutoCommandBar (задан `Autofill=false`, панель скрыта или пуста), кнопку справки можно разместить в произвольной `<CommandBar>` группе среди других пользовательских кнопок:
```xml
<CommandBar name="МояКоманднаяПанель" id="...">
<Autofill>false</Autofill>
<HorizontalStretch>false</HorizontalStretch>
<ExtendedTooltip name="МояКоманднаяПанельExtendedTooltip" id="..."/>
<ChildItems>
<!-- Другие кнопки -->
<Button name="КнопкаДействие" id="...">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.МояКоманда</CommandName>
...
</Button>
<!-- Кнопка справки -->
<Button name="ФормаСправка" id="<свободный_id>">
<Type>CommandBarButton</Type>
<CommandName>Form.StandardCommand.Help</CommandName>
<ExtendedTooltip name="ФормаСправкаExtendedTooltip" id="<свободный_id>"/>
</Button>
</ChildItems>
</CommandBar>
```
Для стандартной команды `Help` не нужно объявлять элемент в секции `<Commands>` — платформа предоставляет её автоматически.
### Важно
- `<Type>CommandBarButton</Type>` — кнопка должна быть типа CommandBarButton (внутри `<CommandBar>`)
- Никакого обработчика в Module.bsl не требуется — `Form.StandardCommand.Help` обрабатывается платформой
- Платформа сама найдёт `Help.xml` и откроет соответствующую HTML-страницу
## 6. Чек-лист добавления справки
1. Создать `<ИмяОбработки>/Ext/Help.xml` с указанием языка (`<Page>ru</Page>`)
2. Создать `<ИмяОбработки>/Ext/Help/ru.html` с содержимым справки
3. Убедиться что в `Forms/<ИмяФормы>.xml` есть `<IncludeHelpInContents>false</IncludeHelpInContents>`
4. Добавить кнопку `Form.StandardCommand.Help` в CommandBar или AutoCommandBar формы
5. Собрать EPF — проверить что справка открывается по кнопке
-845
View File
@@ -1,845 +0,0 @@
# Спецификация формата ролей 1С:Предприятия 8.3
Полное описание XML-формата ролей в выгрузке конфигурации. Версии формата: 2.17 (платформа 8.3.208.3.24), 2.20 (8.3.27+). Структура идентична, отличается только атрибут `version`.
## Файловая структура
Каждая роль состоит из двух файлов:
```
Roles/
ИмяРоли.xml ← метаданные (uuid, имя, синоним)
ИмяРоли/
Ext/
Rights.xml ← определение прав
```
## Регистрация роли в конфигурации
При создании роли необходимо прописать ссылки в следующих местах:
### Configuration.xml — ChildObjects
Регистрация объекта в составе конфигурации:
```xml
<ChildObjects>
...
<Role>ИмяРоли</Role>
...
</ChildObjects>
```
Элементы `<Role>` располагаются среди других объектов конфигурации в секции `<ChildObjects>`.
### Configuration.xml — DefaultRoles (опционально)
Если роль должна назначаться новым пользователям по умолчанию:
```xml
<DefaultRoles>
<xr:Item xsi:type="xr:MDObjectRef">Role.ИмяРоли</xr:Item>
</DefaultRoles>
```
### Form.xml — права редактирования реквизитов (опционально)
В формах роль может упоминаться для ограничения редактирования реквизитов:
```xml
<Attribute>
<Edit>
<xr:Common>false</xr:Common>
<xr:Value name="Role.ИмяРоли">true</xr:Value>
</Edit>
</Attribute>
```
---
## Файл метаданных: Roles/ИмяРоли.xml
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses"
xmlns:app="http://v8.1c.ru/8.2/managed-application/core"
xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config"
xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi"
xmlns:ent="http://v8.1c.ru/8.1/data/enterprise"
xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform"
xmlns:style="http://v8.1c.ru/8.1/data/ui/style"
xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system"
xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:v8ui="http://v8.1c.ru/8.1/data/ui"
xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web"
xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows"
xmlns:xen="http://v8.1c.ru/8.3/xcf/enums"
xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef"
xmlns:xr="http://v8.1c.ru/8.3/xcf/readable"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.17">
<Role uuid="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX">
<Properties>
<Name>ИмяРоли</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Отображаемое имя роли</v8:content>
</v8:item>
</Synonym>
<Comment/>
</Properties>
</Role>
</MetaDataObject>
```
### Элементы
| Элемент | Обязательный | Описание |
|---------|:------------:|----------|
| `Role/@uuid` | да | UUID роли (формат `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`) |
| `Name` | да | Программное имя роли (идентификатор, латиница/кириллица) |
| `Synonym` | да | Мультиязычное отображаемое имя (один или несколько `v8:item`) |
| `Comment` | да | Комментарий (может быть пустым `<Comment/>`) |
### Namespace
Основной: `http://v8.1c.ru/8.3/MDClasses`
Мультиязычные строки: `v8` = `http://v8.1c.ru/8.1/data/core`
---
## Файл прав: Roles/ИмяРоли/Ext/Rights.xml
### Корневой элемент
```xml
<?xml version="1.0" encoding="UTF-8"?>
<Rights xmlns="http://v8.1c.ru/8.2/roles"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="Rights"
version="2.17">
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>...</object>
...
<restrictionTemplate>...</restrictionTemplate>
...
</Rights>
```
### Namespace
`http://v8.1c.ru/8.2/roles` (NB: 8.2, а не 8.3 — исторически)
### Глобальные флаги
| Флаг | Тип | По умолчанию | Описание |
|------|-----|:------------:|----------|
| `setForNewObjects` | boolean | false | Устанавливать права для новых объектов конфигурации |
| `setForAttributesByDefault` | boolean | true | Устанавливать права для реквизитов по умолчанию |
| `independentRightsOfChildObjects` | boolean | false | Независимые права подчинённых объектов |
### Структура блока `<object>`
```xml
<object>
<name>ТипОбъекта.ИмяОбъекта</name>
<right>
<name>ИмяПрава</name>
<value>true</value>
</right>
<right>
<name>ИмяПрава</name>
<value>true</value>
<restrictionByCondition>
<condition>Текст условия RLS</condition>
</restrictionByCondition>
</right>
</object>
```
| Элемент | Обязательный | Описание |
|---------|:------------:|----------|
| `object/name` | да | Полное имя объекта метаданных (dot-нотация) |
| `right/name` | да | Имя права (см. таблицы ниже) |
| `right/value` | да | `true` или `false` |
| `right/restrictionByCondition` | нет | Ограничение на уровне записей (RLS) |
| `restrictionByCondition/condition` | да | Текст условия на языке шаблонов ограничений |
### Именование объектов (dot-нотация)
Объекты адресуются иерархически через точку:
```
ТипОбъекта.ИмяОбъекта[.ТипВложенного[.ИмяВложенного[...]]]
```
#### Верхний уровень — объекты метаданных
```
Catalog.Контрагенты
Document.РеализацияТоваровУслуг
InformationRegister.ЦеныНоменклатуры
DataProcessor.ЗагрузкаДанных
Report.АнализПродаж
Configuration.ИмяКонфигурации
```
#### Стандартные реквизиты
```
Catalog.Контрагенты.StandardAttribute.Code
Catalog.Контрагенты.StandardAttribute.Description
Catalog.Контрагенты.StandardAttribute.DeletionMark
Catalog.Контрагенты.StandardAttribute.Predefined
Catalog.Контрагенты.StandardAttribute.PredefinedDataName
Catalog.Контрагенты.StandardAttribute.Ref
Catalog.Контрагенты.StandardAttribute.IsFolder
Catalog.Контрагенты.StandardAttribute.Parent
Catalog.Контрагенты.StandardAttribute.Owner
Document.Реализация.StandardAttribute.Posted
Document.Реализация.StandardAttribute.Date
Document.Реализация.StandardAttribute.Number
```
#### Реквизиты
```
Catalog.Контрагенты.Attribute.ИНН
Document.Реализация.Attribute.Организация
```
#### Табличные части и их реквизиты
```
Document.Реализация.TabularSection.Товары
Document.Реализация.TabularSection.Товары.Attribute.Номенклатура
Document.Реализация.TabularSection.Товары.StandardAttribute.LineNumber
```
#### Измерения, ресурсы, реквизиты регистров
```
InformationRegister.Цены.Dimension.Номенклатура
InformationRegister.Цены.Resource.Цена
AccumulationRegister.Остатки.Attribute.ДатаОперации
AccountingRegister.Хозрасчетный.Dimension.Организация
```
#### Команды
```
Catalog.Контрагенты.Command.ОткрытьКарточку
DataProcessor.Обработка.Command.Выполнить
CommonCommand.УправлениеОборудованием
```
#### Реквизиты адресации (бизнес-процессы/задачи)
```
Task.ЗадачаИсполнителя.AddressingAttribute.Исполнитель
Task.ЗадачаИсполнителя.AddressingAttribute.ОсновнойОбъектАдресации
```
#### Операции веб-сервисов
```
WebService.Exchange.Operation.GetIBParameters
HTTPService.ЭДО.URLTemplate.Документы.Method.POST
```
#### Вложенные подсистемы
```
Subsystem.Администрирование.Subsystem.Пользователи
```
---
## Полный каталог прав по типам объектов
### Права объектов верхнего уровня
#### Configuration
Права конфигурации в целом. Объект: `Configuration.ИмяКонфигурации`.
| Право | Описание |
|-------|----------|
| `Administration` | Администрирование |
| `DataAdministration` | Администрирование данных |
| `UpdateDataBaseConfiguration` | Обновление конфигурации БД |
| `ConfigurationExtensionsAdministration` | Администрирование расширений |
| `ActiveUsers` | Активные пользователи |
| `EventLog` | Журнал регистрации |
| `ExclusiveMode` | Монопольный режим |
| `ThinClient` | Тонкий клиент |
| `ThickClient` | Толстый клиент |
| `WebClient` | Веб-клиент |
| `MobileClient` | Мобильный клиент |
| `ExternalConnection` | Внешнее соединение |
| `Automation` | Automation (COM) |
| `Output` | Вывод (печать, сохранение, копирование) |
| `SaveUserData` | Сохранение данных пользователя |
| `TechnicalSpecialistMode` | Режим технического специалиста |
| `InteractiveOpenExtDataProcessors` | Интерактивное открытие внешних обработок |
| `InteractiveOpenExtReports` | Интерактивное открытие внешних отчётов |
| `AnalyticsSystemClient` | Клиент системы аналитики |
| `CollaborationSystemInfoBaseRegistration` | Регистрация ИБ в системе взаимодействия |
| `MainWindowModeNormal` | Режим обычного окна |
| `MainWindowModeWorkplace` | Режим рабочего места |
| `MainWindowModeEmbeddedWorkplace` | Режим встроенного рабочего места |
| `MainWindowModeFullscreenWorkplace` | Режим полноэкранного рабочего места |
| `MainWindowModeKiosk` | Режим киоска |
#### Catalog
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Insert` | Добавление |
| `Update` | Изменение |
| `Delete` | Удаление |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `InputByString` | Ввод по строке |
| `InteractiveInsert` | Интерактивное добавление |
| `InteractiveSetDeletionMark` | Интерактивная пометка удаления |
| `InteractiveClearDeletionMark` | Интерактивное снятие пометки удаления |
| `InteractiveDelete` | Интерактивное удаление |
| `InteractiveDeleteMarked` | Интерактивное удаление помеченных |
| `InteractiveDeletePredefinedData` | Интерактивное удаление предопределённых |
| `InteractiveSetDeletionMarkPredefinedData` | Пометка удаления предопределённых |
| `InteractiveClearDeletionMarkPredefinedData` | Снятие пометки удаления предопределённых |
| `InteractiveDeleteMarkedPredefinedData` | Удаление помеченных предопределённых |
| `ReadDataHistory` | Чтение истории данных |
| `ViewDataHistory` | Просмотр истории данных |
| `UpdateDataHistory` | Обновление истории данных |
| `UpdateDataHistoryOfMissingData` | Обновление истории отсутствующих данных |
| `ReadDataHistoryOfMissingData` | Чтение истории отсутствующих данных |
| `UpdateDataHistorySettings` | Обновление настроек истории данных |
| `UpdateDataHistoryVersionComment` | Обновление комментария версии |
| `EditDataHistoryVersionComment` | Редактирование комментария версии |
| `SwitchToDataHistoryVersion` | Переход к версии истории данных |
#### Document
Все права Catalog (кроме предопределённых) плюс:
| Право | Описание |
|-------|----------|
| `Posting` | Проведение |
| `UndoPosting` | Отмена проведения |
| `InteractivePosting` | Интерактивное проведение |
| `InteractivePostingRegular` | Интерактивное проведение (неоперативное) |
| `InteractiveUndoPosting` | Интерактивная отмена проведения |
| `InteractiveChangeOfPosted` | Интерактивное изменение проведённых |
#### InformationRegister
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Update` | Изменение |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `TotalsControl` | Управление итогами (для периодических) |
| `ReadDataHistory` | Чтение истории данных |
| `ViewDataHistory` | Просмотр истории данных |
| `UpdateDataHistory` | Обновление истории данных |
| `UpdateDataHistoryOfMissingData` | Обновление истории отсутствующих данных |
| `ReadDataHistoryOfMissingData` | Чтение истории отсутствующих данных |
| `UpdateDataHistorySettings` | Настройки истории данных |
| `UpdateDataHistoryVersionComment` | Обновление комментария версии |
| `EditDataHistoryVersionComment` | Редактирование комментария версии |
| `SwitchToDataHistoryVersion` | Переход к версии |
#### AccumulationRegister
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Update` | Изменение |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `TotalsControl` | Управление итогами |
#### AccountingRegister
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Update` | Изменение |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `TotalsControl` | Управление итогами |
#### CalculationRegister
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `View` | Просмотр |
#### Constant
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Update` | Изменение |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `ReadDataHistory` | Чтение истории данных |
| `ViewDataHistory` | Просмотр истории данных |
| `UpdateDataHistory` | Обновление истории данных |
| `UpdateDataHistorySettings` | Настройки истории данных |
| `UpdateDataHistoryVersionComment` | Обновление комментария версии |
| `EditDataHistoryVersionComment` | Редактирование комментария версии |
| `SwitchToDataHistoryVersion` | Переход к версии |
#### ChartOfAccounts
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Insert` | Добавление |
| `Update` | Изменение |
| `Delete` | Удаление |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `InputByString` | Ввод по строке |
| `InteractiveInsert` | Интерактивное добавление |
| `InteractiveSetDeletionMark` | Пометка удаления |
| `InteractiveClearDeletionMark` | Снятие пометки удаления |
| `InteractiveDelete` | Интерактивное удаление |
| `InteractiveDeletePredefinedData` | Удаление предопределённых |
| `InteractiveSetDeletionMarkPredefinedData` | Пометка удаления предопределённых |
| `InteractiveClearDeletionMarkPredefinedData` | Снятие пометки удаления предопределённых |
| `InteractiveDeleteMarkedPredefinedData` | Удаление помеченных предопределённых |
| `ReadDataHistory` | Чтение истории данных |
| `ReadDataHistoryOfMissingData` | Чтение истории отсутствующих данных |
| `UpdateDataHistory` | Обновление истории данных |
| `UpdateDataHistoryOfMissingData` | Обновление истории отсутствующих данных |
| `UpdateDataHistorySettings` | Настройки истории данных |
| `UpdateDataHistoryVersionComment` | Обновление комментария версии |
#### ChartOfCharacteristicTypes
Аналогично ChartOfAccounts, плюс:
| Право | Описание |
|-------|----------|
| `InteractiveDeleteMarked` | Интерактивное удаление помеченных |
| `EditDataHistoryVersionComment` | Редактирование комментария версии |
| `SwitchToDataHistoryVersion` | Переход к версии |
| `ViewDataHistory` | Просмотр истории данных |
#### ChartOfCalculationTypes
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Insert` | Добавление |
| `Update` | Изменение |
| `Delete` | Удаление |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `InputByString` | Ввод по строке |
| `InteractiveInsert` | Интерактивное добавление |
| `InteractiveSetDeletionMark` | Пометка удаления |
| `InteractiveClearDeletionMark` | Снятие пометки удаления |
| `InteractiveDelete` | Интерактивное удаление |
| `InteractiveDeletePredefinedData` | Удаление предопределённых |
| `InteractiveSetDeletionMarkPredefinedData` | Пометка удаления предопределённых |
| `InteractiveClearDeletionMarkPredefinedData` | Снятие пометки предопределённых |
| `InteractiveDeleteMarkedPredefinedData` | Удаление помеченных предопределённых |
#### ExchangePlan
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Insert` | Добавление |
| `Update` | Изменение |
| `Delete` | Удаление |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `InputByString` | Ввод по строке |
| `InteractiveInsert` | Интерактивное добавление |
| `InteractiveSetDeletionMark` | Пометка удаления |
| `InteractiveClearDeletionMark` | Снятие пометки удаления |
| `InteractiveDelete` | Интерактивное удаление |
| `InteractiveDeleteMarked` | Удаление помеченных |
| `ReadDataHistory` | Чтение истории данных |
| `ViewDataHistory` | Просмотр истории данных |
| `UpdateDataHistory` | Обновление истории данных |
| `ReadDataHistoryOfMissingData` | Чтение истории отсутствующих |
| `UpdateDataHistoryOfMissingData` | Обновление истории отсутствующих |
| `UpdateDataHistorySettings` | Настройки истории данных |
| `UpdateDataHistoryVersionComment` | Обновление комментария версии |
| `EditDataHistoryVersionComment` | Редактирование комментария версии |
| `SwitchToDataHistoryVersion` | Переход к версии |
#### BusinessProcess
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Insert` | Добавление |
| `Update` | Изменение |
| `Delete` | Удаление |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `InputByString` | Ввод по строке |
| `Start` | Старт |
| `InteractiveInsert` | Интерактивное добавление |
| `InteractiveSetDeletionMark` | Пометка удаления |
| `InteractiveClearDeletionMark` | Снятие пометки удаления |
| `InteractiveDelete` | Интерактивное удаление |
| `InteractiveActivate` | Интерактивная активация |
| `InteractiveStart` | Интерактивный старт |
#### Task
| Право | Описание |
|-------|----------|
| `Read` | Чтение |
| `Insert` | Добавление |
| `Update` | Изменение |
| `Delete` | Удаление |
| `View` | Просмотр |
| `Edit` | Редактирование |
| `InputByString` | Ввод по строке |
| `Execute` | Выполнение |
| `InteractiveInsert` | Интерактивное добавление |
| `InteractiveSetDeletionMark` | Пометка удаления |
| `InteractiveClearDeletionMark` | Снятие пометки удаления |
| `InteractiveDelete` | Интерактивное удаление |
| `InteractiveActivate` | Интерактивная активация |
| `InteractiveExecute` | Интерактивное выполнение |
#### Простые типы (одно-два права)
| Тип объекта | Права |
|-------------|-------|
| `DataProcessor` | Use, View |
| `Report` | Use, View |
| `CommonForm` | View |
| `CommonCommand` | View |
| `Subsystem` | View |
| `FilterCriterion` | View |
| `DocumentJournal` | Read, View |
| `Sequence` | Read, Update |
| `WebService` | Use |
| `HTTPService` | Use |
| `IntegrationService` | Use |
| `SessionParameter` | Get, Set |
| `CommonAttribute` | View, Edit |
#### Типы объектов БЕЗ прав в ролях
Следующие типы не фигурируют в Rights.xml (права не применимы или управляются иначе):
- `Enum` (перечисления)
- `FunctionalOption`
- `DefinedType`
- `CommonModule`
- `CommonPicture`
- `CommonTemplate`
- `SettingsStorage`
- `ExternalDataSource`
---
### Права вложенных объектов
Права можно задавать не только на уровне объекта, но и на уровне его составных частей.
#### Реквизиты и стандартные реквизиты
Доступные права: `View`, `Edit`
```xml
<object>
<name>Catalog.Контрагенты.StandardAttribute.PredefinedDataName</name>
<right>
<name>View</name>
<value>false</value>
</right>
<right>
<name>Edit</name>
<value>false</value>
</right>
</object>
```
Применимо к:
- `*.StandardAttribute.*` — стандартные реквизиты
- `*.Attribute.*` — реквизиты
- `*.TabularSection.*` — табличные части (целиком)
- `*.TabularSection.*.Attribute.*` — реквизиты табличных частей
- `*.TabularSection.*.StandardAttribute.*` — стандартные реквизиты табличных частей
#### Измерения, ресурсы регистров
Доступные права: `View`, `Edit`
```xml
<object>
<name>InformationRegister.Цены.Dimension.Номенклатура</name>
<right>
<name>Edit</name>
<value>false</value>
</right>
</object>
```
Применимо к:
- `*Register.*.Dimension.*`
- `*Register.*.Resource.*`
- `*Register.*.Attribute.*`
#### Команды
Доступные права: `View`
```xml
<object>
<name>Catalog.Контрагенты.Command.ОткрытьКарточку</name>
<right>
<name>View</name>
<value>false</value>
</right>
</object>
```
Применимо к:
- `*.Command.*` — команды любого объекта
#### Реквизиты адресации (Task)
Доступные права: `View`, `Edit`
```xml
<object>
<name>Task.ЗадачаИсполнителя.AddressingAttribute.Исполнитель</name>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
```
#### Полная таблица: вложенные объекты и их права
| Тип вложенного | Родители | Права |
|----------------|----------|-------|
| `StandardAttribute` | Catalog, Document, ExchangePlan, ChartOf*, Task, BusinessProcess, *Register, DocumentJournal | View, Edit |
| `Attribute` | Catalog, Document, ExchangePlan, ChartOf*, Task, BusinessProcess, *Register, DataProcessor, Report | View, Edit |
| `TabularSection` | Catalog, Document, ExchangePlan, ChartOf*, Task, BusinessProcess, DataProcessor, Report | View, Edit |
| `TabularSection.*.Attribute` | (все с TabularSection) | View, Edit |
| `Dimension` | InformationRegister, AccumulationRegister, AccountingRegister | View, Edit |
| `Resource` | InformationRegister, AccumulationRegister, AccountingRegister | View, Edit |
| `Command` | Catalog, Document, DataProcessor, Report, *Register, DocumentJournal, ExchangePlan, BusinessProcess, Task | View |
| `AddressingAttribute` | Task | View, Edit |
---
## Ограничения на уровне записей (RLS)
### Структура
```xml
<right>
<name>Read</name>
<value>true</value>
<restrictionByCondition>
<condition>Текст условия</condition>
</restrictionByCondition>
</right>
```
RLS добавляется внутрь `<right>` как дочерний элемент `<restrictionByCondition>`. Условие содержит текст на языке шаблонов ограничений 1С.
### Типичная структура условия
```
#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
#ДляОбъекта("")
#Иначе
#ПоЗначениям("Документ.Реализация", "", "",
"Организации", "Организация",
"","",
...)
#КонецЕсли
```
Используются препроцессорные директивы (`#Если`, `#Тогда`, `#Иначе`, `#КонецЕсли`) и макросы шаблонов (`#ДляОбъекта`, `#ПоЗначениям`, `#ДляРегистра`, `#ПоЗначениямИНаборамРасширенный`).
XML-кодирование: `&``&amp;` в тексте условия.
### Применимость
RLS применяется к правам `Read`, `Update`, `Insert`, `Delete` объектов данных (Catalog, Document, Register и др.). Не применяется к интерактивным правам и правам конфигурации.
---
## Шаблоны ограничений (restrictionTemplate)
Располагаются в конце файла Rights.xml, после всех блоков `<object>`.
```xml
<restrictionTemplate>
<name>ИмяШаблона(Параметр1, Параметр2, ...)</name>
<condition>
// Комментарий с описанием параметров
// ...
Текст шаблона на языке запросов 1С
</condition>
</restrictionTemplate>
```
### Типичные шаблоны
| Шаблон | Описание |
|--------|----------|
| `ДляОбъекта(Модификатор)` | Ограничение для ссылочных объектов (документы, справочники) |
| `ПоЗначениям(Таблица, -, Модификатор, В1,П1, ...)` | Ограничение по значениям видов доступа |
| `ДляРегистра(Регистр, Поле1, ..., Поле5)` | Ограничение для регистров |
| `ПоЗначениямИНаборамРасширенный(...)` | Расширенное ограничение по наборам и значениям |
Шаблоны определяются в роли и вызываются из `<condition>` блоков RLS через макросы `#ИмяШаблона(...)`.
---
## Примеры
### Минимальная роль (без прав)
**Roles/МояРоль.xml:**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
<Role uuid="00000000-0000-0000-0000-000000000001">
<Properties>
<Name>МояРоль</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Моя роль</v8:content>
</v8:item>
</Synonym>
<Comment/>
</Properties>
</Role>
</MetaDataObject>
```
**Roles/МояРоль/Ext/Rights.xml:**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<Rights xmlns="http://v8.1c.ru/8.2/roles" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="Rights" version="2.17">
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
</Rights>
```
### Роль для регламентного задания
Типичный набор прав для фонового задания, работающего со справочниками и регистрами:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<Rights xmlns="http://v8.1c.ru/8.2/roles" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="Rights" version="2.17">
<setForNewObjects>false</setForNewObjects>
<setForAttributesByDefault>true</setForAttributesByDefault>
<independentRightsOfChildObjects>false</independentRightsOfChildObjects>
<object>
<name>Catalog.Номенклатура</name>
<right>
<name>Read</name>
<value>true</value>
</right>
</object>
<object>
<name>Catalog.Контрагенты</name>
<right>
<name>Read</name>
<value>true</value>
</right>
</object>
<object>
<name>InformationRegister.ЦеныНоменклатуры</name>
<right>
<name>Read</name>
<value>true</value>
</right>
<right>
<name>Update</name>
<value>true</value>
</right>
</object>
<object>
<name>DataProcessor.ОбновлениеЦен</name>
<right>
<name>Use</name>
<value>true</value>
</right>
</object>
</Rights>
```
### Роль с запретом редактирования полей
```xml
<object>
<name>Document.РеализацияТоваровУслуг</name>
<right>
<name>Read</name>
<value>true</value>
</right>
<right>
<name>View</name>
<value>true</value>
</right>
</object>
<object>
<name>Document.РеализацияТоваровУслуг.StandardAttribute.Posted</name>
<right>
<name>Edit</name>
<value>false</value>
</right>
</object>
<object>
<name>Document.РеализацияТоваровУслуг.StandardAttribute.DeletionMark</name>
<right>
<name>Edit</name>
<value>false</value>
</right>
</object>
```
---
## Версии формата
| Платформа | version (метаданные) | version (Rights.xml) | Изменения |
|-----------|:--------------------:|:--------------------:|-----------|
| 8.3.20 | 2.17 | 2.17 | Базовая |
| 8.3.24 | 2.17 | 2.17 | Без изменений |
| 8.3.27 | 2.20 | 2.20 | Только номер версии, структура идентична |
Namespace Rights.xml (`http://v8.1c.ru/8.2/roles`) и namespace метаданных (`http://v8.1c.ru/8.3/MDClasses`) не менялись.
-173
View File
@@ -1,173 +0,0 @@
# Сводный индекс спецификаций формата XML конфигурации 1С
Единая точка входа ко всем спецификациям XML-формата выгрузки 1С:Предприятие 8.3.
---
## 1. Корневые файлы конфигурации
| Файл | Описание | Спецификация |
|------|----------|--------------|
| `Configuration.xml` | Свойства и состав конфигурации | [1c-configuration-spec.md § 2](1c-configuration-spec.md#2-configurationxml--корневой-файл-конфигурации) |
| `ConfigDumpInfo.xml` | Версии объектов (служебный) | [1c-configuration-spec.md § 3](1c-configuration-spec.md#3-configdumpinfoxml--служебный-файл-выгрузки) |
| `Ext/` | Модули, интерфейс, начальная страница | [1c-configuration-spec.md § 4](1c-configuration-spec.md#4-ext--корневой-каталог-конфигурации) |
| `Ext/ParentConfigurations.bin` | Состояние поддержки (конфигурации поставщика, пообъектные правила) | [1c-support-state-spec.md](1c-support-state-spec.md) |
| `Languages/` | Языки конфигурации | [1c-configuration-spec.md § 5](1c-configuration-spec.md#5-языки-languages) |
---
## 2. Объекты метаданных
Все типы объектов, встречающиеся в `ChildObjects` корневого `Configuration.xml`. Порядок соответствует порядку в XML.
### Служебные и интерфейсные
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `Language` | `Languages/` | Языки | [1c-configuration-spec.md § 5](1c-configuration-spec.md#5-языки-languages) |
| `Subsystem` | `Subsystems/` | Подсистемы | [1c-subsystem-spec.md § 3](1c-subsystem-spec.md#3-формат-подсистемы) |
| `StyleItem` | `StyleItems/` | Элементы стиля | [1c-configuration-spec.md § 6.16](1c-configuration-spec.md#616-styleitem--элемент-стиля) |
| `Style` | `Styles/` | Стили (устаревший) | [1c-configuration-spec.md § 6.17](1c-configuration-spec.md#617-style--стиль-устаревший) |
| `CommandGroup` | `CommandGroups/` | Группы команд | [1c-subsystem-spec.md § 5](1c-subsystem-spec.md#5-формат-группы-команд-commandgroup) |
### Общие объекты
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `CommonPicture` | `CommonPictures/` | Общие картинки | [1c-configuration-spec.md § 6.1](1c-configuration-spec.md#61-commonpicture--общая-картинка) |
| `SessionParameter` | `SessionParameters/` | Параметры сеанса | [1c-configuration-spec.md § 6.6](1c-configuration-spec.md#66-sessionparameter--параметр-сеанса) |
| `Role` | `Roles/` | Роли | [1c-role-spec.md § Файл метаданных](1c-role-spec.md#файл-метаданных-rolesимяролиxml) |
| `CommonTemplate` | `CommonTemplates/` | Общие макеты | [1c-configuration-spec.md § 6.2](1c-configuration-spec.md#62-commontemplate--общий-макет) |
| `FilterCriterion` | `FilterCriteria/` | Критерии отбора | [1c-configuration-spec.md § 6.11](1c-configuration-spec.md#611-filtercriterion--критерий-отбора) |
| `CommonModule` | `CommonModules/` | Общие модули | [1c-config-objects-spec.md § 21](1c-config-objects-spec.md#21-общие-модули-commonmodules) |
| `CommonAttribute` | `CommonAttributes/` | Общие реквизиты | [1c-configuration-spec.md § 6.3](1c-configuration-spec.md#63-commonattribute--общий-реквизит) |
| `CommonCommand` | `CommonCommands/` | Общие команды | [1c-subsystem-spec.md § 6](1c-subsystem-spec.md#6-формат-общей-команды-commoncommand) |
| `CommonForm` | `CommonForms/` | Общие формы | [1c-configuration-spec.md § 6.4](1c-configuration-spec.md#64-commonform--общая-форма) |
### Интеграция и сервисы
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `ExchangePlan` | `ExchangePlans/` | Планы обмена | [1c-config-objects-spec.md § 15](1c-config-objects-spec.md#15-планы-обмена-exchangeplans) |
| `XDTOPackage` | `XDTOPackages/` | XDTO-пакеты | [1c-configuration-spec.md § 6.14](1c-configuration-spec.md#614-xdtopackage--xdto-пакет) |
| `WebService` | `WebServices/` | Веб-сервисы | [1c-config-objects-spec.md § 25](1c-config-objects-spec.md#25-веб-сервисы-webservices) |
| `HTTPService` | `HTTPServices/` | HTTP-сервисы | [1c-config-objects-spec.md § 24](1c-config-objects-spec.md#24-http-сервисы-httpservices) |
| `WSReference` | `WSReferences/` | WS-ссылки | [1c-configuration-spec.md § 6.15](1c-configuration-spec.md#615-wsreference--ws-ссылка) |
| `IntegrationService` | `IntegrationServices/` | Сервисы интеграции | [1c-configuration-spec.md § 6.13](1c-configuration-spec.md#613-integrationservice--сервис-интеграции) |
### Поведение и параметризация
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `EventSubscription` | `EventSubscriptions/` | Подписки на события | [1c-config-objects-spec.md § 23](1c-config-objects-spec.md#23-подписки-на-события-eventsubscriptions) |
| `ScheduledJob` | `ScheduledJobs/` | Регламентные задания | [1c-config-objects-spec.md § 22](1c-config-objects-spec.md#22-регламентные-задания-scheduledjobs) |
| `SettingsStorage` | `SettingsStorages/` | Хранилища настроек | [1c-configuration-spec.md § 6.10](1c-configuration-spec.md#610-settingsstorage--хранилище-настроек) |
| `FunctionalOption` | `FunctionalOptions/` | Функциональные опции | [1c-configuration-spec.md § 6.7](1c-configuration-spec.md#67-functionaloption--функциональная-опция) |
| `FunctionalOptionsParameter` | `FunctionalOptionsParameters/` | Параметры ФО | [1c-configuration-spec.md § 6.8](1c-configuration-spec.md#68-functionaloptionsparameter--параметр-функциональных-опций) |
| `DefinedType` | `DefinedTypes/` | Определяемые типы | [1c-config-objects-spec.md § 20](1c-config-objects-spec.md#20-определяемые-типы-definedtypes) |
| `Constant` | `Constants/` | Константы | [1c-config-objects-spec.md § 17](1c-config-objects-spec.md#17-константы-constants) |
### Прикладные объекты
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `Catalog` | `Catalogs/` | Справочники | [1c-config-objects-spec.md § 7](1c-config-objects-spec.md#7-справочники-catalogs) |
| `Document` | `Documents/` | Документы | [1c-config-objects-spec.md § 8](1c-config-objects-spec.md#8-документы-documents) |
| `DocumentNumerator` | `DocumentNumerators/` | Нумераторы документов | [1c-configuration-spec.md § 6.12](1c-configuration-spec.md#612-documentnumerator--нумератор-документов) |
| `Sequence` | `Sequences/` | Последовательности | [1c-configuration-spec.md § 6.9](1c-configuration-spec.md#69-sequence--последовательность-документов) |
| `DocumentJournal` | `DocumentJournals/` | Журналы документов | [1c-config-objects-spec.md § 19](1c-config-objects-spec.md#19-журналы-документов-documentjournals) |
| `Enum` | `Enums/` | Перечисления | [1c-config-objects-spec.md § 16](1c-config-objects-spec.md#16-перечисления-enums) |
| `Report` | `Reports/` | Отчёты | [1c-config-objects-spec.md § 18](1c-config-objects-spec.md#18-отчёты-и-обработки) |
| `DataProcessor` | `DataProcessors/` | Обработки | [1c-config-objects-spec.md § 18](1c-config-objects-spec.md#18-отчёты-и-обработки) |
### Регистры
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `InformationRegister` | `InformationRegisters/` | Регистры сведений | [1c-config-objects-spec.md § 9.1](1c-config-objects-spec.md#91-регистры-сведений-informationregisters) |
| `AccumulationRegister` | `AccumulationRegisters/` | Регистры накопления | [1c-config-objects-spec.md § 9.4](1c-config-objects-spec.md#94-регистры-накопления-accumulationregisters) |
| `AccountingRegister` | `AccountingRegisters/` | Регистры бухгалтерии | [1c-config-objects-spec.md § 9.5](1c-config-objects-spec.md#95-регистры-бухгалтерии-accountingregisters) |
| `CalculationRegister` | `CalculationRegisters/` | Регистры расчёта | [1c-config-objects-spec.md § 9.6](1c-config-objects-spec.md#96-регистры-расчёта-calculationregisters) |
### Планы
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `ChartOfCharacteristicTypes` | `ChartsOfCharacteristicTypes/` | Планы видов характеристик | [1c-config-objects-spec.md § 11](1c-config-objects-spec.md#11-планы-видов-характеристик-chartsofcharacteristictypes) |
| `ChartOfAccounts` | `ChartsOfAccounts/` | Планы счетов | [1c-config-objects-spec.md § 10](1c-config-objects-spec.md#10-планы-счетов-chartsofaccounts) |
| `ChartOfCalculationTypes` | `ChartsOfCalculationTypes/` | Планы видов расчёта | [1c-config-objects-spec.md § 12](1c-config-objects-spec.md#12-планы-видов-расчёта-chartsofcalculationtypes) |
### Бизнес-процессы
| XML-элемент | Каталог | Русское название | Спецификация |
|-------------|---------|-----------------|--------------|
| `BusinessProcess` | `BusinessProcesses/` | Бизнес-процессы | [1c-config-objects-spec.md § 13](1c-config-objects-spec.md#13-бизнес-процессы-businessprocesses) |
| `Task` | `Tasks/` | Задачи | [1c-config-objects-spec.md § 14](1c-config-objects-spec.md#14-задачи-tasks) |
---
## 3. Вложенные форматы
Форматы файлов, вложенных в каталоги объектов метаданных.
| Формат | Файл | Описание | Спецификация |
|--------|------|----------|--------------|
| Управляемая форма | `Ext/Form.xml` | Элементы, реквизиты, команды | [1c-form-spec.md § 1](1c-form-spec.md#1-корневой-элемент) |
| СКД (DataCompositionSchema) | `Ext/Template.xml` | Схема компоновки данных | [1c-dcs-spec.md § 2](1c-dcs-spec.md#2-общая-структура-datacompositionschema) |
| Табличный документ (MXL) | `Ext/Template.xml` | Печатная форма | [1c-spreadsheet-spec.md](1c-spreadsheet-spec.md#структура-документа) |
| Роль (Rights) | `Ext/Rights.xml` | Права доступа и RLS | [1c-role-spec.md](1c-role-spec.md#файл-прав-rolesимяролиextrightsxml) |
| Справка (Help) | `Ext/Help/` | Встроенная справка | [1c-help-spec.md § 1](1c-help-spec.md#1-структура-файлов) |
| Предопределённые элементы | `Predefined.xml` | Предопределённые справочники/ПВХ | [1c-config-objects-spec.md § 7.2](1c-config-objects-spec.md#72-предопределённые-элементы-predefinedxml) |
| Состав плана обмена | `Content.xml` | Объекты синхронизации | [1c-config-objects-spec.md § 15.4](1c-config-objects-spec.md#154-состав-плана-обмена-contentxml) |
| Карта маршрута | `Flowchart.xml` | Маршрут бизнес-процесса | [1c-config-objects-spec.md § 13.3](1c-config-objects-spec.md#133-карта-маршрута-flowchartxml) |
---
## 4. Расширения конфигурации (CFE)
| Тема | Описание | Спецификация |
|------|----------|--------------|
| Общая структура выгрузки | Каталоги, отличия от конфигурации | [1c-extension-spec.md § 1](1c-extension-spec.md#1-общая-структура-выгрузки-расширения) |
| Configuration.xml расширения | Свойства, назначение, ChildObjects | [1c-extension-spec.md § 2](1c-extension-spec.md#2-configurationxml--корневой-файл-расширения) |
| Заимствованные / собственные объекты | ObjectBelonging, ExtendedConfigurationObject | [1c-extension-spec.md § 4](1c-extension-spec.md#4-заимствованные-и-собственные-объекты) |
| Расширение свойств (xr:PropertyState) | MultiState, ExtendedProperty | [1c-extension-spec.md § 6](1c-extension-spec.md#6-расширение-свойств-xrpropertystate-и-xrextendedproperty) |
| Модули и декораторы перехвата | &Перед, &После, &Вместо, diff-маркеры | [1c-extension-spec.md § 7](1c-extension-spec.md#7-модули-в-расширениях) |
| Предопределённые элементы | ExtensionState: Native | [1c-extension-spec.md § 8](1c-extension-spec.md#8-предопределённые-элементы-в-расширениях) |
---
## 5. Внешние обработки и отчёты
| Формат | Описание | Спецификация |
|--------|----------|--------------|
| EPF (внешняя обработка) | ExternalDataProcessor | [1c-epf-spec.md § 1](1c-epf-spec.md#1-структура-каталогов) |
| ERF (внешний отчёт) | ExternalReport | [1c-erf-spec.md § 1](1c-erf-spec.md#1-структура-каталогов) |
---
## 6. Общие элементы формата
Общие для всех типов объектов структуры XML описаны в спецификации объектов:
| Тема | Спецификация |
|------|--------------|
| Корневой элемент MetaDataObject | [1c-config-objects-spec.md § 2](1c-config-objects-spec.md#2-общий-формат-xml) |
| Пространства имён XML | [1c-config-objects-spec.md § 2.2](1c-config-objects-spec.md#22-пространства-имён) |
| InternalInfo / GeneratedType | [1c-config-objects-spec.md § 3](1c-config-objects-spec.md#3-internalinfo--внутренняя-информация) |
| Общие свойства Properties | [1c-config-objects-spec.md § 4](1c-config-objects-spec.md#4-общие-элементы-properties) |
| Стандартные реквизиты | [1c-config-objects-spec.md § 5](1c-config-objects-spec.md#5-стандартные-реквизиты-standardattributes) |
| Дочерние объекты (Attribute, TabularSection, Form, Template, Command) | [1c-config-objects-spec.md § 6](1c-config-objects-spec.md#6-дочерние-объекты-childobjects) |
| Формат ссылок на объекты | [1c-config-objects-spec.md § 28](1c-config-objects-spec.md#28-формат-ссылок-на-объекты-метаданных) |
| Различия версий 2.17 → 2.20 | [1c-config-objects-spec.md § 26](1c-config-objects-spec.md#26-различия-версий-платформы) |
---
## 7. DSL-спецификации (компактный формат ввода)
| DSL | Описание | Спецификация |
|-----|----------|--------------|
| Meta DSL | JSON-формат для создания/редактирования объектов | [meta-dsl-spec.md](meta-dsl-spec.md) |
| Form DSL | JSON-формат для компиляции форм | [form-dsl-spec.md](form-dsl-spec.md) |
| SKD DSL | JSON-формат для компиляции СКД | [skd-dsl-spec.md](skd-dsl-spec.md) |
| MXL DSL | JSON-формат для компиляции табличных документов | [mxl-dsl-spec.md](mxl-dsl-spec.md) |
| Role DSL | JSON-формат для компиляции ролей | [role-dsl-spec.md](role-dsl-spec.md) |
-449
View File
@@ -1,449 +0,0 @@
# Спецификация XML-формата табличного документа (SpreadsheetDocument)
Формат файла `Template.xml` для макетов типа `SpreadsheetDocument` (табличный документ / MXL).
## Namespace
```xml
<document xmlns="http://v8.1c.ru/8.2/data/spreadsheet"
xmlns:style="http://v8.1c.ru/8.1/data/ui/style"
xmlns:v8="http://v8.1c.ru/8.1/data/core"
xmlns:v8ui="http://v8.1c.ru/8.1/data/ui"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
```
## Структура документа
Элементы внутри `<document>` идут в фиксированном порядке:
```
<document>
<languageSettings> — языковые настройки
<columns> ... — наборы колонок (один или несколько)
<rowsItem> ... — строки с данными (повторяются)
<drawing> ... — рисунки (опционально, повторяются)
<templateMode>true — признак макета
<defaultFormatIndex> — индекс формата по умолчанию
<height> — общее количество строк
<vgRows> — видимых строк (обычно = height)
<merge> ... — объединения ячеек (повторяются)
<verticalUnmerge> ... — отмена объединений (опционально)
<namedItem> ... — именованные области (повторяются)
<line> ... — стили линий (повторяются)
<font> ... — шрифты (опционально, повторяются)
<format> ... — форматы (повторяются)
<picture> ... — ресурсы картинок (опционально)
</document>
```
## Индексация
Все палитры (линии, шрифты, форматы) — **плоские массивы**, на элементы которых ссылаются по индексу.
| Палитра | Индексация | Индекс 0 означает |
|-----------|------------|--------------------------------------|
| `<line>` | 0-based | Первый элемент `<line>` |
| `<font>` | 0-based | Первый элемент `<font>` |
| `<format>`| **1-based**| 0 = «формат по умолчанию» (не задан) |
Формат с индексом N — это N-й элемент `<format>` в документе (считая от 1).
## Языковые настройки
```xml
<languageSettings>
<currentLanguage>ru</currentLanguage>
<defaultLanguage>ru</defaultLanguage>
<languageInfo>
<id>ru</id>
<code>Русский</code>
<description>Русский</description>
</languageInfo>
</languageSettings>
```
## Колонки
### Основной набор
```xml
<columns>
<size>33</size> <!-- общее количество колонок -->
<columnsItem>
<index>1</index> <!-- индекс колонки (0-based) -->
<column>
<formatIndex>1</formatIndex> <!-- ссылка на format[] -->
</column>
</columnsItem>
...
</columns>
```
Перечисляются только колонки с нестандартной шириной. Формат колонки определяет ширину через свойство `<width>` в палитре форматов.
### Дополнительные наборы колонок
Некоторые строки документа могут использовать **собственную сетку колонок**, отличную от основной. Каждый дополнительный набор имеет UUID:
```xml
<columns>
<id>f01e015f-de4c-4f97-9fbe-a244c4c30c6c</id>
<size>17</size>
<columnsItem>
<index>0</index>
<column>
<formatIndex>12</formatIndex>
</column>
</columnsItem>
...
</columns>
```
- Первый `<columns>` — основной набор (без `<id>`)
- Дополнительные наборы — с `<id>` (UUID), могут иметь другое количество и ширину колонок
- Строки, merge и namedItem ссылаются на набор через `<columnsID>`
Типичное применение: сложные печатные формы (УПД, УКД), где шапка/подвал/табличная часть имеют разную разбивку на колонки.
## Строки и ячейки
### Строка
```xml
<rowsItem>
<index>3</index> <!-- индекс строки (0-based) -->
<indexTo>5</indexTo> <!-- опц.: диапазон [index..indexTo] с одинаковым содержимым -->
<row>
<columnsID>f01e015f-...</columnsID> <!-- опц.: набор колонок (UUID) -->
<formatIndex>5</formatIndex> <!-- опц.: формат строки (определяет высоту) -->
<empty>true</empty> <!-- опц.: пустая строка -->
<c>...</c> <!-- ячейки (повторяются) -->
</row>
</rowsItem>
```
- Строки с одинаковым содержимым объединяются через `<indexTo>`
- `<columnsID>` привязывает строку к дополнительному набору колонок. Без него — используется основной набор
### Ячейка
Ячейки внутри `<row>` — элементы `<c>` (cell group), каждый содержит `<c>` (cell content):
```xml
<c> <!-- cell group -->
<i>6</i> <!-- индекс колонки (0-based), опционален -->
<c> <!-- cell content -->
<f>9</f> <!-- индекс формата -->
<parameter>Имя</parameter> <!-- параметр для заполнения -->
<detailParameter>Расш</detailParameter> <!-- параметр расшифровки -->
<tl> <!-- текст (локализованная строка) -->
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Итого:</v8:content>
</v8:item>
</tl>
</c>
</c>
```
**Правила позиционирования `<i>`:**
- Если `<i>` указан — ячейка в этой колонке
- Если `<i>` не указан — колонка = предыдущая + 1
- Первая ячейка без `<i>` идёт в колонку 0
### Типы заполнения ячеек
Тип заполнения определяется свойством `fillType` в формате ячейки:
| fillType | Данные ячейки | Описание |
|-------------|-------------------------------|----------------------------------------|
| `Parameter` | `<parameter>Имя</parameter>` | Значение подставляется программно |
| `Template` | `<tl>Текст [Параметр]</tl>` | Шаблон — `[Имя]` заменяется на значение |
| `Text` | `<tl>Текст</tl>` | Статический текст |
| *(нет)* | — | Пустая ячейка или ячейка с форматированием |
`<detailParameter>` — имя параметра расшифровки (для навигации при клике на ячейку).
## Рисунки
```xml
<drawing>
<drawingType>Picture</drawingType>
<id>1</id>
<formatIndex>11</formatIndex>
<beginRow>3</beginRow>
<beginRowOffset>6</beginRowOffset>
<endRow>4</endRow>
<endRowOffset>33</endRowOffset>
<beginColumn>2</beginColumn>
<beginColumnOffset>0</beginColumnOffset>
<endColumn>4</endColumn>
<endColumnOffset>183</endColumnOffset>
<autoSize>false</autoSize>
<pictureSize>Proportionally</pictureSize>
<zOrder>1</zOrder>
<pictureIndex>1</pictureIndex>
</drawing>
```
Позиция задаётся через начальную/конечную строку и колонку + смещения в пикселях. `pictureIndex` ссылается на ресурс из палитры `<picture>`.
## Объединения ячеек
```xml
<merge>
<r>3</r> <!-- строка (0-based), -1 = все строки -->
<c>1</c> <!-- колонка (0-based) -->
<h>1</h> <!-- доп. строк (опц., по умолчанию 0 = одна строка) -->
<w>30</w> <!-- доп. колонок -->
<columnsID>f01e015f-...</columnsID> <!-- опц.: набор колонок -->
</merge>
```
Размер объединения: `(h + 1)` строк × `(w + 1)` колонок. Если `<h>` не указан — объединение в пределах одной строки.
`<r>-1</r>` — объединение действует для всех строк, использующих данный набор колонок (аналог объединения колонок на уровне всего документа).
### Отмена объединений
`<verticalUnmerge>` отменяет вертикальное объединение для конкретной строки:
```xml
<verticalUnmerge>
<r>10</r> <!-- строка (0-based) -->
<c>7</c> <!-- колонка (0-based) -->
<w>12</w> <!-- доп. колонок -->
</verticalUnmerge>
```
Используется в сложных макетах, когда глобальное объединение колонок (`<r>-1</r>`) нужно разорвать в отдельных строках.
## Именованные области
Именованные области — аналог «имён» в табличном документе 1С. Используются для программного вывода секций.
Получение области:
```bsl
// Горизонтальная область (диапазон строк)
Область = Макет.ПолучитьОбласть("Заголовок");
// Пересечение горизонтальной и вертикальной областей
Область = Макет.ПолучитьОбласть("ВысотаЭтикетки|ШиринаЭтикетки");
```
Пересечение через `|` типично для этикеток и ценников, где нужна область фиксированного размера (высота × ширина).
### Тип Rows — горизонтальная область
```xml
<namedItem xsi:type="NamedItemCells">
<name>Заголовок</name>
<area>
<type>Rows</type>
<beginRow>1</beginRow> <!-- 0-based -->
<endRow>4</endRow>
<beginColumn>-1</beginColumn> <!-- -1 = все колонки -->
<endColumn>-1</endColumn>
</area>
</namedItem>
```
### Тип Columns — вертикальная область
```xml
<namedItem xsi:type="NamedItemCells">
<name>ШиринаЭтикетки</name>
<area>
<type>Columns</type>
<beginRow>-1</beginRow> <!-- -1 = все строки -->
<endRow>-1</endRow>
<beginColumn>1</beginColumn> <!-- 0-based -->
<endColumn>5</endColumn>
</area>
</namedItem>
```
### Тип Rectangle — прямоугольная область
Область, ограниченная и по строкам, и по колонкам. Используется с дополнительными наборами колонок:
```xml
<namedItem xsi:type="NamedItemCells">
<name>ОбластьЗаписьДо</name>
<area>
<type>Rectangle</type>
<beginRow>22</beginRow> <!-- 0-based -->
<endRow>22</endRow>
<beginColumn>5</beginColumn> <!-- 0-based -->
<endColumn>17</endColumn>
<columnsID>c6cb0794-...</columnsID> <!-- набор колонок -->
</area>
</namedItem>
```
### Привязка к набору колонок
Именованные области могут ссылаться на дополнительный набор колонок через `<columnsID>`:
```xml
<namedItem xsi:type="NamedItemCells">
<name>НумерацияЛистов</name>
<area>
<type>Rows</type>
<beginRow>59</beginRow>
<endRow>59</endRow>
<beginColumn>-1</beginColumn>
<endColumn>-1</endColumn>
<columnsID>0adf41ed-...</columnsID>
</area>
</namedItem>
```
### Тип Drawing — именованный рисунок
```xml
<namedItem xsi:type="NamedItemDrawing">
<name>Штрихкод</name>
<drawingID>1</drawingID> <!-- ссылка на drawing/id -->
</namedItem>
```
## Стили линий
Палитра линий для границ ячеек и рисунков. Индексация 0-based.
```xml
<!-- Для границ ячеек -->
<line width="2" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentCellLineType">Solid</v8ui:style>
</line>
<!-- Для границ рисунков -->
<line width="1" gap="false">
<v8ui:style xsi:type="v8ui:SpreadsheetDocumentDrawingLineType">None</v8ui:style>
</line>
```
| xsi:type | Значения |
|-----------------------------------------|-------------|
| `v8ui:SpreadsheetDocumentCellLineType` | Solid, None |
| `v8ui:SpreadsheetDocumentDrawingLineType` | Solid, None |
Атрибут `width` — толщина линии (1 = тонкая, 2 = толстая).
## Шрифты
Палитра шрифтов. Индексация 0-based.
```xml
<!-- Абсолютный шрифт -->
<font faceName="Arial" height="14" bold="true" italic="false"
underline="false" strikeout="false" kind="Absolute" scale="100"/>
<!-- Ссылка на стиль -->
<font ref="style:TextFont" kind="StyleItem"/>
```
## Форматы
Палитра форматов — центральный элемент. **Индексация 1-based** (индекс 0 = формат не задан).
```xml
<format>
<font>0</font> <!-- индекс шрифта (0-based) -->
<leftBorder>0</leftBorder> <!-- индекс линии левой границы -->
<topBorder>1</topBorder> <!-- индекс линии верхней границы -->
<rightBorder>0</rightBorder> <!-- индекс линии правой границы -->
<bottomBorder>1</bottomBorder> <!-- индекс линии нижней границы -->
<width>24</width> <!-- ширина (для колонок) -->
<height>84</height> <!-- высота (для строк) -->
<horizontalAlignment>Center</horizontalAlignment> <!-- Left | Center | Right -->
<verticalAlignment>Center</verticalAlignment> <!-- Top | Center -->
<textPlacement>Wrap</textPlacement> <!-- Wrap = перенос по словам -->
<fillType>Parameter</fillType> <!-- Parameter | Template | Text -->
<format> <!-- строка формата (опционально) -->
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ЧЦ=15; ЧДЦ=2</v8:content>
</v8:item>
</format>
<drawingBorder>1</drawingBorder> <!-- индекс линии для рисунка -->
</format>
```
Все свойства опциональны. Формат может содержать только `<width>` (для колонки) или только `<height>` (для строки).
### Связь формата с контекстом
| Контекст | Ссылка | Значимые свойства формата |
|------------------|--------------------|--------------------------|
| Колонка | `<formatIndex>` | `width` |
| Строка | `<formatIndex>` | `height` |
| Ячейка | `<f>` | Все остальные |
| Рисунок | `<formatIndex>` | `drawingBorder` |
| По умолчанию | `<defaultFormatIndex>` | `width` |
## Ресурсы картинок
```xml
<picture>
<index>0</index>
<picture ref="v8ui:Штрихкод"/> <!-- ссылка на предопределённую картинку -->
</picture>
```
## Типичная структура макета печатной формы
Печатная форма обычно состоит из именованных горизонтальных областей:
```
Заголовок — шапка документа (название, номер, дата)
Поставщик — реквизиты поставщика
Покупатель — реквизиты покупателя
ШапкаТаблицы — заголовок таблицы товаров
Строка — строка товара (выводится в цикле)
Итого — итоговая строка
СуммаПрописью — сумма прописью
Подписи — блок подписей
```
Каждая область — диапазон строк, получаемый через `ПолучитьОбласть("Имя")` и выводимый через `Вывести()`.
Параметры в ячейках (`<parameter>`) заполняются программно:
```bsl
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.НомерСтроки = НомерСтроки;
Область.Параметры.Товар = СтрокаТЧ.Номенклатура;
ТабДок.Вывести(Область);
```
## Совместимость версий платформы
Проведено сравнение выгрузок конфигурации «Бухгалтерия предприятия 3.0» на трёх версиях платформы: 8.3.20, 8.3.24, 8.3.27.
### Template.xml (табличный документ)
Содержимое `Template.xml` **побайтно идентично** на всех трёх версиях. Формат табличного документа стабилен — пространства имён, набор тегов и структура не менялись между 8.3.20 и 8.3.27.
### Метаданные (version в MetaDataObject)
Атрибут `version` корневого элемента `<MetaDataObject>` в XML-файлах метаданных (`.xml` объектов, форм, макетов):
| Платформа | version |
|-----------|---------|
| 8.3.20 | 2.17 |
| 8.3.24 | 2.17 |
| 8.3.27 | 2.20 |
### Form.xml (управляемая форма)
Содержимое `Form.xml` идентично между 8.3.20 и 8.3.24. Между 8.3.24 и 8.3.27 различается **только** атрибут `version` в корневом элементе `<Form>`: `"2.17"``"2.20"`. Пространства имён и структура не изменились.
### BSL-модули
Модули на встроенном языке (`ObjectModule.bsl`) полностью идентичны на всех трёх версиях.
### Обратная совместимость
Навыки генерируют XML с `version="2.17"`. Сборка EPF через `1cv8.exe` версии 8.3.27 проходит успешно — платформа принимает файлы с более старым номером версии без ошибок. Повышать `version` до `"2.20"` не требуется.
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More