mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-21 20:21:02 +03:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9eb4fd480 |
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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 недоступен."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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'
|
||||
```
|
||||
|
||||
## Операции
|
||||
|
||||
@@ -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 "<путь>"
|
||||
```
|
||||
|
||||
## Три режима
|
||||
|
||||
@@ -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 "МояКонфигурация"
|
||||
```
|
||||
|
||||
## Примеры
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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.Контрагенты"
|
||||
```
|
||||
|
||||
## Примеры
|
||||
|
||||
@@ -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 — обзор расширения
|
||||
|
||||
@@ -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 "МоёРасширение"
|
||||
```
|
||||
|
||||
## Примеры
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
## Примеры
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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 "Новая база"
|
||||
```
|
||||
|
||||
@@ -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 "МоёРасширение"
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
## Связанные навыки
|
||||
|
||||
@@ -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 "МоёРасширение"
|
||||
```
|
||||
|
||||
@@ -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 "МоёРасширение"
|
||||
```
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
## Связанные навыки
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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 "ЗапуститьОбновление"
|
||||
```
|
||||
|
||||
@@ -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 "МоёРасширение"
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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>"]
|
||||
```
|
||||
|
||||
## Дальнейшие шаги
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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]
|
||||
```
|
||||
|
||||
## Дальнейшие шаги
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
|
||||
@@ -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 — назначение формы
|
||||
|
||||
@@ -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 — справка
|
||||
|
||||
@@ -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>"
|
||||
```
|
||||
|
||||
## Что получаешь
|
||||
|
||||
@@ -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 формат
|
||||
|
||||
@@ -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>"
|
||||
```
|
||||
|
||||
## Параметры
|
||||
|
||||
@@ -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>"]
|
||||
```
|
||||
|
||||
## Что удаляется
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
|
||||
@@ -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>"]
|
||||
```
|
||||
|
||||
## Что делает скрипт
|
||||
|
||||
@@ -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>'
|
||||
```
|
||||
|
||||
## Операции
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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>"
|
||||
```
|
||||
|
||||
| Параметр | Описание |
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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>"
|
||||
```
|
||||
|
||||
| Параметр | Описание |
|
||||
|
||||
@@ -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 — добавить элементы
|
||||
|
||||
@@ -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 "<путь>"
|
||||
```
|
||||
|
||||
## Три режима
|
||||
|
||||
@@ -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.Товары"
|
||||
```
|
||||
|
||||
## Поддерживаемые типы
|
||||
|
||||
@@ -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/Заказ"
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
## Рабочий процесс
|
||||
|
||||
@@ -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"]
|
||||
```
|
||||
|
||||
## Рабочий процесс
|
||||
|
||||
@@ -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 "<каталог>"]
|
||||
```
|
||||
|
||||
Дополнительные флаги:
|
||||
|
||||
@@ -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/ПечатнаяФорма"
|
||||
```
|
||||
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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>
|
||||
```
|
||||
|
||||
### Параметры
|
||||
|
||||
@@ -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/МояРоль"
|
||||
```
|
||||
|
||||
@@ -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 — краткий справочник
|
||||
|
||||
@@ -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>"
|
||||
```
|
||||
|
||||
## Что получаешь
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 "<путь>"
|
||||
```
|
||||
|
||||
С указанием режима:
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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-определение
|
||||
|
||||
@@ -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.Товары'
|
||||
```
|
||||
|
||||
## Операции
|
||||
|
||||
@@ -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 "<путь>"
|
||||
```
|
||||
|
||||
## Пять режимов
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
## Маппинг типов
|
||||
|
||||
@@ -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>"]
|
||||
```
|
||||
|
||||
## Что удаляется
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# Коммиты, которые git blame должен «проскакивать» (механические правки —
|
||||
# не меняют авторство содержимого). Включить локально:
|
||||
# git config blame.ignoreRevsFile .git-blame-ignore-revs
|
||||
# GitHub/GitLab уважают этот файл в blame-UI автоматически.
|
||||
|
||||
# chore(repo): нормализация EOL к LF + .gitattributes
|
||||
26888a07d58351755fb8e487727c00d5b611eb95
|
||||
@@ -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
|
||||
@@ -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}}`
|
||||
@@ -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/"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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` в корневом файле соответствует реальному имени формы
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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 — проверить что справка открывается по кнопке
|
||||
@@ -1,845 +0,0 @@
|
||||
# Спецификация формата ролей 1С:Предприятия 8.3
|
||||
|
||||
Полное описание XML-формата ролей в выгрузке конфигурации. Версии формата: 2.17 (платформа 8.3.20–8.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-кодирование: `&` → `&` в тексте условия.
|
||||
|
||||
### Применимость
|
||||
|
||||
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`) не менялись.
|
||||
@@ -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) |
|
||||
@@ -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
Reference in New Issue
Block a user