Запуск 1С:Предприятия скриптом PowerShell: от одной строки до ночной выгрузки базы
Содержание
Чтобы запустить 1С из PowerShell, вызовите Start-Process с путём к 1cv8.exe и строкой ключей запуска: режим (ENTERPRISE или DESIGNER), база (/F для файловой, /S для серверной) и пользователь (/N, /P). Одна строка открывает нужную базу под нужным пользователем, без окна выбора информационной базы.
Дальше всё строится на этой основе: поиск установленной версии платформы, безопасное хранение пароля, ожидание завершения, разбор кода возврата и запуск по расписанию. Ниже примеры для Windows PowerShell 5.1 и PowerShell 7, они одинаково работают в обеих версиях.
Где лежит 1cv8.exe и как скрипту найти нужную версию
Платформа 8.3 ставится в отдельную папку на каждую версию. Типичная раскладка на 64-битной Windows:
| Файл | Путь по умолчанию | Для чего |
|---|---|---|
1cestart.exe | C:\Program Files\1cv8\common\ | Стартер: окно со списком баз, сам выбирает версию |
1cv8.exe | C:\Program Files\1cv8\8.3.xx.xxxx\bin\ | Толстый клиент и Конфигуратор |
1cv8c.exe | C:\Program Files\1cv8\8.3.xx.xxxx\bin\ | Тонкий клиент |
32-битная платформа живёт в C:\Program Files (x86)\1cv8\. Если у вас стоят обе разрядности, проверьте, какая нужна: например, внешние компоненты старого торгового оборудования часто работают только в 32-битном клиенте.
Функция выбора последней версии
Жёстко прописывать номер версии в скрипте плохо: после обновления платформы путь устареет. Надёжнее найти папку с наибольшим номером:
function Get-1CBin {
param(
[string]$Root = 'C:\Program Files\1cv8',
[string]$Version # можно передать конкретную, например '8.3.24.1691'
)
$dirs = Get-ChildItem -Path $Root -Directory |
Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' }
if ($Version) { $dirs = $dirs | Where-Object Name -eq $Version }
$last = $dirs | Sort-Object { [version]$_.Name } -Descending | Select-Object -First 1
if (-not $last) { throw "Платформа 1С не найдена в $Root" }
Join-Path $last.FullName 'bin'
}
$bin = Get-1CBin
$exe = Join-Path $bin '1cv8.exe'
💡 Сортировка через [version] важна. Обычная строковая сортировка поставит 8.3.9.2309 выше 8.3.24.1691, потому что сравнивает символы, а не числа.
Если база требует конкретную версию платформы (так бывает на серверной базе: версия клиента должна совпадать с версией сервера), передайте -Version явно.
Минимальная команда запуска в PowerShell
Самый короткий рабочий вариант для файловой базы:
$base = 'C:\Bases\Buh'
Start-Process -FilePath $exe -ArgumentList "ENTERPRISE /F`"$base`" /N`"Бухгалтер`" /P`"12345`""
Обратная кавычка ` перед " экранирует двойную кавычку внутри строки. Без неё путь с пробелами (C:\Мои базы\Торговля) развалится на два аргумента, и 1С сообщит, что база не найдена.
Почему одна строка, а не массив аргументов
Start-Process принимает и массив в -ArgumentList, но Windows PowerShell 5.1 склеивает его через пробел без кавычек. Ключи 1С записываются слитно со значением (/F"путь"), и такая склейка ломает их непредсказуемо. Собрать всю строку самому проще и прозрачнее: её можно вывести через Write-Host и сразу увидеть, что уйдёт в 1С.
Оператор & против Start-Process
| Способ | Ждёт завершения | Код возврата | Когда удобен |
|---|---|---|---|
Start-Process без -Wait | Нет | Нет | Открыть базу пользователю и забыть |
Start-Process -Wait -PassThru | Да | $p.ExitCode | Пакетные операции в Конфигураторе |
& $exe ... | Для GUI-программ нет | $LASTEXITCODE ненадёжен | Почти никогда для 1С |
Не используйте 1cestart.exe в скриптах, которым нужно дождаться результата. Стартер запускает 1cv8.exe и сразу завершается, поэтому -Wait вернёт управление мгновенно, а код возврата ничего не скажет о работе 1С.
Ключи командной строки 1С, которые нужны скрипту
Ключи пишутся после режима запуска, порядок не важен. Регистр букв тоже значения не имеет.
Режим и база
- 🟢
ENTERPRISE— пользовательский режим. - 🛠
DESIGNER— Конфигуратор, в том числе пакетный. - ➕
CREATEINFOBASE— создать новую базу . - 📁
/F"C:\Bases\Buh"— файловая база, путь к папке с1Cv8.1CD. - 🖥
/S"srv1c\buh"— серверная база: имя сервера (при нестандартном портеsrv1c:2541) и имя базы в кластере. - 🌐
/WS"https://site/buh"— база, опубликованная на веб-сервере. - 📋
/IBName"Бухгалтерия"— база по имени из списка пользователя (работает со стартером).
Пользователь и поведение при старте
- 👤
/N"Иванов"и/P"пароль"— имя и пароль пользователя 1С. - 🔐
/WA+— принудительно аутентификация Windows,/WA-— запретить её и входить только по/Nи/P. - 🤫
/DisableStartupMessages— не показывать предупреждения при старте (например, о несовпадении конфигураций). - 🚫
/DisableStartupDialogs— не показывать диалоги входа; если данных для входа не хватит, 1С завершится с ошибкой, а не повиснет с открытым окном. - 🧹
/ClearCache— очистить кэш клиента перед запуском. - 📨
/C"текст"— передать строку в конфигурацию; её читает глобальная переменнаяПараметрЗапуска. - ⚙️
/Execute"C:\Tools\Загрузка.epf"— открыть внешнюю обработку сразу после входа. - 🔓
/UC"КОД"— код разрешения входа, если в базе установлена блокировка начала сеансов.
Пакетный Конфигуратор
В режиме DESIGNER ключи-команды выполняются без интерфейса, после чего 1С закрывается:
- 💾
/DumpIB"D:\Backup\buh.dt"— выгрузить базу в файл.dt. - 📥
/RestoreIB"D:\Backup\buh.dt"— загрузить базу из.dt(данные в базе будут заменены). - 🔄
/UpdateDBCfg— обновить конфигурацию базы данных. - 📤
/DumpCfg"file.cf"и/LoadCfg"file.cf"— выгрузка и загрузка конфигурации.
Пример: тонкий клиент к серверной базе с входом через Windows и без лишних окон.
$thin = Join-Path (Get-1CBin) '1cv8c.exe'
Start-Process $thin -ArgumentList 'ENTERPRISE /S"srv1c\trade" /WA+ /DisableStartupMessages'
Тонкий клиент открывает только режим предприятия. Конфигуратор и пакетные команды выполняет 1cv8.exe.
Пароли в скрипте: как не оставить их открытым текстом
Пароль в /P"..." виден всем, кто откроет скрипт. Есть и менее очевидная утечка: строка запуска процесса видна в диспетчере задач на вкладке «Подробности» (столбец «Командная строка») и через Get-CimInstance Win32_Process. Поэтому способы ниже упорядочены от лучшего к допустимому.
Вход через Windows
Если пользователю 1С назначена аутентификация операционной системы, пароль не нужен вовсе: достаточно /WA+. Для задачи в планировщике это значит, что она должна работать от той учётной записи Windows, которая привязана к пользователю 1С.
Зашифрованный файл учётных данных
Когда без пароля 1С не обойтись, сохраните его один раз через Export-Clixml:
# выполнить один раз, под той учётной записью, от которой будет работать скрипт
Get-Credential -UserName 'Администратор' -Message 'Пользователь 1С' |
Export-Clixml -Path "$env:USERPROFILE\1c-admin.xml"
В рабочем скрипте:
$cred = Import-Clixml "$env:USERPROFILE\1c-admin.xml"
$user = $cred.UserName
$pass = $cred.GetNetworkCredential().Password
Файл шифруется средствами Windows (DPAPI) и расшифровывается только под той же учётной записью на том же компьютере. Скопировали на другой сервер или запустили задачу от другого пользователя — файл не прочитается, и его придётся создать заново.
Export-Clixml защищает пароль на диске, но не в командной строке процесса. Пока 1С работает, пароль виден в списке процессов. Для пользователя, под которым идут регламентные операции, заведите в 1С отдельную учётную запись с минимально нужными правами.
Как узнать, чем закончился запуск: логи и коды возврата
Пакетный Конфигуратор молча закрывается и при успехе, и при ошибке. Без логов скрипт ничего не узнает. Здесь помогают два ключа:
- 📝
/Out"файл"— служебные сообщения 1С пишутся в текстовый файл. С параметром-NoTruncateфайл дописывается, а не перезаписывается. - ✅
/DumpResult"файл"— после выполнения в файл записывается число:0при успехе, другое значение при ошибке.
Рабочая функция с проверкой результата:
function Invoke-1CDesigner {
param(
[Parameter(Mandatory)] [string]$BaseKey, # например '/F"C:\Bases\Buh"'
[Parameter(Mandatory)] [string]$Command, # например '/DumpIB"D:\Backup\buh.dt"'
[string]$User, [string]$Password,
[int]$TimeoutMin = 60
)
$exe = Join-Path (Get-1CBin) '1cv8.exe'
$stamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$log = "D:\Logs\1c_$stamp.log"
$result = "D:\Logs\1c_$stamp.res"
$auth = if ($User) { "/N`"$User`" /P`"$Password`" /WA-" } else { '/WA+' }
$args1c = "DESIGNER $BaseKey $auth /DisableStartupDialogs $Command /Out`"$log`" /DumpResult`"$result`""
$p = Start-Process -FilePath $exe -ArgumentList $args1c -PassThru
if (-not $p.WaitForExit($TimeoutMin * 60 * 1000)) {
throw "1С не завершилась за $TimeoutMin мин, процесс $($p.Id) оставлен для разбора"
}
$code = if (Test-Path $result) { (Get-Content $result -Raw).Trim() } else { 'нет файла' }
if ($code -ne '0') {
$text = if (Test-Path $log) { Get-Content $log -Raw } else { '' }
throw "Ошибка 1С, результат: $code. Лог: $text"
}
"Готово, лог: $log"
}
Здесь три защиты сразу. Таймаут не даёт скрипту ждать вечно, если 1С повисла на диалоге. Файл результата отделяет успех от ошибки. Лог попадает в текст исключения, а значит, в журнал планировщика или в письмо администратору.
Типовые сбои при запуске из скрипта
Расписание, фон и удалённые серверы
Ночная выгрузка через планировщик заданий
Типовой сценарий: каждую ночь выгружать базу в .dt. Скрипт D:\Scripts\dump-buh.ps1 вызывает Invoke-1CDesigner, а задача регистрируется так:
$action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "D:\Scripts\dump-buh.ps1"'
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
Register-ScheduledTask -TaskName '1C dump Buh' -Action $action -Trigger $trigger `
-User 'DOMAIN\svc1c' -Password 'пароль_учётки_Windows' -RunLevel Highest
Ключ -ExecutionPolicy Bypass действует только на этот запуск и не меняет политику системы. Пароль в Register-ScheduledTask нужен, чтобы задача шла без входа пользователя в систему.
Перед выгрузкой и тем более перед /RestoreIB или /UpdateDBCfg в серверной базе пользователей придётся отключить. Ставьте такие задачи на нерабочее время и предупреждайте сотрудников: незавершённые документы в оборванных сеансах не сохранятся.
Фоновый запуск без блокировки консоли
Чтобы обслужить несколько баз параллельно, оберните вызов в Start-Job:
$bases = 'C:\Bases\Buh', 'C:\Bases\Zup'
$jobs = foreach ($b in $bases) {
Start-Job -ArgumentList $b -ScriptBlock {
param($b)
. 'D:\Scripts\1c-functions.ps1'
$name = Split-Path $b -Leaf
Invoke-1CDesigner -BaseKey "/F`"$b`"" -Command "/DumpIB`"D:\Backup\$name.dt`""
}
}
$jobs | Wait-Job | Receive-Job
Каждая выгрузка займёт свою лицензию. Если их две, а баз пять, запускайте по очереди.
Запуск на удалённом сервере
Invoke-Command -ComputerName srv1c -ScriptBlock { ... } выполняет скрипт на сервере через WinRM. Для пакетного Конфигуратора это работает. Для обычного клиента смысла нет: сеанс WinRM не интерактивный, и окно 1С никто не увидит.
Для серверных баз платформа 8.3 новых версий предлагает и отдельную утилиту ibcmd для операций с базой без запуска Конфигуратора. Список её команд выводит ibcmd help.
Ярлык под пользователя
Обратный сценарий: скрипт раскладывает сотрудникам ярлыки с готовой строкой запуска.
$wsh = New-Object -ComObject WScript.Shell
$lnk = $wsh.CreateShortcut("$env:USERPROFILE\Desktop\Бухгалтерия.lnk")
$lnk.TargetPath = 'C:\Program Files\1cv8\common\1cestart.exe'
$lnk.Arguments = 'ENTERPRISE /S"srv1c\buh" /WA+'
$lnk.Save()
Здесь как раз уместен 1cestart.exe: после обновления платформы ярлык продолжит работать, а стартер сам подберёт версию.