Запуск 1С:Предприятия скриптом PowerShell: от одной строки до ночной выгрузки базы

· 9 мин

Содержание

Чтобы запустить 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.exeC:\Program Files\1cv8\common\Стартер: окно со списком баз, сам выбирает версию
1cv8.exeC:\Program Files\1cv8\8.3.xx.xxxx\bin\Толстый клиент и Конфигуратор
1cv8c.exeC:\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С закрывается:

Пример: тонкий клиент к серверной базе с входом через 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: после обновления платформы ярлык продолжит работать, а стартер сам подберёт версию.

Частые вопросы

Можно ли запустить 1С из PowerShell без установки платформы на компьютер?
Нет. Скрипт только вызывает исполняемый файл 1С, поэтому клиент нужной версии должен быть установлен. Без платформы можно открыть базу, опубликованную на веб-сервере, через браузер.
Как передать в 1С параметр, чтобы конфигурация выполнила своё действие?
Ключом /C"текст". Значение попадает в переменную ПараметрЗапуска, и разработчик обрабатывает его, например, в модуле управляемого приложения при старте.
Почему скрипт не запускается с ошибкой о политике выполнения?
По умолчанию Windows запрещает выполнять .ps1 файлы. Запускайте через powershell.exe -ExecutionPolicy Bypass -File или разрешите локальные скрипты для текущего пользователя командой Set-ExecutionPolicy RemoteSigned -Scope CurrentUser.
Как закрыть зависший процесс 1С из скрипта?
Командой Stop-Process -Id с номером процесса из $p.Id. Прерванная выгрузка .dt будет неполной, а прерванное обновление конфигурации базы данных лучше повторить вручную в Конфигураторе и проверить результат.
Как запустить из PowerShell базу из списка пользователя, не зная пути?
Список хранится в файле %APPDATA%\1C\1CEStart\ibases.v8i. Имя базы указано в квадратных скобках, путь в строке Connect. Можно передать имя через /IBName стартеру или прочитать Connect и подставить путь в /F или /S.