mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-07 20:20:20 +03:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
063d4e98fc |
@@ -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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -59,14 +59,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -60,11 +60,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -61,10 +61,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -76,17 +76,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -65,11 +65,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -82,10 +82,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -72,8 +72,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -90,14 +90,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -64,14 +64,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -78,11 +78,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -64,8 +64,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -64,8 +64,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -66,8 +66,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" <параметры>
|
||||
```
|
||||
|
||||
### Параметры скрипта
|
||||
@@ -66,8 +66,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 "<путь>"
|
||||
```
|
||||
|
||||
## Три режима
|
||||
@@ -34,7 +34,9 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/meta-info.ps1" -Obj
|
||||
| `brief` | Всё одной-двумя строками: имена полей, счётчики |
|
||||
| `full` | Всё раскрыто: колонки ТЧ, список источников подписки, движения, формы |
|
||||
|
||||
`-Name` — drill-down: раскрыть конкретный элемент объекта (ТЧ, реквизит, шаблон URL, операцию веб-сервиса).
|
||||
`-Name` — drill-down: раскрыть конкретный элемент объекта (ТЧ, реквизит, стандартный реквизит,
|
||||
шаблон URL, операцию веб-сервиса). Составной тип в сводке свёрнут в счётчик — полный список
|
||||
типов даёт drill-down: `-Name ТипЗначения` у ПВХ, `-Name Владелец` у подчинённого справочника.
|
||||
|
||||
## Поддерживаемые типы (23)
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-info v1.4 — Compact summary of 1C metadata object
|
||||
# meta-info v1.8 — Compact summary of 1C metadata object
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][Alias('Path')][string]$ObjectPath,
|
||||
@@ -170,6 +170,22 @@ function Get-MLText($node) {
|
||||
return ""
|
||||
}
|
||||
|
||||
# Тип-множество: голое имя метатипа без `.Имя` означает ВСЕ ссылки этого класса
|
||||
# (см. docs/meta-dsl-spec.md §«Тип-множество»). Конкретный тип всегда пишется с точкой,
|
||||
# поэтому «СправочникСсылка» без точки читается однозначно как обобщённый.
|
||||
function Format-SingleTypeSet([string]$raw) {
|
||||
$raw = $raw -replace '^d\d+p\d+:', 'cfg:'
|
||||
if ($raw -match '^cfg:DefinedType\.(.+)$') { return "ОпределяемыйТип.$($Matches[1])" }
|
||||
if ($raw -match '^cfg:Characteristic\.(.+)$') { return "Характеристика.$($Matches[1])" }
|
||||
if ($raw -eq 'cfg:AnyRef') { return "ЛюбаяСсылка" }
|
||||
if ($raw -eq 'cfg:AnyIBRef') { return "ЛюбаяСсылкаИБ" }
|
||||
if ($raw -match '^cfg:(\w+Ref)$' -and $refTypeMap.ContainsKey($Matches[1])) {
|
||||
return $refTypeMap[$Matches[1]]
|
||||
}
|
||||
if ($raw -match '^cfg:(.+)$') { return $Matches[1] }
|
||||
return $raw
|
||||
}
|
||||
|
||||
function Format-Type($typeNode) {
|
||||
if (-not $typeNode) { return "" }
|
||||
$types = @()
|
||||
@@ -178,14 +194,7 @@ function Format-Type($typeNode) {
|
||||
$types += Format-SingleType $raw $typeNode
|
||||
}
|
||||
foreach ($t in $typeNode.SelectNodes("v8:TypeSet", $ns)) {
|
||||
$raw = $t.InnerText
|
||||
if ($raw -match '^cfg:DefinedType\.(.+)$') {
|
||||
$types += "ОпределяемыйТип.$($Matches[1])"
|
||||
} elseif ($raw -match '^cfg:Characteristic\.(.+)$') {
|
||||
$types += "Характеристика.$($Matches[1])"
|
||||
} else {
|
||||
$types += $raw
|
||||
}
|
||||
$types += Format-SingleTypeSet $t.InnerText
|
||||
}
|
||||
if ($types.Count -eq 0) { return "" }
|
||||
if ($types.Count -eq 1) { return $types[0] }
|
||||
@@ -287,6 +296,202 @@ function Format-Flags($propsNode, [bool]$isDimension = $false) {
|
||||
return " [$($flags -join ', ')]"
|
||||
}
|
||||
|
||||
# Ссылка на объект метаданных (`Catalog.Валюты` в Owners и подобных) — не тип значения,
|
||||
# но в выводе показываем именно тип, который присваивается: СправочникСсылка.Валюты.
|
||||
function Format-MDObjectRef([string]$raw) {
|
||||
if ($raw -match '^(\w+)\.(.+)$') {
|
||||
$key = "$($Matches[1])Ref"
|
||||
if ($refTypeMap.ContainsKey($key)) { return "$($refTypeMap[$key]).$($Matches[2])" }
|
||||
}
|
||||
return $raw
|
||||
}
|
||||
|
||||
# --- Стандартные реквизиты ---
|
||||
|
||||
# Сколько типов состава печатать списком, прежде чем свернуть в счётчик. По корпусу
|
||||
# acc/erp/ut/unf состав ПВХ доходит до 151 типа, при этом 20 из 42 ПВХ укладываются в 5.
|
||||
$script:composedTypeThreshold = 5
|
||||
|
||||
# Имена полей, состав которых свернули в счётчик, — по ним в конце вывода печатается
|
||||
# единственная подсказка, чем состав развернуть.
|
||||
$script:collapsedNames = @()
|
||||
|
||||
# Блок StandardAttributes в XML опционален: платформа материализует его только когда хотя бы
|
||||
# один стандартный реквизит кастомизирован (docs/meta-dsl-spec.md §7.1.1). Когда блока нет,
|
||||
# действуют платформенные дефолты — профиль ниже совпадает с $stdAttrProfile в meta-compile
|
||||
# (выведен из корпуса acc+erp). Правки держать синхронными, иначе навыки разъедутся молча.
|
||||
$stdAttrRequiredDefault = @{
|
||||
"Catalog" = @{ "Owner" = $true; "Description" = $true }
|
||||
"Document" = @{ "Date" = $true }
|
||||
"ExchangePlan" = @{ "Description" = $true; "Code" = $true }
|
||||
"ChartOfAccounts" = @{ "Description" = $true; "Code" = $true }
|
||||
"ChartOfCharacteristicTypes" = @{ "Description" = $true }
|
||||
"ChartOfCalculationTypes" = @{ "Description" = $true }
|
||||
}
|
||||
|
||||
function Test-StdAttrRequired($propsNode, [string]$attrName, [string]$objType) {
|
||||
$fc = $propsNode.SelectSingleNode("md:StandardAttributes/xr:StandardAttribute[@name='$attrName']/xr:FillChecking", $ns)
|
||||
if ($fc) { return ($fc.InnerText -eq "ShowError") }
|
||||
if ($stdAttrRequiredDefault.ContainsKey($objType) -and $stdAttrRequiredDefault[$objType].ContainsKey($attrName)) {
|
||||
return $stdAttrRequiredDefault[$objType][$attrName]
|
||||
}
|
||||
return $false
|
||||
}
|
||||
|
||||
function New-StdAttr([string]$name, [string]$type, $flags) {
|
||||
$f = @($flags | Where-Object { $_ })
|
||||
$flagStr = if ($f.Count -gt 0) { " [$($f -join ', ')]" } else { "" }
|
||||
return @{ Name = $name; Type = $type; Flags = $flagStr }
|
||||
}
|
||||
|
||||
# Стандартные реквизиты, наличие и характеристики которых задаются настройками объекта, —
|
||||
# их нельзя вывести из остального вывода, поэтому они попадают и в overview. Ссылка,
|
||||
# ПометкаУдаления, Родитель и прочее следуют из типа объекта и строки «Иерархический» —
|
||||
# они только в full (см. Get-StandardAttributesFull).
|
||||
function Get-StandardAttributes($propsNode, [string]$objType, [string]$mode) {
|
||||
$result = @()
|
||||
|
||||
# Владелец — только у подчинённого справочника; состав типов ниоткуда не выводится
|
||||
if ($objType -eq "Catalog") {
|
||||
$ownersNode = $propsNode.SelectSingleNode("md:Owners", $ns)
|
||||
$ownerTypes = @()
|
||||
if ($ownersNode) {
|
||||
foreach ($it in $ownersNode.SelectNodes("xr:Item", $ns)) {
|
||||
$ownerTypes += Format-MDObjectRef $it.InnerText
|
||||
}
|
||||
}
|
||||
if ($ownerTypes.Count -gt 0) {
|
||||
$req = if (Test-StdAttrRequired $propsNode "Owner" $objType) { "обязательный" } else { $null }
|
||||
$result += New-StdAttr "Владелец" ($ownerTypes -join ", ") @($req)
|
||||
}
|
||||
}
|
||||
|
||||
# ТипЗначения ПВХ — до полутора сотен типов, полный список раздул бы сводку в обоих
|
||||
# режимах, поэтому сворачиваем в счётчик. Состав смотреть через -Name ТипЗначения.
|
||||
if ($objType -eq "ChartOfCharacteristicTypes") {
|
||||
$vt = $propsNode.SelectSingleNode("md:Type", $ns)
|
||||
if ($vt) {
|
||||
$cnt = $vt.SelectNodes("v8:Type", $ns).Count + $vt.SelectNodes("v8:TypeSet", $ns).Count
|
||||
$typeStr = if ($cnt -gt $script:composedTypeThreshold) {
|
||||
$script:collapsedNames += "ТипЗначения"
|
||||
"Составной ($cnt)"
|
||||
} else { Format-Type $vt }
|
||||
if ($typeStr) { $result += New-StdAttr "ТипЗначения" $typeStr @() }
|
||||
}
|
||||
}
|
||||
|
||||
# Дата — есть всегда, ценна флагом обязательности
|
||||
if ($objType -in @("Document", "BusinessProcess", "Task")) {
|
||||
$req = if (Test-StdAttrRequired $propsNode "Date" $objType) { "обязательный" } else { $null }
|
||||
$result += New-StdAttr "Дата" "Дата" @($req)
|
||||
}
|
||||
|
||||
# Номер — тип и длина задаются объектом, при NumberLength=0 номера нет
|
||||
if ($objType -in @("Document", "BusinessProcess", "Task")) {
|
||||
$numLen = $propsNode.SelectSingleNode("md:NumberLength", $ns)
|
||||
if ($numLen -and [int]$numLen.InnerText -gt 0) {
|
||||
$numType = $propsNode.SelectSingleNode("md:NumberType", $ns)
|
||||
$ntRu = if ($numType -and $numType.InnerText -eq "Number") { "Число" } else { "Строка" }
|
||||
$flags = @()
|
||||
if (Test-StdAttrRequired $propsNode "Number" $objType) { $flags += "обязательный" }
|
||||
$numPer = $propsNode.SelectSingleNode("md:NumberPeriodicity", $ns)
|
||||
if ($numPer -and $numberPeriodMap.ContainsKey($numPer.InnerText)) { $flags += $numberPeriodMap[$numPer.InnerText] }
|
||||
$numAllowed = $propsNode.SelectSingleNode("md:NumberAllowedLength", $ns)
|
||||
if ($numAllowed -and $numAllowed.InnerText -eq "Fixed") { $flags += "фикс. длина" }
|
||||
$autoNum = $propsNode.SelectSingleNode("md:Autonumbering", $ns)
|
||||
if ($autoNum -and $autoNum.InnerText -eq "true") { $flags += "авто" }
|
||||
$result += New-StdAttr "Номер" "$ntRu($($numLen.InnerText))" $flags
|
||||
}
|
||||
}
|
||||
|
||||
# Код — при CodeLength=0 кода у объекта нет вовсе, строку не печатаем
|
||||
$codeLen = $propsNode.SelectSingleNode("md:CodeLength", $ns)
|
||||
if ($codeLen -and [int]$codeLen.InnerText -gt 0) {
|
||||
$codeType = $propsNode.SelectSingleNode("md:CodeType", $ns)
|
||||
$ctRu = if ($codeType -and $codeType.InnerText -eq "Number") { "Число" } else { "Строка" }
|
||||
$flags = @()
|
||||
if (Test-StdAttrRequired $propsNode "Code" $objType) { $flags += "обязательный" }
|
||||
$codeAllowed = $propsNode.SelectSingleNode("md:CodeAllowedLength", $ns)
|
||||
if ($codeAllowed -and $codeAllowed.InnerText -eq "Fixed") { $flags += "фикс. длина" }
|
||||
$result += New-StdAttr "Код" "$ctRu($($codeLen.InnerText))" $flags
|
||||
}
|
||||
|
||||
# Наименование — при DescriptionLength=0 наименования нет
|
||||
$descLen = $propsNode.SelectSingleNode("md:DescriptionLength", $ns)
|
||||
if ($descLen -and [int]$descLen.InnerText -gt 0) {
|
||||
$req = if (Test-StdAttrRequired $propsNode "Description" $objType) { "обязательный" } else { $null }
|
||||
$result += New-StdAttr "Наименование" "Строка($($descLen.InnerText))" @($req)
|
||||
}
|
||||
|
||||
return $result
|
||||
}
|
||||
|
||||
# Остальные стандартные реквизиты — предсказуемы по типу объекта, но в full полезны
|
||||
# как перечень доступных полей для запроса.
|
||||
function Get-StandardAttributesFull($propsNode, [string]$objType, [string]$objName) {
|
||||
$selfRef = switch ($objType) {
|
||||
"Catalog" { "СправочникСсылка.$objName" }
|
||||
"ChartOfCharacteristicTypes" { "ПВХСсылка.$objName" }
|
||||
"ChartOfAccounts" { "ПланСчетовСсылка.$objName" }
|
||||
"ChartOfCalculationTypes" { "ПВРСсылка.$objName" }
|
||||
"ExchangePlan" { "ПланОбменаСсылка.$objName" }
|
||||
"Document" { "ДокументСсылка.$objName" }
|
||||
"BusinessProcess" { "БизнесПроцессСсылка.$objName" }
|
||||
"Task" { "ЗадачаСсылка.$objName" }
|
||||
default { "" }
|
||||
}
|
||||
$result = @()
|
||||
if ($selfRef) { $result += New-StdAttr "Ссылка" $selfRef @() }
|
||||
$result += New-StdAttr "ПометкаУдаления" "Булево" @()
|
||||
|
||||
# Родитель и ЭтоГруппа существуют только у иерархических объектов
|
||||
$hier = $propsNode.SelectSingleNode("md:Hierarchical", $ns)
|
||||
$isHier = ($hier -and $hier.InnerText -eq "true") -or $objType -eq "ChartOfAccounts"
|
||||
if ($isHier -and $selfRef) {
|
||||
$result += New-StdAttr "Родитель" $selfRef @()
|
||||
$ht = $propsNode.SelectSingleNode("md:HierarchyType", $ns)
|
||||
if ($objType -eq "Catalog" -and (-not $ht -or $ht.InnerText -eq "HierarchyFoldersAndItems")) {
|
||||
$result += New-StdAttr "ЭтоГруппа" "Булево" @()
|
||||
}
|
||||
}
|
||||
|
||||
switch ($objType) {
|
||||
"Document" {
|
||||
$result += New-StdAttr "Проведен" "Булево" @()
|
||||
}
|
||||
"ExchangePlan" {
|
||||
$result += New-StdAttr "ЭтотУзел" "Булево" @()
|
||||
$result += New-StdAttr "НомерОтправленного" "Число" @()
|
||||
$result += New-StdAttr "НомерПринятого" "Число" @()
|
||||
}
|
||||
"BusinessProcess" {
|
||||
$result += New-StdAttr "Стартован" "Булево" @()
|
||||
$result += New-StdAttr "Завершен" "Булево" @()
|
||||
$result += New-StdAttr "ВедущаяЗадача" "ЗадачаСсылка" @()
|
||||
}
|
||||
"Task" {
|
||||
$result += New-StdAttr "Выполнена" "Булево" @()
|
||||
$result += New-StdAttr "БизнесПроцесс" "БизнесПроцессСсылка" @()
|
||||
$result += New-StdAttr "ТочкаМаршрута" "БизнесПроцессТочкаМаршрутаСсылка" @()
|
||||
}
|
||||
"ChartOfAccounts" {
|
||||
$result += New-StdAttr "Вид" "ВидСчета" @()
|
||||
$result += New-StdAttr "Забалансовый" "Булево" @()
|
||||
$result += New-StdAttr "Порядок" "Число" @()
|
||||
}
|
||||
"ChartOfCalculationTypes" {
|
||||
$result += New-StdAttr "ПериодДействияБазовый" "Булево" @()
|
||||
}
|
||||
}
|
||||
|
||||
# Предопределённые данные есть у всех перечисленных типов, кроме документов и задач
|
||||
if ($objType -in @("Catalog", "ChartOfCharacteristicTypes", "ChartOfAccounts", "ChartOfCalculationTypes")) {
|
||||
$result += New-StdAttr "Предопределенный" "Булево" @()
|
||||
$result += New-StdAttr "ИмяПредопределенныхДанных" "Строка" @()
|
||||
}
|
||||
return $result
|
||||
}
|
||||
|
||||
function Get-Attributes($parentNode, [string]$childTag = "Attribute", [bool]$isDimension = $false) {
|
||||
$result = @()
|
||||
foreach ($attr in $parentNode.SelectNodes("md:$childTag", $ns)) {
|
||||
@@ -329,7 +534,10 @@ function Get-MaxNameLen($attrs) {
|
||||
function Get-SimpleChildren($parentNode, [string]$tag) {
|
||||
$result = @()
|
||||
foreach ($child in $parentNode.SelectNodes("md:$tag", $ns)) {
|
||||
$result += $child.InnerText
|
||||
# Form/Template в ChildObjects — простые узлы с именем в тексте, а Command — узел
|
||||
# с вложенным Properties: у него InnerText склеил бы всё содержимое в одну строку.
|
||||
$nameNode = $child.SelectSingleNode("md:Properties/md:Name", $ns)
|
||||
if ($nameNode) { $result += $nameNode.InnerText } else { $result += $child.InnerText }
|
||||
}
|
||||
return $result
|
||||
}
|
||||
@@ -650,6 +858,43 @@ if ($Name -and $childObjs) {
|
||||
}
|
||||
}
|
||||
|
||||
# Не нашли среди дочерних объектов — пробуем стандартные реквизиты ниже
|
||||
}
|
||||
|
||||
# Drill-down по стандартному реквизиту — единственный способ увидеть состав типов целиком,
|
||||
# когда в сводке он свёрнут в счётчик. Живёт в Properties, а не в ChildObjects, поэтому идёт
|
||||
# отдельной веткой и работает даже у объектов без ChildObjects.
|
||||
if ($Name -and -not $drillDone) {
|
||||
$stdAll = @(Get-StandardAttributes $props $mdType "full") + @(Get-StandardAttributesFull $props $mdType $objName)
|
||||
foreach ($s in $stdAll) {
|
||||
if ($s.Name -ne $Name) { continue }
|
||||
Out "Стандартный реквизит: $($s.Name)"
|
||||
|
||||
# Состав типов разворачиваем списком: ради этого drill-down и нужен
|
||||
$typeSrc = $null
|
||||
if ($Name -eq "ТипЗначения") { $typeSrc = $props.SelectSingleNode("md:Type", $ns) }
|
||||
$typeList = @()
|
||||
if ($typeSrc) {
|
||||
foreach ($t in $typeSrc.SelectNodes("v8:Type", $ns)) { $typeList += Format-SingleType $t.InnerText $typeSrc }
|
||||
foreach ($t in $typeSrc.SelectNodes("v8:TypeSet", $ns)) { $typeList += Format-SingleTypeSet $t.InnerText }
|
||||
} elseif ($Name -eq "Владелец") {
|
||||
$ownersNode = $props.SelectSingleNode("md:Owners", $ns)
|
||||
if ($ownersNode) {
|
||||
foreach ($it in $ownersNode.SelectNodes("xr:Item", $ns)) { $typeList += Format-MDObjectRef $it.InnerText }
|
||||
}
|
||||
}
|
||||
|
||||
if ($typeList.Count -gt 0) {
|
||||
Out " Типы ($($typeList.Count)):"
|
||||
foreach ($t in $typeList) { Out " $t" }
|
||||
} else {
|
||||
Out " Тип: $($s.Type)"
|
||||
}
|
||||
$flagText = $s.Flags.Trim()
|
||||
if ($flagText) { Out " Свойства: $($flagText.Trim('[', ']'))" }
|
||||
$drillDone = $true
|
||||
break
|
||||
}
|
||||
if (-not $drillDone) {
|
||||
Write-Host "[ERROR] '$Name' not found in $objName"
|
||||
exit 1
|
||||
@@ -680,6 +925,20 @@ if (-not $drillDone) {
|
||||
|
||||
# --- Mode: brief ---
|
||||
if ($Mode -eq "brief") {
|
||||
# Подчинённость — единственный факт структуры, который из brief не выводится никак,
|
||||
# а без него код записи элемента падает. Про обязательность здесь намеренно молчим:
|
||||
# обязательными бывают и обычные реквизиты, а их brief не разбирает.
|
||||
if ($mdType -eq "Catalog") {
|
||||
$ownersNode = $props.SelectSingleNode("md:Owners", $ns)
|
||||
$ownerNames = @()
|
||||
if ($ownersNode) {
|
||||
foreach ($it in $ownersNode.SelectNodes("xr:Item", $ns)) {
|
||||
$ownerNames += ($it.InnerText -replace '^\w+\.', '')
|
||||
}
|
||||
}
|
||||
if ($ownerNames.Count -gt 0) { Out "Подчинён: $($ownerNames -join ', ')" }
|
||||
}
|
||||
|
||||
# Attributes
|
||||
$attrs = @()
|
||||
if ($childObjs) { $attrs = @(Get-Attributes $childObjs) }
|
||||
@@ -828,51 +1087,47 @@ if (-not $drillDone) {
|
||||
|
||||
# Document-specific header properties
|
||||
if ($mdType -eq "Document") {
|
||||
$numType = $props.SelectSingleNode("md:NumberType", $ns)
|
||||
$numLen = $props.SelectSingleNode("md:NumberLength", $ns)
|
||||
$numPer = $props.SelectSingleNode("md:NumberPeriodicity", $ns)
|
||||
$autoNum = $props.SelectSingleNode("md:Autonumbering", $ns)
|
||||
$posting = $props.SelectSingleNode("md:Posting", $ns)
|
||||
|
||||
$parts = @()
|
||||
if ($numType -and $numLen) {
|
||||
$nt = if ($numType.InnerText -eq "String") { "Строка" } else { "Число" }
|
||||
$piece = "Номер: $nt($($numLen.InnerText))"
|
||||
if ($numPer) {
|
||||
$perRu = if ($numberPeriodMap.ContainsKey($numPer.InnerText)) { $numberPeriodMap[$numPer.InnerText] } else { $numPer.InnerText }
|
||||
$piece += ", $perRu"
|
||||
}
|
||||
if ($autoNum -and $autoNum.InnerText -eq "true") { $piece += ", авто" }
|
||||
$parts += $piece
|
||||
}
|
||||
# Номер уехал в блок стандартных реквизитов — здесь остаются свойства объекта
|
||||
if ($posting) {
|
||||
$parts += "Проведение: $(if ($posting.InnerText -eq 'Allow') { 'да' } else { 'нет' })"
|
||||
}
|
||||
if ($parts.Count -gt 0) { Out ($parts -join " | ") }
|
||||
}
|
||||
|
||||
# Catalog-specific header properties
|
||||
if ($mdType -eq "Catalog") {
|
||||
$parts = @()
|
||||
$hier = $props.SelectSingleNode("md:Hierarchical", $ns)
|
||||
if ($hier -and $hier.InnerText -eq "true") {
|
||||
$ht = $props.SelectSingleNode("md:HierarchyType", $ns)
|
||||
$htText = if ($ht -and $ht.InnerText -eq "HierarchyFoldersAndItems") { "группы и элементы" } else { "элементы" }
|
||||
$limitNode = $props.SelectSingleNode("md:LimitLevelCount", $ns)
|
||||
$levelNode = $props.SelectSingleNode("md:LevelCount", $ns)
|
||||
if ($limitNode -and $limitNode.InnerText -eq "true" -and $levelNode) {
|
||||
$htText += ", уровней: $($levelNode.InnerText)"
|
||||
} else {
|
||||
$htText += ", без ограничения уровней"
|
||||
}
|
||||
$parts += "Иерархический: $htText"
|
||||
# Свойства иерархии и подчинения. Иерархия — не только у справочников: свойство
|
||||
# Hierarchical есть и у ПВХ (в корпусе acc/erp/ut/unf их 13), а без этой строки
|
||||
# в full появлялся Родитель, происхождение которого было ниоткуда не видно.
|
||||
$parts = @()
|
||||
$hier = $props.SelectSingleNode("md:Hierarchical", $ns)
|
||||
if ($hier -and $hier.InnerText -eq "true") {
|
||||
$ht = $props.SelectSingleNode("md:HierarchyType", $ns)
|
||||
$htText = if ($ht -and $ht.InnerText -eq "HierarchyFoldersAndItems") { "группы и элементы" } else { "элементы" }
|
||||
$limitNode = $props.SelectSingleNode("md:LimitLevelCount", $ns)
|
||||
$levelNode = $props.SelectSingleNode("md:LevelCount", $ns)
|
||||
if ($limitNode -and $limitNode.InnerText -eq "true" -and $levelNode) {
|
||||
$htText += ", уровней: $($levelNode.InnerText)"
|
||||
} else {
|
||||
$htText += ", без ограничения уровней"
|
||||
}
|
||||
$codeLen = $props.SelectSingleNode("md:CodeLength", $ns)
|
||||
$descLen = $props.SelectSingleNode("md:DescriptionLength", $ns)
|
||||
if ($codeLen -and [int]$codeLen.InnerText -gt 0) { $parts += "Код($($codeLen.InnerText))" }
|
||||
if ($descLen -and [int]$descLen.InnerText -gt 0) { $parts += "Наименование($($descLen.InnerText))" }
|
||||
if ($parts.Count -gt 0) { Out ($parts -join " | ") }
|
||||
$parts += "Иерархический: $htText"
|
||||
}
|
||||
# Код и Наименование уехали в блок стандартных реквизитов — здесь только свойства объекта.
|
||||
# Подчинение печатаем лишь когда оно отличается от дефолта ToItems.
|
||||
if ($mdType -eq "Catalog") {
|
||||
$sub = $props.SelectSingleNode("md:SubordinationUse", $ns)
|
||||
if ($sub -and $sub.InnerText -ne "ToItems") {
|
||||
$subRu = switch ($sub.InnerText) {
|
||||
"ToFolders" { "группам" }
|
||||
"ToFoldersAndItems" { "группам и элементам" }
|
||||
default { $sub.InnerText }
|
||||
}
|
||||
$parts += "Подчинение: $subRu"
|
||||
}
|
||||
}
|
||||
if ($parts.Count -gt 0) { Out ($parts -join " | ") }
|
||||
|
||||
# Register-specific header properties
|
||||
if ($mdType -match "Register$") {
|
||||
@@ -1059,6 +1314,16 @@ if (-not $drillDone) {
|
||||
}
|
||||
}
|
||||
|
||||
# --- Standard attributes ---
|
||||
$stdAttrs = @(Get-StandardAttributes $props $mdType $Mode)
|
||||
if ($Mode -eq "full") { $stdAttrs += @(Get-StandardAttributesFull $props $mdType $objName) }
|
||||
if ($stdAttrs.Count -gt 0) {
|
||||
Out ""
|
||||
Out "Стандартные реквизиты:"
|
||||
$ml = Get-MaxNameLen $stdAttrs
|
||||
foreach ($s in $stdAttrs) { Out (Format-AttrLine $s $ml) }
|
||||
}
|
||||
|
||||
# --- Dimensions (registers) ---
|
||||
if ($mdType -match "Register$" -and $childObjs) {
|
||||
$dims = @(Get-Attributes $childObjs "Dimension" $true)
|
||||
@@ -1177,6 +1442,13 @@ if (-not $drillDone) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Единственная подсказка на весь вывод — чем развернуть свёрнутый в счётчик состав
|
||||
if ($script:collapsedNames.Count -gt 0) {
|
||||
$hints = ($script:collapsedNames | ForEach-Object { "-Name $_" }) -join ", "
|
||||
Out ""
|
||||
Out "Полный состав типов: $hints"
|
||||
}
|
||||
}
|
||||
|
||||
# --- Pagination and output ---
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-info v1.4 — Compact summary of 1C metadata object (Python port)
|
||||
# meta-info v1.8 — Compact summary of 1C metadata object (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import os
|
||||
@@ -227,6 +227,30 @@ def get_ml_text(node):
|
||||
return ""
|
||||
|
||||
|
||||
# Тип-множество: голое имя метатипа без `.Имя` означает ВСЕ ссылки этого класса
|
||||
# (см. docs/meta-dsl-spec.md §«Тип-множество»). Конкретный тип всегда пишется с точкой,
|
||||
# поэтому «СправочникСсылка» без точки читается однозначно как обобщённый.
|
||||
def format_single_type_set(raw):
|
||||
raw = re.sub(r'^d\d+p\d+:', 'cfg:', raw)
|
||||
m = re.match(r'^cfg:DefinedType\.(.+)$', raw)
|
||||
if m:
|
||||
return f"ОпределяемыйТип.{m.group(1)}"
|
||||
m = re.match(r'^cfg:Characteristic\.(.+)$', raw)
|
||||
if m:
|
||||
return f"Характеристика.{m.group(1)}"
|
||||
if raw == "cfg:AnyRef":
|
||||
return "ЛюбаяСсылка"
|
||||
if raw == "cfg:AnyIBRef":
|
||||
return "ЛюбаяСсылкаИБ"
|
||||
m = re.match(r'^cfg:(\w+Ref)$', raw)
|
||||
if m and m.group(1) in ref_type_map:
|
||||
return ref_type_map[m.group(1)]
|
||||
m = re.match(r'^cfg:(.+)$', raw)
|
||||
if m:
|
||||
return m.group(1)
|
||||
return raw
|
||||
|
||||
|
||||
def format_type(type_node_el):
|
||||
if type_node_el is None:
|
||||
return ""
|
||||
@@ -234,16 +258,7 @@ def format_type(type_node_el):
|
||||
for t in find_all(type_node_el, "v8:Type"):
|
||||
types.append(format_single_type(inner_text(t), type_node_el))
|
||||
for t in find_all(type_node_el, "v8:TypeSet"):
|
||||
raw = inner_text(t)
|
||||
m = re.match(r'^cfg:DefinedType\.(.+)$', raw)
|
||||
if m:
|
||||
types.append(f"ОпределяемыйТип.{m.group(1)}")
|
||||
continue
|
||||
m = re.match(r'^cfg:Characteristic\.(.+)$', raw)
|
||||
if m:
|
||||
types.append(f"Характеристика.{m.group(1)}")
|
||||
continue
|
||||
types.append(raw)
|
||||
types.append(format_single_type_set(inner_text(t)))
|
||||
if len(types) == 0:
|
||||
return ""
|
||||
if len(types) == 1:
|
||||
@@ -341,6 +356,190 @@ def format_flags(a_props, is_dimension=False):
|
||||
return f" [{', '.join(flags)}]"
|
||||
|
||||
|
||||
# Ссылка на объект метаданных (`Catalog.Валюты` в Owners и подобных) — не тип значения,
|
||||
# но в выводе показываем именно тип, который присваивается: СправочникСсылка.Валюты.
|
||||
def format_md_object_ref(raw):
|
||||
m = re.match(r'^(\w+)\.(.+)$', raw)
|
||||
if m:
|
||||
key = f"{m.group(1)}Ref"
|
||||
if key in ref_type_map:
|
||||
return f"{ref_type_map[key]}.{m.group(2)}"
|
||||
return raw
|
||||
|
||||
|
||||
# ── Стандартные реквизиты ────────────────────────────────────
|
||||
|
||||
# Сколько типов состава печатать списком, прежде чем свернуть в счётчик. По корпусу
|
||||
# acc/erp/ut/unf состав ПВХ доходит до 151 типа, при этом 20 из 42 ПВХ укладываются в 5.
|
||||
COMPOSED_TYPE_THRESHOLD = 5
|
||||
|
||||
# Имена полей, состав которых свернули в счётчик, — по ним в конце вывода печатается
|
||||
# единственная подсказка, чем состав развернуть.
|
||||
collapsed_names = []
|
||||
|
||||
# Блок StandardAttributes в XML опционален: платформа материализует его только когда хотя бы
|
||||
# один стандартный реквизит кастомизирован (docs/meta-dsl-spec.md §7.1.1). Когда блока нет,
|
||||
# действуют платформенные дефолты — профиль ниже совпадает с $stdAttrProfile в meta-compile
|
||||
# (выведен из корпуса acc+erp). Правки держать синхронными, иначе навыки разъедутся молча.
|
||||
std_attr_required_default = {
|
||||
"Catalog": {"Owner": True, "Description": True},
|
||||
"Document": {"Date": True},
|
||||
"ExchangePlan": {"Description": True, "Code": True},
|
||||
"ChartOfAccounts": {"Description": True, "Code": True},
|
||||
"ChartOfCharacteristicTypes": {"Description": True},
|
||||
"ChartOfCalculationTypes": {"Description": True},
|
||||
}
|
||||
|
||||
|
||||
def test_std_attr_required(props_node, attr_name, obj_type):
|
||||
fc = find(props_node, f"md:StandardAttributes/xr:StandardAttribute[@name='{attr_name}']/xr:FillChecking")
|
||||
if fc is not None:
|
||||
return inner_text(fc) == "ShowError"
|
||||
return std_attr_required_default.get(obj_type, {}).get(attr_name, False)
|
||||
|
||||
|
||||
def new_std_attr(name, type_str, flags):
|
||||
f = [x for x in flags if x]
|
||||
flag_str = f" [{', '.join(f)}]" if f else ""
|
||||
return {"Name": name, "Type": type_str, "Flags": flag_str}
|
||||
|
||||
|
||||
# Стандартные реквизиты, наличие и характеристики которых задаются настройками объекта, —
|
||||
# их нельзя вывести из остального вывода, поэтому они попадают и в overview. Ссылка,
|
||||
# ПометкаУдаления, Родитель и прочее следуют из типа объекта и строки «Иерархический» —
|
||||
# они только в full (см. get_standard_attributes_full).
|
||||
def get_standard_attributes(props_node, obj_type, mode_name):
|
||||
result = []
|
||||
|
||||
# Владелец — только у подчинённого справочника; состав типов ниоткуда не выводится
|
||||
if obj_type == "Catalog":
|
||||
owners_node = find(props_node, "md:Owners")
|
||||
owner_types = []
|
||||
if owners_node is not None:
|
||||
for it in find_all(owners_node, "xr:Item"):
|
||||
owner_types.append(format_md_object_ref(inner_text(it)))
|
||||
if owner_types:
|
||||
req = "обязательный" if test_std_attr_required(props_node, "Owner", obj_type) else None
|
||||
result.append(new_std_attr("Владелец", ", ".join(owner_types), [req]))
|
||||
|
||||
# ТипЗначения ПВХ — до полутора сотен типов, полный список раздул бы сводку в обоих
|
||||
# режимах, поэтому сворачиваем в счётчик. Состав смотреть через -Name ТипЗначения.
|
||||
if obj_type == "ChartOfCharacteristicTypes":
|
||||
vt = find(props_node, "md:Type")
|
||||
if vt is not None:
|
||||
cnt = len(find_all(vt, "v8:Type")) + len(find_all(vt, "v8:TypeSet"))
|
||||
if cnt > COMPOSED_TYPE_THRESHOLD:
|
||||
type_str = f"Составной ({cnt})"
|
||||
collapsed_names.append("ТипЗначения")
|
||||
else:
|
||||
type_str = format_type(vt)
|
||||
if type_str:
|
||||
result.append(new_std_attr("ТипЗначения", type_str, []))
|
||||
|
||||
# Дата — есть всегда, ценна флагом обязательности
|
||||
if obj_type in ("Document", "BusinessProcess", "Task"):
|
||||
req = "обязательный" if test_std_attr_required(props_node, "Date", obj_type) else None
|
||||
result.append(new_std_attr("Дата", "Дата", [req]))
|
||||
|
||||
# Номер — тип и длина задаются объектом, при NumberLength=0 номера нет
|
||||
if obj_type in ("Document", "BusinessProcess", "Task"):
|
||||
num_len = find(props_node, "md:NumberLength")
|
||||
if num_len is not None and inner_text(num_len).isdigit() and int(inner_text(num_len)) > 0:
|
||||
num_type = find(props_node, "md:NumberType")
|
||||
nt_ru = "Число" if num_type is not None and inner_text(num_type) == "Number" else "Строка"
|
||||
flags = []
|
||||
if test_std_attr_required(props_node, "Number", obj_type):
|
||||
flags.append("обязательный")
|
||||
num_per = find(props_node, "md:NumberPeriodicity")
|
||||
if num_per is not None and inner_text(num_per) in number_period_map:
|
||||
flags.append(number_period_map[inner_text(num_per)])
|
||||
num_allowed = find(props_node, "md:NumberAllowedLength")
|
||||
if num_allowed is not None and inner_text(num_allowed) == "Fixed":
|
||||
flags.append("фикс. длина")
|
||||
auto_num = find(props_node, "md:Autonumbering")
|
||||
if auto_num is not None and inner_text(auto_num) == "true":
|
||||
flags.append("авто")
|
||||
result.append(new_std_attr("Номер", f"{nt_ru}({inner_text(num_len)})", flags))
|
||||
|
||||
# Код — при CodeLength=0 кода у объекта нет вовсе, строку не печатаем
|
||||
code_len = find(props_node, "md:CodeLength")
|
||||
if code_len is not None and inner_text(code_len).isdigit() and int(inner_text(code_len)) > 0:
|
||||
code_type = find(props_node, "md:CodeType")
|
||||
ct_ru = "Число" if code_type is not None and inner_text(code_type) == "Number" else "Строка"
|
||||
flags = []
|
||||
if test_std_attr_required(props_node, "Code", obj_type):
|
||||
flags.append("обязательный")
|
||||
code_allowed = find(props_node, "md:CodeAllowedLength")
|
||||
if code_allowed is not None and inner_text(code_allowed) == "Fixed":
|
||||
flags.append("фикс. длина")
|
||||
result.append(new_std_attr("Код", f"{ct_ru}({inner_text(code_len)})", flags))
|
||||
|
||||
# Наименование — при DescriptionLength=0 наименования нет
|
||||
desc_len = find(props_node, "md:DescriptionLength")
|
||||
if desc_len is not None and inner_text(desc_len).isdigit() and int(inner_text(desc_len)) > 0:
|
||||
req = "обязательный" if test_std_attr_required(props_node, "Description", obj_type) else None
|
||||
result.append(new_std_attr("Наименование", f"Строка({inner_text(desc_len)})", [req]))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
# Остальные стандартные реквизиты — предсказуемы по типу объекта, но в full полезны
|
||||
# как перечень доступных полей для запроса.
|
||||
def get_standard_attributes_full(props_node, obj_type, obj_name):
|
||||
self_ref_map = {
|
||||
"Catalog": "СправочникСсылка",
|
||||
"ChartOfCharacteristicTypes": "ПВХСсылка",
|
||||
"ChartOfAccounts": "ПланСчетовСсылка",
|
||||
"ChartOfCalculationTypes": "ПВРСсылка",
|
||||
"ExchangePlan": "ПланОбменаСсылка",
|
||||
"Document": "ДокументСсылка",
|
||||
"BusinessProcess": "БизнесПроцессСсылка",
|
||||
"Task": "ЗадачаСсылка",
|
||||
}
|
||||
self_ref = f"{self_ref_map[obj_type]}.{obj_name}" if obj_type in self_ref_map else ""
|
||||
|
||||
result = []
|
||||
if self_ref:
|
||||
result.append(new_std_attr("Ссылка", self_ref, []))
|
||||
result.append(new_std_attr("ПометкаУдаления", "Булево", []))
|
||||
|
||||
# Родитель и ЭтоГруппа существуют только у иерархических объектов
|
||||
hier = find(props_node, "md:Hierarchical")
|
||||
is_hier = (hier is not None and inner_text(hier) == "true") or obj_type == "ChartOfAccounts"
|
||||
if is_hier and self_ref:
|
||||
result.append(new_std_attr("Родитель", self_ref, []))
|
||||
ht = find(props_node, "md:HierarchyType")
|
||||
if obj_type == "Catalog" and (ht is None or inner_text(ht) == "HierarchyFoldersAndItems"):
|
||||
result.append(new_std_attr("ЭтоГруппа", "Булево", []))
|
||||
|
||||
if obj_type == "Document":
|
||||
result.append(new_std_attr("Проведен", "Булево", []))
|
||||
elif obj_type == "ExchangePlan":
|
||||
result.append(new_std_attr("ЭтотУзел", "Булево", []))
|
||||
result.append(new_std_attr("НомерОтправленного", "Число", []))
|
||||
result.append(new_std_attr("НомерПринятого", "Число", []))
|
||||
elif obj_type == "BusinessProcess":
|
||||
result.append(new_std_attr("Стартован", "Булево", []))
|
||||
result.append(new_std_attr("Завершен", "Булево", []))
|
||||
result.append(new_std_attr("ВедущаяЗадача", "ЗадачаСсылка", []))
|
||||
elif obj_type == "Task":
|
||||
result.append(new_std_attr("Выполнена", "Булево", []))
|
||||
result.append(new_std_attr("БизнесПроцесс", "БизнесПроцессСсылка", []))
|
||||
result.append(new_std_attr("ТочкаМаршрута", "БизнесПроцессТочкаМаршрутаСсылка", []))
|
||||
elif obj_type == "ChartOfAccounts":
|
||||
result.append(new_std_attr("Вид", "ВидСчета", []))
|
||||
result.append(new_std_attr("Забалансовый", "Булево", []))
|
||||
result.append(new_std_attr("Порядок", "Число", []))
|
||||
elif obj_type == "ChartOfCalculationTypes":
|
||||
result.append(new_std_attr("ПериодДействияБазовый", "Булево", []))
|
||||
|
||||
# Предопределённые данные есть у всех перечисленных типов, кроме документов и задач
|
||||
if obj_type in ("Catalog", "ChartOfCharacteristicTypes", "ChartOfAccounts", "ChartOfCalculationTypes"):
|
||||
result.append(new_std_attr("Предопределенный", "Булево", []))
|
||||
result.append(new_std_attr("ИмяПредопределенныхДанных", "Строка", []))
|
||||
return result
|
||||
|
||||
|
||||
def get_attributes(parent_node, child_tag="Attribute", is_dimension=False):
|
||||
result = []
|
||||
for attr in find_all(parent_node, f"md:{child_tag}"):
|
||||
@@ -381,7 +580,10 @@ def get_max_name_len(attrs):
|
||||
def get_simple_children(parent_node, tag):
|
||||
result = []
|
||||
for child in find_all(parent_node, f"md:{tag}"):
|
||||
result.append(inner_text(child))
|
||||
# Form/Template в ChildObjects — простые узлы с именем в тексте, а Command — узел
|
||||
# с вложенным Properties: у него inner_text склеил бы всё содержимое в одну строку.
|
||||
name_node = find(child, "md:Properties/md:Name")
|
||||
result.append(inner_text(name_node) if name_node is not None else inner_text(child))
|
||||
return result
|
||||
|
||||
|
||||
@@ -705,6 +907,44 @@ if drill_name and child_objs is not None:
|
||||
drill_done = True
|
||||
break
|
||||
|
||||
# Не нашли среди дочерних объектов — пробуем стандартные реквизиты ниже
|
||||
|
||||
# Drill-down по стандартному реквизиту — единственный способ увидеть состав типов целиком,
|
||||
# когда в сводке он свёрнут в счётчик. Живёт в Properties, а не в ChildObjects, поэтому идёт
|
||||
# отдельной веткой и работает даже у объектов без ChildObjects.
|
||||
if drill_name and not drill_done:
|
||||
std_all = get_standard_attributes(props, md_type, "full") + get_standard_attributes_full(props, md_type, obj_name)
|
||||
for s in std_all:
|
||||
if s["Name"] != drill_name:
|
||||
continue
|
||||
out(f"Стандартный реквизит: {s['Name']}")
|
||||
|
||||
# Состав типов разворачиваем списком: ради этого drill-down и нужен
|
||||
type_list = []
|
||||
type_src = find(props, "md:Type") if drill_name == "ТипЗначения" else None
|
||||
if type_src is not None:
|
||||
for t in find_all(type_src, "v8:Type"):
|
||||
type_list.append(format_single_type(inner_text(t), type_src))
|
||||
for t in find_all(type_src, "v8:TypeSet"):
|
||||
type_list.append(format_single_type_set(inner_text(t)))
|
||||
elif drill_name == "Владелец":
|
||||
owners_node = find(props, "md:Owners")
|
||||
if owners_node is not None:
|
||||
for it in find_all(owners_node, "xr:Item"):
|
||||
type_list.append(format_md_object_ref(inner_text(it)))
|
||||
|
||||
if type_list:
|
||||
out(f" Типы ({len(type_list)}):")
|
||||
for t in type_list:
|
||||
out(f" {t}")
|
||||
else:
|
||||
out(f" Тип: {s['Type']}")
|
||||
flag_text = s["Flags"].strip()
|
||||
if flag_text:
|
||||
out(f" Свойства: {flag_text.strip('[]')}")
|
||||
drill_done = True
|
||||
break
|
||||
|
||||
if not drill_done:
|
||||
print(f"[ERROR] '{drill_name}' not found in {obj_name}")
|
||||
sys.exit(1)
|
||||
@@ -736,6 +976,18 @@ if not drill_done:
|
||||
out(f"Расширенное представление списка: {ext_list_presentation}")
|
||||
|
||||
if mode == "brief":
|
||||
# Подчинённость — единственный факт структуры, который из brief не выводится никак,
|
||||
# а без него код записи элемента падает. Про обязательность здесь намеренно молчим:
|
||||
# обязательными бывают и обычные реквизиты, а их brief не разбирает.
|
||||
if md_type == "Catalog":
|
||||
owners_node = find(props, "md:Owners")
|
||||
owner_names = []
|
||||
if owners_node is not None:
|
||||
for it in find_all(owners_node, "xr:Item"):
|
||||
owner_names.append(re.sub(r'^\w+\.', '', inner_text(it)))
|
||||
if owner_names:
|
||||
out(f"Подчинён: {', '.join(owner_names)}")
|
||||
|
||||
# Attributes
|
||||
attrs = get_attributes(child_objs) if child_objs is not None else []
|
||||
if attrs:
|
||||
@@ -865,48 +1117,39 @@ if not drill_done:
|
||||
|
||||
# Document-specific header
|
||||
if md_type == "Document":
|
||||
num_type = find(props, "md:NumberType")
|
||||
num_len = find(props, "md:NumberLength")
|
||||
num_per = find(props, "md:NumberPeriodicity")
|
||||
auto_num = find(props, "md:Autonumbering")
|
||||
posting = find(props, "md:Posting")
|
||||
parts = []
|
||||
if num_type is not None and num_len is not None:
|
||||
nt = "Строка" if inner_text(num_type) == "String" else "Число"
|
||||
piece = f"Номер: {nt}({inner_text(num_len)})"
|
||||
if num_per is not None:
|
||||
per_ru = number_period_map.get(inner_text(num_per), inner_text(num_per))
|
||||
piece += f", {per_ru}"
|
||||
if auto_num is not None and inner_text(auto_num) == "true":
|
||||
piece += ", авто"
|
||||
parts.append(piece)
|
||||
# Номер уехал в блок стандартных реквизитов — здесь остаются свойства объекта
|
||||
if posting is not None:
|
||||
parts.append(f"Проведение: {'да' if inner_text(posting) == 'Allow' else 'нет'}")
|
||||
if parts:
|
||||
out(" | ".join(parts))
|
||||
|
||||
# Catalog-specific header
|
||||
# Свойства иерархии и подчинения. Иерархия — не только у справочников: свойство
|
||||
# Hierarchical есть и у ПВХ (в корпусе acc/erp/ut/unf их 13), а без этой строки
|
||||
# в full появлялся Родитель, происхождение которого было ниоткуда не видно.
|
||||
parts = []
|
||||
hier = find(props, "md:Hierarchical")
|
||||
if hier is not None and inner_text(hier) == "true":
|
||||
ht = find(props, "md:HierarchyType")
|
||||
ht_text = "группы и элементы" if ht is not None and inner_text(ht) == "HierarchyFoldersAndItems" else "элементы"
|
||||
limit_node = find(props, "md:LimitLevelCount")
|
||||
level_node = find(props, "md:LevelCount")
|
||||
if limit_node is not None and inner_text(limit_node) == "true" and level_node is not None:
|
||||
ht_text += f", уровней: {inner_text(level_node)}"
|
||||
else:
|
||||
ht_text += ", без ограничения уровней"
|
||||
parts.append(f"Иерархический: {ht_text}")
|
||||
# Код и Наименование уехали в блок стандартных реквизитов — здесь только свойства объекта.
|
||||
# Подчинение печатаем лишь когда оно отличается от дефолта ToItems.
|
||||
if md_type == "Catalog":
|
||||
parts = []
|
||||
hier = find(props, "md:Hierarchical")
|
||||
if hier is not None and inner_text(hier) == "true":
|
||||
ht = find(props, "md:HierarchyType")
|
||||
ht_text = "группы и элементы" if ht is not None and inner_text(ht) == "HierarchyFoldersAndItems" else "элементы"
|
||||
limit_node = find(props, "md:LimitLevelCount")
|
||||
level_node = find(props, "md:LevelCount")
|
||||
if limit_node is not None and inner_text(limit_node) == "true" and level_node is not None:
|
||||
ht_text += f", уровней: {inner_text(level_node)}"
|
||||
else:
|
||||
ht_text += ", без ограничения уровней"
|
||||
parts.append(f"Иерархический: {ht_text}")
|
||||
code_len = find(props, "md:CodeLength")
|
||||
desc_len = find(props, "md:DescriptionLength")
|
||||
if code_len is not None and inner_text(code_len).isdigit() and int(inner_text(code_len)) > 0:
|
||||
parts.append(f"Код({inner_text(code_len)})")
|
||||
if desc_len is not None and inner_text(desc_len).isdigit() and int(inner_text(desc_len)) > 0:
|
||||
parts.append(f"Наименование({inner_text(desc_len)})")
|
||||
if parts:
|
||||
out(" | ".join(parts))
|
||||
sub = find(props, "md:SubordinationUse")
|
||||
if sub is not None and inner_text(sub) != "ToItems":
|
||||
sub_ru = {"ToFolders": "группам", "ToFoldersAndItems": "группам и элементам"}.get(
|
||||
inner_text(sub), inner_text(sub))
|
||||
parts.append(f"Подчинение: {sub_ru}")
|
||||
if parts:
|
||||
out(" | ".join(parts))
|
||||
|
||||
# Register-specific header
|
||||
if md_type.endswith("Register"):
|
||||
@@ -1067,6 +1310,17 @@ if not drill_done:
|
||||
syn_text = f'"{v["Synonym"]}"' if v["Synonym"] and v["Synonym"] != v["Name"] else ""
|
||||
out(f" {padded} {syn_text}")
|
||||
|
||||
# Standard attributes
|
||||
std_attrs = get_standard_attributes(props, md_type, mode)
|
||||
if mode == "full":
|
||||
std_attrs += get_standard_attributes_full(props, md_type, obj_name)
|
||||
if std_attrs:
|
||||
out("")
|
||||
out("Стандартные реквизиты:")
|
||||
ml = get_max_name_len(std_attrs)
|
||||
for s in std_attrs:
|
||||
out(format_attr_line(s, ml))
|
||||
|
||||
# Dimensions (registers)
|
||||
if md_type.endswith("Register") and child_objs is not None:
|
||||
dims = get_attributes(child_objs, "Dimension", True)
|
||||
@@ -1174,6 +1428,12 @@ if not drill_done:
|
||||
if commands:
|
||||
out(f"Команды: {', '.join(commands)}")
|
||||
|
||||
# Единственная подсказка на весь вывод — чем развернуть свёрнутый в счётчик состав
|
||||
if collapsed_names:
|
||||
hints = ", ".join(f"-Name {n}" for n in collapsed_names)
|
||||
out("")
|
||||
out(f"Полный состав типов: {hints}")
|
||||
|
||||
# ── Pagination and output ────────────────────────────────────
|
||||
|
||||
total_lines = len(lines)
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -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"
|
||||
```
|
||||
|
||||
@@ -28,7 +28,7 @@ allowed-tools:
|
||||
| `Force` | нет | Перезаписать существующий пакет. Без него навык откажется затирать уже собранный пакет |
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/xdto-compile.ps1" -XsdPath "<схема.xsd>" -OutputDir "<каталог-исходников>"
|
||||
python "${CLAUDE_SKILL_DIR}/scripts/xdto-compile.py" -XsdPath "<схема.xsd>" -OutputDir "<каталог-исходников>"
|
||||
```
|
||||
|
||||
Примеры:
|
||||
|
||||
@@ -21,7 +21,7 @@ allowed-tools:
|
||||
| `OutFile` | нет | Записать схему в файл (UTF-8 с BOM). Без него — вывод в stdout |
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/xdto-decompile.ps1" -PackagePath "<путь>"
|
||||
python "${CLAUDE_SKILL_DIR}/scripts/xdto-decompile.py" -PackagePath "<путь>"
|
||||
```
|
||||
|
||||
Примеры:
|
||||
|
||||
@@ -27,7 +27,7 @@ allowed-tools:
|
||||
| `NoValidate` | нет | Не запускать `xdto-validate` после правки |
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/xdto-edit.ps1" -PackagePath "<путь>" -Operation <op> -Target "<адрес>" -Value "<значение>"
|
||||
python "${CLAUDE_SKILL_DIR}/scripts/xdto-edit.py" -PackagePath "<путь>" -Operation <op> -Target "<адрес>" -Value "<значение>"
|
||||
```
|
||||
|
||||
## Операции
|
||||
|
||||
@@ -29,7 +29,7 @@ allowed-tools:
|
||||
| `OutFile` | нет | Записать результат в файл (UTF-8 BOM) |
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/xdto-info.ps1" -PackagePath "<путь>"
|
||||
python "${CLAUDE_SKILL_DIR}/scripts/xdto-info.py" -PackagePath "<путь>"
|
||||
```
|
||||
|
||||
## Что показывает
|
||||
|
||||
@@ -24,7 +24,7 @@ allowed-tools:
|
||||
| `OutFile` | нет | Записать отчёт в файл |
|
||||
|
||||
```powershell
|
||||
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/xdto-validate.ps1" -PackagePath "<путь>"
|
||||
python "${CLAUDE_SKILL_DIR}/scripts/xdto-validate.py" -PackagePath "<путь>"
|
||||
```
|
||||
|
||||
`[ERROR]` — платформа такой пакет не примет либо примет неправильно.
|
||||
|
||||
@@ -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,28 +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
|
||||
|
||||
# Package.bin пакетов XDTO — текстовый XML, несмотря на расширение. Оставляем
|
||||
# под правилом *.bin binary (байты не нормализуются), но включаем текстовый diff,
|
||||
# иначе изменение модели пакета в истории выглядит как «Binary files differ».
|
||||
XDTOPackages/**/Package.bin diff
|
||||
@@ -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 }}"
|
||||
-55
@@ -1,55 +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
|
||||
|
||||
# Маркер отработавшего prepare() в фикстуре _suite-root
|
||||
tests/web-test/_suite-root/prepare-ran.txt
|
||||
|
||||
# Скриншоты и видео (артефакты тестирования 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,281 +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) |
|
||||
| Пакеты XDTO | 5 навыков `/xdto-*` | Анализ, создание из XML-схемы, выгрузка в схему, точечное редактирование, валидация пакетов XDTO | [Подробнее](docs/xdto-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: `ccd860ae8998a4259a5de24ed4365e1b84ea3ae2`
|
||||
|
||||
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,849 +0,0 @@
|
||||
# Спецификация формата ролей 1С:Предприятия 8.3
|
||||
|
||||
Полное описание XML-формата ролей в выгрузке конфигурации. Версии формата: 2.17 (платформа 8.3.20–8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27+). Структура идентична; отличается атрибут `version`, а с 2.19 — ещё и набор выгружаемых прав (см. «Версии формата»).
|
||||
|
||||
## Файловая структура
|
||||
|
||||
Каждая роль состоит из двух файлов:
|
||||
|
||||
```
|
||||
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.25 | 2.18 | 2.18 | Только номер версии |
|
||||
| 8.3.26 | 2.19 | 2.19 | Право, совпадающее с `setForNewObjects`, больше не пишется (см. ниже) |
|
||||
| 8.3.27 | 2.20 | 2.20 | Только номер версии |
|
||||
|
||||
Начиная с `2.19` платформа **опускает право, значение которого совпадает с `<setForNewObjects>`** в шапке `Rights.xml`: роль с `setForNewObjects=true` теряет из выгрузки права со значением `true`, роль с `false` — со значением `false`. Возможности не удалялись: право отсутствует в выгрузке, но действует по умолчанию роли. Структура файла при этом не менялась.
|
||||
|
||||
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-xdto-spec.md](1c-xdto-spec.md) |
|
||||
| `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.18 → 2.19 → 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,451 +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.25 | 2.18 |
|
||||
| 8.3.26 | 2.19 |
|
||||
| 8.3.27 | 2.20 |
|
||||
|
||||
### Form.xml (управляемая форма)
|
||||
|
||||
Содержимое `Form.xml` идентично между 8.3.20 и 8.3.24. Дальше различается **только** атрибут `version` в корневом элементе `<Form>` (`2.17` → `2.18` → `2.19` → `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
@@ -1,173 +0,0 @@
|
||||
# Состояние поддержки конфигурации 1С — `Ext/ParentConfigurations.bin`
|
||||
|
||||
Спецификация формата файла `Ext/ParentConfigurations.bin` из XML-выгрузки конфигурации 1С (`DumpConfigToFiles`). Файл хранит **состояние поддержки** конфигурации: глобальную «возможность изменения», список конфигураций поставщика и пообъектные правила поддержки (на замке / редактируется с сохранением поддержки / снят с поддержки).
|
||||
|
||||
Это единственный исходник состояния поддержки в выгрузке: ни `Configuration.xml`, ни `ConfigDumpInfo.xml`, ни файлы объектов его не содержат. Знание формата нужно, чтобы статически (без запуска конфигуратора и без ИБ) определить, разрешено ли редактировать конкретный объект конфигурации поставщика.
|
||||
|
||||
> Формат восстановлен реверс-инжинирингом на размеченных выгрузках (одиночная поддержка и образец с несколькими поставщиками), а не из документации 1С. Значения, помеченные **наблюдаемые**, подтверждены на конкретных объектах; помеченные **(не до конца разобрано)** — требуют дополнительных образцов.
|
||||
|
||||
---
|
||||
|
||||
## 1. Где лежит и когда есть
|
||||
|
||||
```
|
||||
<configSrc>/
|
||||
Ext/
|
||||
ParentConfigurations.bin # состояние поддержки (если конфигурация на поддержке)
|
||||
```
|
||||
|
||||
| Состояние | Файл |
|
||||
|-----------|------|
|
||||
| Конфигурация **на поддержке** | присутствует, размер от сотен КБ до единиц МБ (запись на каждый объект конфигурации поставщика) |
|
||||
| Поддержка **снята полностью** | присутствует, но усечён до ~16 байт (пустой контейнер) |
|
||||
| Своя конфигурация (без поставщика) | файла нет |
|
||||
| **Расширение (CFE)** | файла нет; редактирование исходников расширения не ограничивается состоянием поддержки базовой конфигурации |
|
||||
|
||||
Грубый признак «это конфигурация поставщика» берётся независимо — из `Configuration.xml`: непустой `<Vendor>` + `<Version>`.
|
||||
|
||||
Расширение распознаётся **позитивно** по `Configuration.xml`: наличие `<ConfigurationExtensionPurpose>` (`Customization` / `Patch` / …). Это надёжнее, чем «отсутствие bin», и отделяет расширение от случая «поддержка снята полностью» (там bin тоже почти пустой). Правки исходников расширения всегда допустимы — это и есть безопасный путь доработки.
|
||||
|
||||
---
|
||||
|
||||
## 2. Кодировка и общий вид
|
||||
|
||||
- Кодировка: **UTF-8 с BOM** (`EF BB BF`). Несмотря на расширение `.bin`, содержимое — текст.
|
||||
- Формат: 1С-овский фигурноскобочный контейнер `{ ... }`, элементы через запятую, строки в двойных кавычках (внутренняя кавычка удваивается: `"Фирма ""1С"""`). Ровно одна пара `{ }` на весь файл — вложенности нет.
|
||||
|
||||
```
|
||||
{ 6, G, K,
|
||||
<блок поставщика 1>
|
||||
0,0
|
||||
<блок поставщика 2>
|
||||
0,0
|
||||
...
|
||||
<блок поставщика K> }
|
||||
```
|
||||
|
||||
- `6` — маркер формата.
|
||||
- `G` — глобальная «возможность изменения» (§ 3).
|
||||
- `K` — число конфигураций поставщика на поддержке (§ 5). При одиночной поддержке `K = 1`.
|
||||
- Между блоками поставщиков — разделитель из двух токенов `0,0` (после последнего блока его нет).
|
||||
|
||||
Каждый **блок поставщика**:
|
||||
|
||||
```
|
||||
guidA, X, guidПоставщика, "версия", "вендор", "имя", count,
|
||||
f1,f2,<uuidLocal>,<uuidVendor>, ← записи объектов, count штук
|
||||
f1,f2,<uuidLocal>,<uuidVendor>,
|
||||
...
|
||||
```
|
||||
|
||||
**Ключевая особенность: флаги `f1,f2` стоят ПЕРЕД своим uuid**, а не после. Это легко перепутать при наивном regex `uuid,uuid,int,int`.
|
||||
|
||||
Парсер, разбирающий весь файл по этой грамматике, потребляет 100% токенов на образце с `K = 7` (458107 токенов, остатка нет) — грамматика подтверждена.
|
||||
|
||||
---
|
||||
|
||||
## 3. Глобальная «возможность изменения» (`G`)
|
||||
|
||||
Токен #2 контейнера (сразу после маркера формата `6`):
|
||||
|
||||
- `G = 0` — изменение конфигурации поставщика **включено**; смотреть пообъектные правила `f1` (§ 4).
|
||||
- `G = 1` — изменение **запрещено целиком**. Вся конфигурация read-only независимо от пообъектных правил. В этом режиме `f1` наблюдается равным `1` у всех объектов (значение неинформативно).
|
||||
|
||||
> В блоке поставщика есть токен `X` (сразу после `guidA`), во всех образцах **равный `G`** (оба `1` при выключенной возможности, оба `0` при включённой). Отделить `X` от `G` по имеющимся образцам нельзя — для проверки достаточно трактовать `G`. **(не до конца разобрано)**
|
||||
|
||||
---
|
||||
|
||||
## 4. Блок поставщика и пообъектные правила
|
||||
|
||||
Поля заголовка блока:
|
||||
|
||||
| Поле | Значение |
|
||||
|------|----------|
|
||||
| `guidA` | GUID блока, меняется от выгрузки к выгрузке (идентификатор снимка) |
|
||||
| `X` | флаг, наблюдается равным `G` (§ 3) |
|
||||
| `guidПоставщика` | стабильный GUID конфигурации поставщика |
|
||||
| `"версия"` | версия конфигурации поставщика |
|
||||
| `"вендор"` | поставщик |
|
||||
| `"имя"` | имя конфигурации поставщика |
|
||||
| `count` | число записей объектов далее |
|
||||
|
||||
Каждая запись объекта: `f1, f2, <uuidLocal>, <uuidVendor>`.
|
||||
|
||||
- `uuidLocal` — uuid объекта в **текущей** конфигурации (совпадает с `uuid="…"` на корневом элементе файла объекта).
|
||||
- `uuidVendor` — uuid объекта в конфигурации **поставщика**. При одиночной поддержке обычно `uuidLocal == uuidVendor`; могут различаться.
|
||||
- Первая запись блока — корень конфигурации; при одиночной поддержке записывается одним uuid (без пары `uuidVendor`).
|
||||
- Присутствуют записи и на под-элементы (реквизиты, табличные части, формы и т.п.), поэтому записей кратно больше, чем объектов верхнего уровня.
|
||||
|
||||
### Правило поддержки `f1` (при `G = 0`)
|
||||
|
||||
| `f1` | Правило 1С | Редактирование |
|
||||
|------|------------|----------------|
|
||||
| `0` | объект поставщика **не редактируется** (на замке) | запрещено |
|
||||
| `1` | объект поставщика **редактируется с сохранением поддержки** | разрешено |
|
||||
| `2` | объект **снят с поддержки** / не включён в поддержку данного поставщика | разрешено |
|
||||
|
||||
`f2` во всех образцах = `0` (вторичный флаг; кейса на его переключение не встретилось — **не до конца разобрано**).
|
||||
|
||||
Проверка кодировки на диффе двух выгрузок одной конфигурации (включена возможность изменения → точечные правки правил):
|
||||
|
||||
```
|
||||
…, 0→1 ,0, <uuid корня> ← включение редактирования корня
|
||||
…, 0→1 ,0, <uuid объекта> ← редактируется с сохранением поддержки
|
||||
…, 0→2 ,0, <uuid объекта> ← снят с поддержки
|
||||
```
|
||||
|
||||
Размер файла при смене правила не меняется (значения однозначные) — диффы точечные.
|
||||
|
||||
---
|
||||
|
||||
## 5. Несколько поставщиков (`K > 1`)
|
||||
|
||||
Когда конфигурация стоит на поддержке нескольких конфигураций поставщика, `K > 1`, и в контейнере идут `K` блоков подряд (через разделитель `0,0`). Каждый блок — свой поставщик со своим `count` и своим набором записей.
|
||||
|
||||
Один и тот же объект (по `uuidLocal`) может присутствовать в нескольких блоках с **разными** правилами `f1` — у каждого поставщика своё правило относительно его поставки. В образце с `K = 7` таких объектов с расходящимися правилами — 166; наблюдаемые комбинации:
|
||||
|
||||
| Комбинация `f1` у разных поставщиков | Сколько объектов | Трактовка |
|
||||
|--------------------------------------|------------------|-----------|
|
||||
| `0` и `1` | 127 | у одного на замке, у другого редактируется с сохранением поддержки |
|
||||
| `1` и `2` | 38 | у одного редактируется, у другого снят / не включён |
|
||||
| `0` и `2` | 1 | у одного на замке, у другого снят / не включён |
|
||||
|
||||
Объект, отсутствующий в блоке поставщика, в поддержку этого поставщика не входит.
|
||||
|
||||
### Эффективное правило при конфликте
|
||||
|
||||
Для гейта «можно ли редактировать объект» важно: **редактирование любого из поставщиков, где `f1 = 0`, нарушит поддержку этого поставщика**. Поэтому консервативное (безопасное) правило свёртки:
|
||||
|
||||
> объект считается **на замке**, если хотя бы у одного поставщика `f1 = 0`; иначе редактирование допустимо (`1`/`2` у всех включающих его поставщиков).
|
||||
|
||||
Точная семантика «эффективного» правила, которую показывает сам конфигуратор при конфликте поставщиков, по имеющимся образцам не подтверждена — **(не до конца разобрано)**. Для guardrail рекомендуется консервативная свёртка выше.
|
||||
|
||||
---
|
||||
|
||||
## 6. Алгоритм определения «можно ли редактировать объект» (статически)
|
||||
|
||||
```
|
||||
1. Прочитать заголовок ParentConfigurations.bin в configSrc.
|
||||
файла нет / размер ≈16 байт → поддержки нет → редактирование РАЗРЕШЕНО
|
||||
G = 1 → возможность выключена → read-only ВСЁ (запрет)
|
||||
G = 0 → перейти к шагу 2
|
||||
2. Путь редактируемого файла → корневой .xml объекта:
|
||||
- сам файл объекта (Catalogs/X.xml, Documents/Y.xml) несёт uuid на корневом элементе;
|
||||
- файл внутри каталога объекта (Catalogs/X/Ext/ObjectModule.bsl,
|
||||
Catalogs/X/Forms/F/Ext/Form.xml) → подняться к корневому Catalogs/X.xml.
|
||||
ConfigDumpInfo.xml для этого НЕ нужен (его может не быть в выгрузке/гите).
|
||||
3. Собрать f1 по этому uuid (как uuidLocal) во ВСЕХ блоках поставщиков:
|
||||
есть f1 = 0 хотя бы у одного → на замке → редактирование ЗАПРЕЩЕНО
|
||||
иначе (только 1/2) → редактируется/снят → РАЗРЕШЕНО
|
||||
uuid не найден ни в одном блоке → не на поддержке → РАЗРЕШЕНО
|
||||
```
|
||||
|
||||
Под-элемент (отдельный реквизит, форма) отдельно проверять не обязательно: его XML нельзя отредактировать, не затронув файл объекта, поэтому достаточно правила верхнего объекта.
|
||||
|
||||
---
|
||||
|
||||
## 7. Связанные форматы
|
||||
|
||||
| Файл | Спецификация |
|
||||
|------|--------------|
|
||||
| `Configuration.xml` (Vendor, Version) | [1c-configuration-spec.md § 2](1c-configuration-spec.md#2-configurationxml--корневой-файл-конфигурации) |
|
||||
| `Ext/` (где лежит .bin) | [1c-configuration-spec.md § 4.5](1c-configuration-spec.md#45-бинарные-файлы) |
|
||||
| Расширения как альтернатива правке поставщика | [1c-extension-spec.md](1c-extension-spec.md) |
|
||||
@@ -1,329 +0,0 @@
|
||||
# Спецификация формата XML пакетов XDTO 1С
|
||||
|
||||
Формат: XML-выгрузка конфигурации 1С:Предприятие 8.3 (Конфигуратор → Конфигурация → Выгрузить конфигурацию в файлы).
|
||||
Версии формата: `2.17` (платформа 8.3.20–8.3.24), `2.18` (8.3.25), `2.19` (8.3.26), `2.20` (8.3.27+).
|
||||
|
||||
Источники: выгрузки Бухгалтерия предприятия (8.3.24), ERP 2 (8.3.24) — 760 пакетов.
|
||||
|
||||
> **Связанные спецификации:**
|
||||
> - Корневая структура конфигурации — [1c-configuration-spec.md](1c-configuration-spec.md)
|
||||
> - DSL навыков (XSD как формат описания) — [xdto-dsl-spec.md](xdto-dsl-spec.md)
|
||||
> - Сводный индекс — [1c-specs-index.md](1c-specs-index.md)
|
||||
|
||||
---
|
||||
|
||||
## 1. Структура каталогов
|
||||
|
||||
```
|
||||
XDTOPackages/
|
||||
├── ОбменСБанком.xml # Объект метаданных — 4 свойства, и всё
|
||||
├── ОбменСБанком/
|
||||
│ └── Ext/
|
||||
│ └── Package.bin # Модель пакета
|
||||
└── ...
|
||||
```
|
||||
|
||||
Регистрация в корневом `Configuration.xml`:
|
||||
|
||||
```xml
|
||||
<ChildObjects>
|
||||
...
|
||||
<XDTOPackage>ОбменСБанком</XDTOPackage>
|
||||
</ChildObjects>
|
||||
```
|
||||
|
||||
Ни форм, ни модулей, ни макетов у пакета XDTO нет.
|
||||
|
||||
---
|
||||
|
||||
## 2. Объект метаданных `<Имя>.xml`
|
||||
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" ... version="2.17">
|
||||
<XDTOPackage uuid="6417d7c8-6436-4907-98eb-44cd7638f3f1">
|
||||
<Properties>
|
||||
<Name>ApdexExport</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Apdex export</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Namespace>www.v8.1c.ru/ssl/performace-assessment/apdexExport</Namespace>
|
||||
</Properties>
|
||||
</XDTOPackage>
|
||||
</MetaDataObject>
|
||||
```
|
||||
|
||||
| Свойство | Описание |
|
||||
|---|---|
|
||||
| `Name` | Имя объекта метаданных. Должно быть валидным идентификатором 1С |
|
||||
| `Synonym` | Многоязычное представление |
|
||||
| `Comment` | Комментарий |
|
||||
| `Namespace` | URI целевого пространства имён. Дублирует `targetNamespace` в `Package.bin` |
|
||||
|
||||
Других свойств у пакета XDTO нет.
|
||||
|
||||
---
|
||||
|
||||
## 3. `Ext/Package.bin` — модель пакета
|
||||
|
||||
Несмотря на расширение `.bin`, это **текстовый XML**: UTF-8 с BOM, перевод строки CRLF,
|
||||
отступ — символы табуляции.
|
||||
|
||||
```xml
|
||||
<package xmlns="http://v8.1c.ru/8.1/xdto"
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
targetNamespace="urn:1C.ru:ClientBankExchange">
|
||||
<property xmlns:d2p1="urn:1C.ru:ClientBankExchange" name="ClientBankExchange" type="d2p1:ClientBankExchange"/>
|
||||
<valueType name="СуммаТип" base="xs:decimal" variety="Atomic" totalDigits="18" fractionDigits="2"/>
|
||||
<objectType name="ClientBankExchange">
|
||||
<property xmlns:d3p1="urn:1C.ru:ClientBankExchange" name="ВерсияФормата" type="d3p1:ВерсияСхемы"/>
|
||||
<property name="Отправитель">
|
||||
<typeDef xsi:type="ValueType" base="xs:string" variety="Atomic" maxLength="160"/>
|
||||
</property>
|
||||
</objectType>
|
||||
</package>
|
||||
```
|
||||
|
||||
### 3.1. Вложенность элементов
|
||||
|
||||
```
|
||||
package > objectType | valueType | property | import
|
||||
objectType > property
|
||||
valueType > enumeration | pattern | typeDef
|
||||
property > typeDef
|
||||
typeDef > property | enumeration | pattern
|
||||
```
|
||||
|
||||
Всего восемь имён элементов. `typeDef` — анонимный (встроенный) тип; его разновидность
|
||||
задаёт `xsi:type` = `ValueType` либо `ObjectType`.
|
||||
|
||||
**Порядок элементов верхнего уровня обязателен:**
|
||||
|
||||
```
|
||||
import* → property* → valueType* → objectType*
|
||||
```
|
||||
|
||||
Ему удовлетворяют все 760 пакетов корпуса. Нарушение порядка платформа не прощает —
|
||||
`db-update` падает с «Ошибка преобразования данных XDTO: Чтение объекта типа
|
||||
`{http://v8.1c.ru/8.1/xdto}Package`… Проверка свойства 'property'». Это существенно
|
||||
при сборке из XML-схемы, где порядок объявлений верхнего уровня произвольный.
|
||||
|
||||
### 3.2. `<package>`
|
||||
|
||||
| Атрибут | Значения | Описание |
|
||||
|---|---|---|
|
||||
| `targetNamespace` | URI | Целевое пространство имён |
|
||||
| `elementFormQualified` | `true` \| `false` | Умолчание при отсутствии — `true` |
|
||||
| `attributeFormQualified` | `true` \| `false` | Умолчание при отсутствии — `false` |
|
||||
|
||||
Порядок атрибутов: `targetNamespace`, `elementFormQualified`, `attributeFormQualified`.
|
||||
|
||||
### 3.3. `<import>`
|
||||
|
||||
`<import namespace="URI"/>` — объявление зависимости от другого пакета. Разрешается
|
||||
по namespace среди пакетов конфигурации; `schemaLocation` в модели XDTO нет.
|
||||
|
||||
### 3.4. `<objectType>` и `<typeDef xsi:type="ObjectType">`
|
||||
|
||||
| Атрибут | Значения | Описание |
|
||||
|---|---|---|
|
||||
| `name` | идентификатор | Только у именованного `objectType` |
|
||||
| `base` | QName | Базовый тип (наследование) |
|
||||
| `open` | `true` \| `false` | Допускает произвольные элементы и атрибуты |
|
||||
| `abstract` | `true` \| `false` | Абстрактный тип |
|
||||
| `mixed` | `true` \| `false` | Смешанное содержимое |
|
||||
| `ordered` | `true` \| `false` | `false` — выбор одного из вариантов (аналог `xs:choice`) |
|
||||
| `sequenced` | `true` | Последовательное содержимое |
|
||||
|
||||
Порядок атрибутов `objectType`: `name`, `base`, `open`, `abstract`, `mixed`, `ordered`, `sequenced`.
|
||||
Порядок атрибутов `typeDef`: `xsi:type`, `base`, `mixed`, `open`, `ordered`, `sequenced`, далее атрибуты простого типа.
|
||||
|
||||
### 3.5. `<valueType>` и `<typeDef xsi:type="ValueType">`
|
||||
|
||||
| Атрибут | Значения |
|
||||
|---|---|
|
||||
| `name` | идентификатор (только у именованного `valueType`) |
|
||||
| `base` | QName базового типа |
|
||||
| `variety` | `Atomic` \| `List` \| `Union` |
|
||||
| `itemType` | QName — тип элемента списка (`variety="List"`) |
|
||||
| `memberTypes` | список типов объединения (`variety="Union"`) |
|
||||
|
||||
Фасеты задаются **атрибутами**, а не дочерними элементами:
|
||||
`length`, `minLength`, `maxLength`, `totalDigits`, `fractionDigits`,
|
||||
`minInclusive`, `maxInclusive`, `minExclusive`, `maxExclusive`,
|
||||
`whiteSpace` (`preserve` \| `collapse`).
|
||||
|
||||
Базовый тип может задаваться не атрибутом `base`, а вложенным анонимным `typeDef`
|
||||
**без** `xsi:type` — соответствует анонимному `xs:simpleType` внутри `xs:restriction`:
|
||||
|
||||
```xml
|
||||
<valueType name="INN12Type" variety="Atomic" length="12">
|
||||
<typeDef base="xs:string" variety="Atomic"/>
|
||||
<pattern>[0-9]{12}</pattern>
|
||||
</valueType>
|
||||
```
|
||||
|
||||
Дочерними элементами идут только `<pattern>` и `<enumeration>` — значение в тексте узла:
|
||||
|
||||
```xml
|
||||
<valueType name="НомерСчетаТип" base="xs:string" variety="Atomic" length="20">
|
||||
<pattern>[0-9]{20}</pattern>
|
||||
</valueType>
|
||||
```
|
||||
|
||||
У `<enumeration>` встречается атрибут `xsi:type` (например `xs:string`), указывающий тип литерала.
|
||||
|
||||
### 3.6. `<property>`
|
||||
|
||||
| Атрибут | Значения | Описание |
|
||||
|---|---|---|
|
||||
| `name` | идентификатор | Имя свойства |
|
||||
| `ref` | QName | Ссылка на глобальное свойство вместо собственного объявления |
|
||||
| `type` | QName | Тип свойства. При отсутствии и `type`, и вложенного `typeDef` — произвольный тип |
|
||||
| `lowerBound` | `0` \| `1` | Минимальная кратность. Умолчание при отсутствии — `1` |
|
||||
| `upperBound` | число \| `-1` | Максимальная кратность; `-1` — неограниченно. Умолчание — `1` |
|
||||
| `nillable` | `true` \| `false` | Допускает `xsi:nil` |
|
||||
| `fixed` | значение | Фиксированное значение |
|
||||
| `default` | значение | Значение по умолчанию |
|
||||
| `form` | `Element` \| `Attribute` \| `Text` | Форма представления в XML. Умолчание — `Element` |
|
||||
| `localName` | строка | Исходное XML-имя, если оно не является валидным идентификатором 1С |
|
||||
| `qualified` | `true` \| `false` | Переопределение `*FormQualified` для конкретного свойства |
|
||||
|
||||
Порядок атрибутов: `name`, `ref`, `type`, `lowerBound`, `upperBound`, `nillable`,
|
||||
`fixed`, `default`, `form`, `localName`, `qualified`.
|
||||
|
||||
**`form="Text"`** — свойство хранит собственное значение элемента (аналог `xs:simpleContent`).
|
||||
Такое свойство платформа всегда называет `__content`:
|
||||
|
||||
```xml
|
||||
<objectType name="Error">
|
||||
<property name="code" type="xs:NCName" lowerBound="1" form="Attribute"/>
|
||||
<property name="__content" type="xs:string" form="Text"/>
|
||||
</objectType>
|
||||
```
|
||||
|
||||
Наличие `form="Text"` не отменяет флагов самого типа — `mixed`, `sequenced` и прочие
|
||||
задаются как обычно:
|
||||
|
||||
```xml
|
||||
<objectType name="Account" mixed="true" sequenced="true">
|
||||
<property name="bic" type="d3p1:BicType" lowerBound="1" form="Attribute"/>
|
||||
<property name="__content" type="d3p1:AccNumType" form="Text"/>
|
||||
</objectType>
|
||||
```
|
||||
|
||||
**`localName`** — при импорте XML-схемы имя, недопустимое как идентификатор 1С,
|
||||
санируется, а оригинал сохраняется:
|
||||
|
||||
```xml
|
||||
<property name="isFixPlaceResidence_" type="xs:boolean" localName="isFixPlaceResidence "/>
|
||||
```
|
||||
|
||||
### 3.7. Порядок свойств внутри типа
|
||||
|
||||
Свойства с `form="Attribute"` обычно идут перед остальными — так записаны 96.5% типов
|
||||
корпуса. Оставшиеся 3.5% содержат произвольное чередование; порядок значим и сохраняется
|
||||
платформой как есть.
|
||||
|
||||
---
|
||||
|
||||
## 4. Схема префиксов пространств имён
|
||||
|
||||
Каждая ссылка на тип из пространства имён, отличного от `xs:`/`xsi:`, требует объявления
|
||||
префикса вида `dNpM`:
|
||||
|
||||
```xml
|
||||
<property xmlns:d3p1="urn:1C.ru:ClientBankExchange" name="ВерсияФормата" type="d3p1:ВерсияСхемы"/>
|
||||
```
|
||||
|
||||
- `N` — глубина узла: `package` = 1, его прямые потомки = 2, свойство внутри `objectType` = 3,
|
||||
свойство внутри `typeDef` = 5, глубже — 7, 9 и т.д.
|
||||
- `M` — порядковый номер нового пространства имён, объявляемого на этом узле (с 1).
|
||||
|
||||
Префикс объявляется **на первом узле, которому он нужен**; потомки переиспользуют его из
|
||||
области видимости, а не объявляют заново:
|
||||
|
||||
```xml
|
||||
<objectType xmlns:d2p1="…/Permissions/1.0.0.1" name="InternetConnectionBase" base="d2p1:PermissionBase">
|
||||
<property name="Protocol" type="d2p1:NetworkProtocols" lowerBound="0" nillable="true"/>
|
||||
</objectType>
|
||||
```
|
||||
|
||||
Целевое пространство имён самого пакета исключением не является — ссылка на собственный
|
||||
тип тоже требует локального объявления.
|
||||
|
||||
Частоты по корпусу: `d3p1` — 109 738, `d2p1` — 13 108, `d5p1` — 9 581, далее по убыванию до `d16p1`.
|
||||
|
||||
### 4.1. Нотация Кларка в `memberTypes`
|
||||
|
||||
Значения `memberTypes` записываются нотацией Кларка `{URI}Локальное`, без префикса
|
||||
(125 случаев из 135 в корпусе; остальные — обычные префиксные QName):
|
||||
|
||||
```xml
|
||||
<valueType xmlns:d2p1="http://v8.1c.ru/8.1/data/core" name="UUID" variety="Union"
|
||||
memberTypes="{http://v8.1c.ru/8.1/data/core}UUID {http://www.w3.org/2001/XMLSchema}base64Binary"/>
|
||||
```
|
||||
|
||||
Обратите внимание: объявление `xmlns:d2p1` присутствует, хотя в значении не используется —
|
||||
пространство имён всё равно проходит через общий механизм выделения префиксов. Если оно уже
|
||||
объявлено предком, нового объявления не появляется.
|
||||
|
||||
Остальные атрибуты-QName (`type`, `base`, `ref`, `itemType`) всегда префиксные.
|
||||
|
||||
### 4.2. Осмысленные префиксы
|
||||
|
||||
Изредка вместо сгенерированного `dNpM` встречается содержательный префикс — например
|
||||
`dcsset` для настроек компоновки данных:
|
||||
|
||||
```xml
|
||||
<property xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings"
|
||||
name="Настройка" type="dcsset:Filter" lowerBound="0"/>
|
||||
```
|
||||
|
||||
### 4.3. Свойство с `qualified` сериализуется с префиксом
|
||||
|
||||
Если у свойства задан `qualified`, платформа пишет и сам тег, и имя атрибута с явным
|
||||
префиксом пространства имён модели XDTO (хотя по умолчанию оно и так объявлено как `xmlns=`):
|
||||
|
||||
```xml
|
||||
<d3p2:property xmlns:d3p1="http://bssys.com/upg/request" xmlns:d3p2="http://v8.1c.ru/8.1/xdto"
|
||||
name="numCheck" type="d3p1:BoolType" lowerBound="0" form="Attribute"
|
||||
d3p2:qualified="false"/>
|
||||
```
|
||||
|
||||
Префикс для XDTO выделяется последним, после префиксов типов. Такое встречается редко
|
||||
(16 узлов на весь корпус) и появляется при импорте XML-схемы, где `form` задан на
|
||||
объявлении в unqualified-пакете.
|
||||
|
||||
---
|
||||
|
||||
## 5. Умолчания записываются непоследовательно
|
||||
|
||||
Один и тот же смысл в корпусе встречается в двух написаниях: `nillable="false"` присутствует
|
||||
явно 6 899 раз, `objectType open="false"` — 6 раз, `abstract="false"` — 2 раза, явное
|
||||
`form="Element"` — 44 раза. Пакеты, полученные импортом XML-схемы, и пакеты, созданные
|
||||
руками в Конфигураторе, отличаются стилем.
|
||||
|
||||
Практическое следствие: приведение пакета к «каноническому» виду меняет байты реальных
|
||||
файлов. Инструменты, которым важен точный round-trip, обязаны сохранять literal-форму.
|
||||
|
||||
---
|
||||
|
||||
## 6. Тихая деградация в `xs:anyType`
|
||||
|
||||
При импорте XML-схемы через Конфигуратор тип из чужого пространства имён, для которого
|
||||
в конфигурации нет соответствующего пакета, **молча** заменяется на `xs:anyType` —
|
||||
без ошибки и без предупреждения:
|
||||
|
||||
```xml
|
||||
<!-- в схеме было type="ns2:contact" -->
|
||||
<property name="contact" type="xs:anyType"/>
|
||||
```
|
||||
|
||||
При этом `<import namespace="…"/>` в пакете остаётся. Признак «объявлен импорт, но
|
||||
ни один тип из этого пространства имён не используется» — надёжный индикатор проблемы.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user