diff --git a/.claude/skills/db-create/SKILL.md b/.claude/skills/db-create/SKILL.md index 0f188377..00129c38 100644 --- a/.claude/skills/db-create/SKILL.md +++ b/.claude/skills/db-create/SKILL.md @@ -28,30 +28,25 @@ allowed-tools: Если `v8path` не задан — автоопределение: `Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort -Desc | Select -First 1` После создания базы предложи зарегистрировать через `/db-list add`. -## Команды +## Команда -### Файловая база - -```cmd -"\1cv8.exe" CREATEINFOBASE File="<путь>" /DisableStartupDialogs /Out "<лог>" +```powershell +powershell.exe -NoProfile -File .claude\skills\db-create\scripts\db-create.ps1 <параметры> ``` -### Серверная база +### Параметры скрипта -```cmd -"\1cv8.exe" CREATEINFOBASE Srvr="<сервер>";Ref="<имя>" /DisableStartupDialogs /Out "<лог>" -``` +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Путь к файловой базе | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UseTemplate <файл>` | нет | Создать из шаблона (.cf или .dt) | +| `-AddToList` | нет | Добавить в список баз 1С | +| `-ListName <имя>` | нет | Имя базы в списке | -### Параметры - -| Параметр | Описание | -|----------|----------| -| `File="<путь>"` | Строка соединения для файловой базы | -| `Srvr="<сервер>";Ref="<имя>"` | Строка соединения для серверной базы | -| `/AddToList [<имя>]` | Добавить в список баз 1С (необязательно) | -| `/UseTemplate <файл>` | Создать из шаблона (.cf или .dt) | -| `/DisableStartupDialogs` | Подавить диалоги | -| `/Out <файл>` | Лог-файл | +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Коды возврата @@ -69,14 +64,15 @@ allowed-tools: ## Примеры ```powershell -$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 - # Создать файловую базу -& $v8.FullName CREATEINFOBASE File="C:\Bases\NewDB" /DisableStartupDialogs /Out "create.log" +powershell.exe -NoProfile -File .claude\skills\db-create\scripts\db-create.ps1 -InfoBasePath "C:\Bases\NewDB" # Создать серверную базу -& $v8.FullName CREATEINFOBASE Srvr="srv01";Ref="MyApp_Test" /DisableStartupDialogs /Out "create.log" +powershell.exe -NoProfile -File .claude\skills\db-create\scripts\db-create.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test" # Создать из шаблона CF -& $v8.FullName CREATEINFOBASE File="C:\Bases\NewDB" /UseTemplate "C:\Templates\config.cf" /DisableStartupDialogs /Out "create.log" +powershell.exe -NoProfile -File .claude\skills\db-create\scripts\db-create.ps1 -InfoBasePath "C:\Bases\NewDB" -UseTemplate "C:\Templates\config.cf" + +# Создать и добавить в список баз +powershell.exe -NoProfile -File .claude\skills\db-create\scripts\db-create.ps1 -InfoBasePath "C:\Bases\NewDB" -AddToList -ListName "Новая база" ``` diff --git a/.claude/skills/db-create/scripts/db-create.ps1 b/.claude/skills/db-create/scripts/db-create.ps1 new file mode 100644 index 00000000..71d9ea9b --- /dev/null +++ b/.claude/skills/db-create/scripts/db-create.ps1 @@ -0,0 +1,163 @@ +# db-create v1.0 — Create 1C information base +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Создание информационной базы 1С + +.DESCRIPTION + Создаёт новую информационную базу 1С (файловую или серверную). + Поддерживает создание из шаблона и добавление в список баз. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UseTemplate + Путь к файлу шаблона (.cf или .dt) + +.PARAMETER AddToList + Добавить в список баз 1С + +.PARAMETER ListName + Имя базы в списке + +.EXAMPLE + .\db-create.ps1 -InfoBasePath "C:\Bases\NewDB" + +.EXAMPLE + .\db-create.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test" + +.EXAMPLE + .\db-create.ps1 -InfoBasePath "C:\Bases\NewDB" -UseTemplate "C:\Templates\config.cf" -AddToList -ListName "Новая база" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UseTemplate, + + [Parameter(Mandatory=$false)] + [switch]$AddToList, + + [Parameter(Mandatory=$false)] + [string]$ListName +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Validate template --- +if ($UseTemplate -and -not (Test-Path $UseTemplate)) { + Write-Host "Error: template file not found: $UseTemplate" -ForegroundColor Red + exit 1 +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "db_create_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("CREATEINFOBASE") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "Srvr=`"$InfoBaseServer`";Ref=`"$InfoBaseRef`"" + } else { + $arguments += "File=`"$InfoBasePath`"" + } + + # --- Template --- + if ($UseTemplate) { + $arguments += "/UseTemplate", "`"$UseTemplate`"" + } + + # --- Add to list --- + if ($AddToList) { + if ($ListName) { + $arguments += "/AddToList", "`"$ListName`"" + } else { + $arguments += "/AddToList" + } + } + + # --- Output --- + $outFile = Join-Path $tempDir "create_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + if ($InfoBaseServer -and $InfoBaseRef) { + Write-Host "Information base created successfully: $InfoBaseServer/$InfoBaseRef" -ForegroundColor Green + } else { + Write-Host "Information base created successfully: $InfoBasePath" -ForegroundColor Green + } + } else { + Write-Host "Error creating information base (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/db-dump-cf/SKILL.md b/.claude/skills/db-dump-cf/SKILL.md index 6f957755..a0e2b2e9 100644 --- a/.claude/skills/db-dump-cf/SKILL.md +++ b/.claude/skills/db-dump-cf/SKILL.md @@ -34,22 +34,25 @@ allowed-tools: ## Команда -```cmd -"\1cv8.exe" DESIGNER /F "<база>" /N"" /P"" /DumpCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" +```powershell +powershell.exe -NoProfile -File .claude\skills\db-dump-cf\scripts\db-dump-cf.ps1 <параметры> ``` -Для серверной базы вместо `/F` используй `/S`: -```cmd -"\1cv8.exe" DESIGNER /S "/" /N"" /P"" /DumpCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" -``` +### Параметры скрипта -### Параметры +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-OutputFile <путь>` | да | Путь к выходному CF-файлу | +| `-Extension <имя>` | нет | Выгрузить расширение | +| `-AllExtensions` | нет | Выгрузить все расширения | -| Параметр | Описание | -|----------|----------| -| `/DumpCfg <файл>` | Путь к выходному CF-файлу | -| `-Extension <имя>` | Выгрузить расширение (вместо основной конфигурации) | -| `-AllExtensions` | Выгрузить все расширения (архив расширений) | +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Коды возврата @@ -62,10 +65,15 @@ allowed-tools: Прочитай лог-файл и покажи результат. Если есть ошибки — покажи содержимое лога. -## Пример +## Примеры ```powershell -$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +# Выгрузка конфигурации (файловая база) +powershell.exe -NoProfile -File .claude\skills\db-dump-cf\scripts\db-dump-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "C:\backup\config.cf" -& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /DumpCfg "C:\backup\config.cf" /DisableStartupDialogs /Out "dump.log" +# Серверная база +powershell.exe -NoProfile -File .claude\skills\db-dump-cf\scripts\db-dump-cf.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -OutputFile "config.cf" + +# Выгрузка расширения +powershell.exe -NoProfile -File .claude\skills\db-dump-cf\scripts\db-dump-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -OutputFile "ext.cfe" -Extension "МоёРасширение" ``` diff --git a/.claude/skills/db-dump-cf/scripts/db-dump-cf.ps1 b/.claude/skills/db-dump-cf/scripts/db-dump-cf.ps1 new file mode 100644 index 00000000..45f3090c --- /dev/null +++ b/.claude/skills/db-dump-cf/scripts/db-dump-cf.ps1 @@ -0,0 +1,166 @@ +# db-dump-cf v1.0 — Dump 1C configuration to CF file +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Выгрузка конфигурации 1С в CF-файл + +.DESCRIPTION + Выгружает конфигурацию информационной базы в бинарный CF-файл. + Поддерживает выгрузку расширений. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER OutputFile + Путь к выходному CF-файлу + +.PARAMETER Extension + Имя расширения для выгрузки + +.PARAMETER AllExtensions + Выгрузить все расширения + +.EXAMPLE + .\db-dump-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -OutputFile "config.cf" + +.EXAMPLE + .\db-dump-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -OutputFile "ext.cfe" -Extension "МоёРасширение" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$true)] + [string]$OutputFile, + + [Parameter(Mandatory=$false)] + [string]$Extension, + + [Parameter(Mandatory=$false)] + [switch]$AllExtensions +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Ensure output directory exists --- +$outDir = Split-Path $OutputFile -Parent +if ($outDir -and -not (Test-Path $outDir)) { + New-Item -ItemType Directory -Path $outDir -Force | Out-Null +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "db_dump_cf_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/DumpCfg", "`"$OutputFile`"" + + # --- Extensions --- + if ($Extension) { + $arguments += "-Extension", "`"$Extension`"" + } elseif ($AllExtensions) { + $arguments += "-AllExtensions" + } + + # --- Output --- + $outFile = Join-Path $tempDir "dump_cf_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + Write-Host "Configuration dumped successfully to: $OutputFile" -ForegroundColor Green + } else { + Write-Host "Error dumping configuration (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/db-load-cf/SKILL.md b/.claude/skills/db-load-cf/SKILL.md index fc348054..c9cd9ef6 100644 --- a/.claude/skills/db-load-cf/SKILL.md +++ b/.claude/skills/db-load-cf/SKILL.md @@ -35,22 +35,25 @@ allowed-tools: ## Команда -```cmd -"\1cv8.exe" DESIGNER /F "<база>" /N"" /P"" /LoadCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" +```powershell +powershell.exe -NoProfile -File .claude\skills\db-load-cf\scripts\db-load-cf.ps1 <параметры> ``` -Для серверной базы вместо `/F` используй `/S`: -```cmd -"\1cv8.exe" DESIGNER /S "/" /N"" /P"" /LoadCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" -``` +### Параметры скрипта -### Параметры +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-InputFile <путь>` | да | Путь к CF-файлу | +| `-Extension <имя>` | нет | Загрузить как расширение | +| `-AllExtensions` | нет | Загрузить все расширения из архива | -| Параметр | Описание | -|----------|----------| -| `/LoadCfg <файл>` | Путь к CF-файлу | -| `-Extension <имя>` | Загрузить как расширение | -| `-AllExtensions` | Загрузить все расширения из архива | +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Коды возврата @@ -67,14 +70,12 @@ allowed-tools: ## Примеры ```powershell -$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 - # Файловая база -& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /LoadCfg "C:\backup\config.cf" /DisableStartupDialogs /Out "load.log" +powershell.exe -NoProfile -File .claude\skills\db-load-cf\scripts\db-load-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "C:\backup\config.cf" # Серверная база -& $v8.FullName DESIGNER /S "srv01/MyApp_Test" /N"Admin" /P"secret" /LoadCfg "config.cf" /DisableStartupDialogs /Out "load.log" +powershell.exe -NoProfile -File .claude\skills\db-load-cf\scripts\db-load-cf.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Test" -UserName "Admin" -Password "secret" -InputFile "config.cf" -# Не забудь обновить БД после загрузки! -& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /UpdateDBCfg /DisableStartupDialogs /Out "update.log" +# Загрузка расширения +powershell.exe -NoProfile -File .claude\skills\db-load-cf\scripts\db-load-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -InputFile "ext.cfe" -Extension "МоёРасширение" ``` diff --git a/.claude/skills/db-load-cf/scripts/db-load-cf.ps1 b/.claude/skills/db-load-cf/scripts/db-load-cf.ps1 new file mode 100644 index 00000000..af516923 --- /dev/null +++ b/.claude/skills/db-load-cf/scripts/db-load-cf.ps1 @@ -0,0 +1,166 @@ +# db-load-cf v1.0 — Load 1C configuration from CF file +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Загрузка конфигурации 1С из CF-файла + +.DESCRIPTION + Загружает конфигурацию из бинарного CF-файла в информационную базу. + Поддерживает загрузку расширений. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER InputFile + Путь к CF-файлу для загрузки + +.PARAMETER Extension + Загрузить как расширение + +.PARAMETER AllExtensions + Загрузить все расширения из архива + +.EXAMPLE + .\db-load-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -InputFile "config.cf" + +.EXAMPLE + .\db-load-cf.ps1 -InfoBasePath "C:\Bases\MyDB" -InputFile "ext.cfe" -Extension "МоёРасширение" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$true)] + [string]$InputFile, + + [Parameter(Mandatory=$false)] + [string]$Extension, + + [Parameter(Mandatory=$false)] + [switch]$AllExtensions +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Validate input file --- +if (-not (Test-Path $InputFile)) { + Write-Host "Error: input file not found: $InputFile" -ForegroundColor Red + exit 1 +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "db_load_cf_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/LoadCfg", "`"$InputFile`"" + + # --- Extensions --- + if ($Extension) { + $arguments += "-Extension", "`"$Extension`"" + } elseif ($AllExtensions) { + $arguments += "-AllExtensions" + } + + # --- Output --- + $outFile = Join-Path $tempDir "load_cf_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + Write-Host "Configuration loaded successfully from: $InputFile" -ForegroundColor Green + } else { + Write-Host "Error loading configuration (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/db-run/SKILL.md b/.claude/skills/db-run/SKILL.md index 5deb90d4..463f6eaf 100644 --- a/.claude/skills/db-run/SKILL.md +++ b/.claude/skills/db-run/SKILL.md @@ -35,49 +35,42 @@ allowed-tools: ## Команда -```cmd -"\1cv8.exe" ENTERPRISE /F "<база>" /N"" /P"" /DisableStartupDialogs +```powershell +powershell.exe -NoProfile -File .claude\skills\db-run\scripts\db-run.ps1 <параметры> ``` -Для серверной базы вместо `/F` используй `/S`: -```cmd -"\1cv8.exe" ENTERPRISE /S "/" /N"" /P"" /DisableStartupDialogs -``` +### Параметры скрипта -### Параметры +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-Execute <файл.epf>` | нет | Запуск внешней обработки сразу после старта | +| `-CParam <строка>` | нет | Параметр запуска (/C) | +| `-URL <ссылка>` | нет | Навигационная ссылка (формат `e1cib/...`) | -| Параметр | Описание | -|----------|----------| -| `/Execute <файл.epf>` | Запуск внешней обработки сразу после старта | -| `/C <строка>` | Передача параметра в прикладное решение | -| `/URL <ссылка>` | Навигационная ссылка (формат `e1cib/...`) | - -> При указании `/Execute` параметр `/URL` игнорируется. +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Важно -**Запуск в фоне** — не жди завершения процесса 1С. Используй `Start-Process` без `-Wait`: - -```powershell -Start-Process -FilePath "\1cv8.exe" -ArgumentList 'ENTERPRISE /F "<база>" /N"" /P"" /DisableStartupDialogs' -``` - -Или через Bash: -```bash -"/1cv8.exe" ENTERPRISE /F "<база>" /N"" /P"" /DisableStartupDialogs & -``` +Скрипт запускает 1С в фоне (`Start-Process` без `-Wait`) — управление возвращается сразу. ## Примеры ```powershell -$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 - # Простой запуск -Start-Process -FilePath $v8.FullName -ArgumentList 'ENTERPRISE /F "C:\Bases\MyDB" /N"Admin" /P"" /DisableStartupDialogs' +powershell.exe -NoProfile -File .claude\skills\db-run\scripts\db-run.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" # Запуск с обработкой -Start-Process -FilePath $v8.FullName -ArgumentList 'ENTERPRISE /F "C:\Bases\MyDB" /N"Admin" /P"" /Execute "C:\epf\МояОбработка.epf" /DisableStartupDialogs' +powershell.exe -NoProfile -File .claude\skills\db-run\scripts\db-run.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Execute "C:\epf\МояОбработка.epf" # Открыть по навигационной ссылке -Start-Process -FilePath $v8.FullName -ArgumentList 'ENTERPRISE /F "C:\Bases\MyDB" /N"Admin" /P"" /URL "e1cib/data/Справочник.Номенклатура" /DisableStartupDialogs' +powershell.exe -NoProfile -File .claude\skills\db-run\scripts\db-run.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -URL "e1cib/data/Справочник.Номенклатура" + +# Серверная база с параметром запуска +powershell.exe -NoProfile -File .claude\skills\db-run\scripts\db-run.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -CParam "ЗапуститьОбновление" ``` diff --git a/.claude/skills/db-run/scripts/db-run.ps1 b/.claude/skills/db-run/scripts/db-run.ps1 new file mode 100644 index 00000000..ba6aa70d --- /dev/null +++ b/.claude/skills/db-run/scripts/db-run.ps1 @@ -0,0 +1,133 @@ +# db-run v1.0 — Launch 1C:Enterprise +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Запуск 1С:Предприятие + +.DESCRIPTION + Запускает информационную базу в режиме 1С:Предприятие (пользовательский режим). + Запуск в фоне — не ждёт завершения процесса. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER Execute + Путь к внешней обработке для запуска + +.PARAMETER CParam + Параметр запуска (/C) + +.PARAMETER URL + Навигационная ссылка (e1cib/...) + +.EXAMPLE + .\db-run.ps1 -InfoBasePath "C:\Bases\MyDB" + +.EXAMPLE + .\db-run.ps1 -InfoBasePath "C:\Bases\MyDB" -Execute "C:\epf\МояОбработка.epf" + +.EXAMPLE + .\db-run.ps1 -InfoBasePath "C:\Bases\MyDB" -CParam "ЗапуститьОбновление" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$false)] + [string]$Execute, + + [Parameter(Mandatory=$false)] + [string]$CParam, + + [Parameter(Mandatory=$false)] + [string]$URL +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Build arguments --- +$arguments = @("ENTERPRISE") + +if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" +} else { + $arguments += "/F", "`"$InfoBasePath`"" +} + +if ($UserName) { $arguments += "/N`"$UserName`"" } +if ($Password) { $arguments += "/P`"$Password`"" } + +# --- Optional params --- +if ($Execute) { + $arguments += "/Execute", "`"$Execute`"" +} +if ($CParam) { + $arguments += "/C", "`"$CParam`"" +} +if ($URL) { + $arguments += "/URL", "`"$URL`"" +} + +$arguments += "/DisableStartupDialogs" + +# --- Execute (background, no wait) --- +Write-Host "Running: 1cv8.exe $($arguments -join ' ')" +Start-Process -FilePath $V8Path -ArgumentList $arguments +Write-Host "1C:Enterprise launched" -ForegroundColor Green diff --git a/.claude/skills/db-update/SKILL.md b/.claude/skills/db-update/SKILL.md index eae5797f..0240a771 100644 --- a/.claude/skills/db-update/SKILL.md +++ b/.claude/skills/db-update/SKILL.md @@ -34,26 +34,27 @@ allowed-tools: ## Команда -```cmd -"\1cv8.exe" DESIGNER /F "<база>" /N"" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "<лог>" +```powershell +powershell.exe -NoProfile -File .claude\skills\db-update\scripts\db-update.ps1 <параметры> ``` -Для серверной базы вместо `/F` используй `/S`: -```cmd -"\1cv8.exe" DESIGNER /S "/" /N"" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "<лог>" -``` +### Параметры скрипта -### Параметры +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-Extension <имя>` | нет | Обновить расширение | +| `-AllExtensions` | нет | Обновить все расширения | +| `-Dynamic <+/->` | нет | `+` — динамическое обновление, `-` — отключить | +| `-Server` | нет | Обновление на стороне сервера | +| `-WarningsAsErrors` | нет | Предупреждения считать ошибками | -| Параметр | Описание | -|----------|----------| -| `/UpdateDBCfg` | Обновить конфигурацию БД | -| `-Dynamic+` | Динамическое обновление (без монопольного доступа) | -| `-Dynamic-` | Отключить динамическое обновление | -| `-Server` | Обновление на стороне сервера | -| `-WarningsAsErrors` | Предупреждения считать ошибками | -| `-Extension <имя>` | Обновить расширение | -| `-AllExtensions` | Обновить все расширения | +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ### Фоновое обновление (серверная база) @@ -78,14 +79,15 @@ allowed-tools: - Для серверных баз рекомендуется `-Dynamic+` для обновления без остановки - Если структура данных существенно изменилась (удаление реквизитов, изменение типов) — динамическое обновление может быть невозможно -## Пример +## Примеры ```powershell -$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +# Обычное обновление (файловая база) +powershell.exe -NoProfile -File .claude\skills\db-update\scripts\db-update.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -# Обычное обновление -& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "update.log" +# Динамическое обновление (серверная база) +powershell.exe -NoProfile -File .claude\skills\db-update\scripts\db-update.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -Dynamic "+" -# Динамическое обновление -& $v8.FullName DESIGNER /S "srv01/MyDB" /N"Admin" /P"secret" /UpdateDBCfg -Dynamic+ /DisableStartupDialogs /Out "update.log" +# Обновление расширения +powershell.exe -NoProfile -File .claude\skills\db-update\scripts\db-update.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Extension "МоёРасширение" ``` diff --git a/.claude/skills/db-update/scripts/db-update.ps1 b/.claude/skills/db-update/scripts/db-update.ps1 new file mode 100644 index 00000000..fb83b73f --- /dev/null +++ b/.claude/skills/db-update/scripts/db-update.ps1 @@ -0,0 +1,184 @@ +# db-update v1.0 — Update 1C database configuration +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Обновление конфигурации базы данных 1С + +.DESCRIPTION + Применяет изменения основной конфигурации к конфигурации базы данных. + Поддерживает динамическое обновление, обновление расширений. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER Extension + Имя расширения для обновления + +.PARAMETER AllExtensions + Обновить все расширения + +.PARAMETER Dynamic + Динамическое обновление: "+" включить, "-" отключить + +.PARAMETER Server + Обновление на стороне сервера + +.PARAMETER WarningsAsErrors + Предупреждения считать ошибками + +.EXAMPLE + .\db-update.ps1 -InfoBasePath "C:\Bases\MyDB" + +.EXAMPLE + .\db-update.ps1 -InfoBasePath "C:\Bases\MyDB" -Dynamic "+" -Extension "МоёРасширение" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$false)] + [string]$Extension, + + [Parameter(Mandatory=$false)] + [switch]$AllExtensions, + + [Parameter(Mandatory=$false)] + [ValidateSet("+", "-")] + [string]$Dynamic, + + [Parameter(Mandatory=$false)] + [switch]$Server, + + [Parameter(Mandatory=$false)] + [switch]$WarningsAsErrors +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "db_update_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/UpdateDBCfg" + + # --- Options --- + if ($Dynamic) { + $arguments += "-Dynamic$Dynamic" + } + if ($Server) { + $arguments += "-Server" + } + if ($WarningsAsErrors) { + $arguments += "-WarningsAsErrors" + } + + # --- Extensions --- + if ($Extension) { + $arguments += "-Extension", "`"$Extension`"" + } elseif ($AllExtensions) { + $arguments += "-AllExtensions" + } + + # --- Output --- + $outFile = Join-Path $tempDir "update_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + Write-Host "Database configuration updated successfully" -ForegroundColor Green + } else { + Write-Host "Error updating database configuration (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/epf-build/SKILL.md b/.claude/skills/epf-build/SKILL.md index fccb10ae..37d880c4 100644 --- a/.claude/skills/epf-build/SKILL.md +++ b/.claude/skills/epf-build/SKILL.md @@ -36,21 +36,26 @@ allowed-tools: Если `v8path` не задан — автоопределение: `Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort -Desc | Select -First 1` Если использованная база не зарегистрирована — после выполнения предложи добавить через `/db-list add`. -## Команды +## Команда -### 1. Создать ИБ для сборки (если нет зарегистрированной базы) - -```cmd -"\1cv8.exe" CREATEINFOBASE File="./base" +```powershell +powershell.exe -NoProfile -File .claude\skills\epf-build\scripts\epf-build.ps1 <параметры> ``` -### 2. Сборка EPF из XML +### Параметры скрипта -Файловая база: -```cmd -"\1cv8.exe" DESIGNER /F "<база>" /DisableStartupDialogs /LoadExternalDataProcessorOrReportFromFiles "\.xml" "\.epf" /Out "\build.log" -``` -Серверная база — вместо `/F` используй `/S`, добавь `/N"" /P""` при наличии учётных данных. +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-SourceFile <путь>` | да | Путь к корневому XML-файлу исходников | +| `-OutputFile <путь>` | да | Путь к выходному EPF/ERF-файлу | + +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Коды возврата @@ -63,13 +68,12 @@ allowed-tools: Если обработка использует ссылочные типы конфигурации (`CatalogRef.XXX`, `DocumentRef.XXX`) — сборка в пустой базе упадёт с ошибкой XDTO. Зарегистрируй базу с целевой конфигурацией через `/db-list add`. -## Пример полного цикла +## Примеры ```powershell -# Параметры из .v8-project.json: -$v8path = "C:\Program Files\1cv8\8.3.25.1257\bin" # v8path -$base = "C:\Bases\MyDB" # databases[].path +# Сборка обработки (файловая база) +powershell.exe -NoProfile -File .claude\skills\epf-build\scripts\epf-build.ps1 -InfoBasePath "C:\Bases\MyDB" -SourceFile "src\МояОбработка.xml" -OutputFile "build\МояОбработка.epf" -# Собрать (база с конфигурацией — ссылочные типы резолвятся) -& "$v8path\1cv8.exe" DESIGNER /F $base /DisableStartupDialogs /LoadExternalDataProcessorOrReportFromFiles "src\МояОбработка.xml" "build\МояОбработка.epf" /Out "build\build.log" -``` \ No newline at end of file +# Серверная база +powershell.exe -NoProfile -File .claude\skills\epf-build\scripts\epf-build.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -SourceFile "src\МояОбработка.xml" -OutputFile "build\МояОбработка.epf" +``` diff --git a/.claude/skills/epf-build/scripts/epf-build.ps1 b/.claude/skills/epf-build/scripts/epf-build.ps1 new file mode 100644 index 00000000..36e92486 --- /dev/null +++ b/.claude/skills/epf-build/scripts/epf-build.ps1 @@ -0,0 +1,159 @@ +# epf-build v1.0 — Build external data processor or report (EPF/ERF) from XML sources +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Сборка внешней обработки/отчёта 1С из XML-исходников + +.DESCRIPTION + Собирает EPF/ERF-файл из XML-исходников с помощью платформы 1С. + Общий скрипт для epf-build и erf-build. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER SourceFile + Путь к корневому XML-файлу исходников + +.PARAMETER OutputFile + Путь к выходному EPF/ERF-файлу + +.EXAMPLE + .\epf-build.ps1 -InfoBasePath "C:\Bases\MyDB" -SourceFile "src\МояОбработка.xml" -OutputFile "build\МояОбработка.epf" + +.EXAMPLE + .\epf-build.ps1 -InfoBasePath "C:\Bases\MyDB" -SourceFile "src\МойОтчёт.xml" -OutputFile "build\МойОтчёт.erf" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$true)] + [string]$SourceFile, + + [Parameter(Mandatory=$true)] + [string]$OutputFile +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Validate source file --- +if (-not (Test-Path $SourceFile)) { + Write-Host "Error: source file not found: $SourceFile" -ForegroundColor Red + exit 1 +} + +# --- Ensure output directory exists --- +$outDir = Split-Path $OutputFile -Parent +if ($outDir -and -not (Test-Path $outDir)) { + New-Item -ItemType Directory -Path $outDir -Force | Out-Null +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "epf_build_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/LoadExternalDataProcessorOrReportFromFiles", "`"$SourceFile`"", "`"$OutputFile`"" + + # --- Output --- + $outFile = Join-Path $tempDir "build_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + Write-Host "Build completed successfully: $OutputFile" -ForegroundColor Green + } else { + Write-Host "Error building (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/epf-dump/SKILL.md b/.claude/skills/epf-dump/SKILL.md index 6844cb70..2f049aea 100644 --- a/.claude/skills/epf-dump/SKILL.md +++ b/.claude/skills/epf-dump/SKILL.md @@ -35,21 +35,27 @@ allowed-tools: Если `v8path` не задан — автоопределение: `Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort -Desc | Select -First 1` Если использованная база не зарегистрирована — после выполнения предложи добавить через `/db-list add`. -## Команды +## Команда -### 1. Создать ИБ (если нет зарегистрированной базы) - -```cmd -"\1cv8.exe" CREATEINFOBASE File="./base" +```powershell +powershell.exe -NoProfile -File .claude\skills\epf-dump\scripts\epf-dump.ps1 <параметры> ``` -### 2. Разборка EPF в XML +### Параметры скрипта -Файловая база: -```cmd -"\1cv8.exe" DESIGNER /F "<база>" /DisableStartupDialogs /DumpExternalDataProcessorOrReportToFiles "" "" -Format Hierarchical /Out "\dump.log" -``` -Серверная база — вместо `/F` используй `/S`, добавь `/N"" /P""` при наличии учётных данных. +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-InputFile <путь>` | да | Путь к EPF/ERF-файлу | +| `-OutputDir <путь>` | да | Каталог для выгрузки исходников | +| `-Format <формат>` | нет | `Hierarchical` (по умолч.) / `Plain` | + +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Коды возврата @@ -82,13 +88,12 @@ allowed-tools: └── Template. ``` -## Пример полного цикла +## Примеры ```powershell -# Параметры из .v8-project.json: -$v8path = "C:\Program Files\1cv8\8.3.25.1257\bin" # v8path -$base = "C:\Bases\MyDB" # databases[].path +# Разборка обработки (файловая база) +powershell.exe -NoProfile -File .claude\skills\epf-dump\scripts\epf-dump.ps1 -InfoBasePath "C:\Bases\MyDB" -InputFile "build\МояОбработка.epf" -OutputDir "src" -# Разобрать -& "$v8path\1cv8.exe" DESIGNER /F $base /DisableStartupDialogs /DumpExternalDataProcessorOrReportToFiles "src" "build\МояОбработка.epf" -Format Hierarchical /Out "build\dump.log" -``` \ No newline at end of file +# Серверная база +powershell.exe -NoProfile -File .claude\skills\epf-dump\scripts\epf-dump.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -InputFile "build\МояОбработка.epf" -OutputDir "src" +``` diff --git a/.claude/skills/epf-dump/scripts/epf-dump.ps1 b/.claude/skills/epf-dump/scripts/epf-dump.ps1 new file mode 100644 index 00000000..4932d82d --- /dev/null +++ b/.claude/skills/epf-dump/scripts/epf-dump.ps1 @@ -0,0 +1,166 @@ +# epf-dump v1.0 — Dump external data processor or report (EPF/ERF) to XML sources +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Разборка внешней обработки/отчёта 1С в XML-исходники + +.DESCRIPTION + Разбирает EPF/ERF-файл во XML-исходники с помощью платформы 1С. + Общий скрипт для epf-dump и erf-dump. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER InputFile + Путь к EPF/ERF-файлу + +.PARAMETER OutputDir + Каталог для выгрузки исходников + +.PARAMETER Format + Формат выгрузки: Hierarchical или Plain (по умолчанию Hierarchical) + +.EXAMPLE + .\epf-dump.ps1 -InfoBasePath "C:\Bases\MyDB" -InputFile "build\МояОбработка.epf" -OutputDir "src" + +.EXAMPLE + .\epf-dump.ps1 -InfoBasePath "C:\Bases\MyDB" -InputFile "build\МойОтчёт.erf" -OutputDir "src" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$true)] + [string]$InputFile, + + [Parameter(Mandatory=$true)] + [string]$OutputDir, + + [Parameter(Mandatory=$false)] + [ValidateSet("Hierarchical", "Plain")] + [string]$Format = "Hierarchical" +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Validate input file --- +if (-not (Test-Path $InputFile)) { + Write-Host "Error: input file not found: $InputFile" -ForegroundColor Red + exit 1 +} + +# --- Ensure output directory exists --- +if (-not (Test-Path $OutputDir)) { + New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "epf_dump_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/DumpExternalDataProcessorOrReportToFiles", "`"$OutputDir`"", "`"$InputFile`"" + $arguments += "-Format", $Format + + # --- Output --- + $outFile = Join-Path $tempDir "dump_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + Write-Host "Dump completed successfully to: $OutputDir" -ForegroundColor Green + } else { + Write-Host "Error dumping (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/erf-build/SKILL.md b/.claude/skills/erf-build/SKILL.md index a43ce63d..19afd565 100644 --- a/.claude/skills/erf-build/SKILL.md +++ b/.claude/skills/erf-build/SKILL.md @@ -11,7 +11,7 @@ allowed-tools: # /erf-build — Сборка отчёта -Собирает ERF-файл из XML-исходников с помощью платформы 1С. Использует ту же команду CLI, что и `/epf-build`. +Собирает ERF-файл из XML-исходников с помощью платформы 1С. Использует общий скрипт из `/epf-build`. ## Usage @@ -36,21 +36,28 @@ allowed-tools: Если `v8path` не задан — автоопределение: `Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort -Desc | Select -First 1` Если использованная база не зарегистрирована — после выполнения предложи добавить через `/db-list add`. -## Команды +## Команда -### 1. Создать ИБ для сборки (если нет зарегистрированной базы) +Используй общий скрипт из epf-build: -```cmd -"\1cv8.exe" CREATEINFOBASE File="./base" +```powershell +powershell.exe -NoProfile -File .claude\skills\epf-build\scripts\epf-build.ps1 <параметры> ``` -### 2. Сборка ERF из XML +### Параметры скрипта -Файловая база: -```cmd -"\1cv8.exe" DESIGNER /F "<база>" /DisableStartupDialogs /LoadExternalDataProcessorOrReportFromFiles "\.xml" "\.erf" /Out "\build.log" -``` -Серверная база — вместо `/F` используй `/S`, добавь `/N"" /P""` при наличии учётных данных. +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-SourceFile <путь>` | да | Путь к корневому XML-файлу исходников | +| `-OutputFile <путь>` | да | Путь к выходному ERF-файлу | + +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Коды возврата @@ -63,13 +70,12 @@ allowed-tools: Если отчёт использует ссылочные типы конфигурации (`CatalogRef.XXX`, `DocumentRef.XXX`) — сборка в пустой базе упадёт с ошибкой XDTO. Зарегистрируй базу с целевой конфигурацией через `/db-list add`. -## Пример полного цикла +## Примеры ```powershell -# Параметры из .v8-project.json: -$v8path = "C:\Program Files\1cv8\8.3.25.1257\bin" # v8path -$base = "C:\Bases\MyDB" # databases[].path +# Сборка отчёта (файловая база) +powershell.exe -NoProfile -File .claude\skills\epf-build\scripts\epf-build.ps1 -InfoBasePath "C:\Bases\MyDB" -SourceFile "src\МойОтчёт.xml" -OutputFile "build\МойОтчёт.erf" -# Собрать (база с конфигурацией — ссылочные типы резолвятся) -& "$v8path\1cv8.exe" DESIGNER /F $base /DisableStartupDialogs /LoadExternalDataProcessorOrReportFromFiles "src\МойОтчёт.xml" "build\МойОтчёт.erf" /Out "build\build.log" +# Серверная база +powershell.exe -NoProfile -File .claude\skills\epf-build\scripts\epf-build.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -SourceFile "src\МойОтчёт.xml" -OutputFile "build\МойОтчёт.erf" ``` diff --git a/.claude/skills/erf-dump/SKILL.md b/.claude/skills/erf-dump/SKILL.md index 5d64c7c4..ef08dbf5 100644 --- a/.claude/skills/erf-dump/SKILL.md +++ b/.claude/skills/erf-dump/SKILL.md @@ -11,7 +11,7 @@ allowed-tools: # /erf-dump — Разборка отчёта -Разбирает ERF-файл во XML-исходники с помощью платформы 1С (иерархический формат). Использует ту же команду CLI, что и `/epf-dump`. +Разбирает ERF-файл во XML-исходники с помощью платформы 1С (иерархический формат). Использует общий скрипт из `/epf-dump`. ## Usage @@ -35,21 +35,29 @@ allowed-tools: Если `v8path` не задан — автоопределение: `Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort -Desc | Select -First 1` Если использованная база не зарегистрирована — после выполнения предложи добавить через `/db-list add`. -## Команды +## Команда -### 1. Создать ИБ (если нет зарегистрированной базы) +Используй общий скрипт из epf-dump: -```cmd -"\1cv8.exe" CREATEINFOBASE File="./base" +```powershell +powershell.exe -NoProfile -File .claude\skills\epf-dump\scripts\epf-dump.ps1 <параметры> ``` -### 2. Разборка ERF в XML +### Параметры скрипта -Файловая база: -```cmd -"\1cv8.exe" DESIGNER /F "<база>" /DisableStartupDialogs /DumpExternalDataProcessorOrReportToFiles "" "" -Format Hierarchical /Out "\dump.log" -``` -Серверная база — вместо `/F` используй `/S`, добавь `/N"" /P""` при наличии учётных данных. +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-InputFile <путь>` | да | Путь к ERF-файлу | +| `-OutputDir <путь>` | да | Каталог для выгрузки исходников | +| `-Format <формат>` | нет | `Hierarchical` (по умолч.) / `Plain` | + +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` ## Коды возврата @@ -82,13 +90,12 @@ allowed-tools: └── Template. ``` -## Пример полного цикла +## Примеры ```powershell -# Параметры из .v8-project.json: -$v8path = "C:\Program Files\1cv8\8.3.25.1257\bin" # v8path -$base = "C:\Bases\MyDB" # databases[].path +# Разборка отчёта (файловая база) +powershell.exe -NoProfile -File .claude\skills\epf-dump\scripts\epf-dump.ps1 -InfoBasePath "C:\Bases\MyDB" -InputFile "build\МойОтчёт.erf" -OutputDir "src" -# Разобрать -& "$v8path\1cv8.exe" DESIGNER /F $base /DisableStartupDialogs /DumpExternalDataProcessorOrReportToFiles "src" "build\МойОтчёт.erf" -Format Hierarchical /Out "build\dump.log" +# Серверная база +powershell.exe -NoProfile -File .claude\skills\epf-dump\scripts\epf-dump.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -InputFile "build\МойОтчёт.erf" -OutputDir "src" ```