К статье
Практический материал

Автоматизация · 10 мин

Как запустить скрипт PowerShell из 1С

Способы запуска скрипта PowerShell из 1С: WScript.Shell, ЗапуститьПриложение, передача параметров, обход ExecutionPolicy, получение результата и типичные ошибки.

Запуск скрипта PowerShell из 1С — типовая задача при интеграции с Windows: получить список процессов, перезагрузить службу, собрать данные о дисках, отправить почту через системные средства. 1С не имеет встроенного объекта для PowerShell, поэтому вызов выполняется через запуск внешнего процесса — интерпретатора powershell.exe с параметрами командной строки.

Есть два рабочих механизма: COM-объект WScript.Shell (работает только в толстом и тонком клиенте на Windows) и функция ЗапуститьПриложение (доступна и на сервере 1С). Выбор зависит от того, где исполняется код — на клиенте или на сервере, — и нужно ли дождаться завершения скрипта и прочитать его вывод.

Ключевые сложности, которые встречаются на практике: политика выполнения скриптов ExecutionPolicy блокирует неподписанные .ps1-файлы, пути с пробелами ломают командную строку, а асинхронный запуск не даёт получить код возврата. Ниже разобраны оба способа с готовым кодом, передачей параметров и проверкой результата.

Способ 1: запуск через WScript.Shell на клиенте

COM-объект WScript.Shell доступен в клиентском коде на Windows и даёт максимальный контроль: метод Run позволяет дождаться завершения процесса и получить код возврата. Это самый распространённый вариант для файловых баз и толстого клиента.

Оболочка = Новый COMОбъект("WScript.Shell");

Команда = "powershell.exe -NoProfile -ExecutionPolicy Bypass -File ""C:\Scripts\backup.ps1""";

КодВозврата = Оболочка.Run(Команда, 0, Истина);

Если КодВозврата = 0 Тогда

Сообщить("Скрипт выполнен успешно");

Иначе

Сообщить("Ошибка, код: " + КодВозврата);

КонецЕсли;

Параметры метода Run: командная строка, стиль окна (0 — скрытое окно, что обычно и нужно) и флаг ожидания завершения. Если третий параметр равен Истина, выполнение кода 1С блокируется до окончания работы скрипта — учитывайте это при долгих операциях, интерфейс пользователя «зависнет».

Параметр -NoProfile ускоряет запуск, отключая загрузку пользовательского профиля PowerShell, а -ExecutionPolicy Bypass снимает ограничение политики выполнения для данного конкретного вызова, не меняя системных настроек.

Способ 2: запуск через ЗапуститьПриложение

Функция ЗапуститьПриложение работает и на клиенте, и на сервере 1С (Windows и Linux), поэтому подходит для клиент-серверных баз, где логика выполняется в серверном контексте. Скрипт при этом запускается от имени пользователя службы агента сервера 1С — у этой учётной записи должны быть права на файл скрипта и выполняемые действия.

СтрокаКоманды = "powershell.exe -NoProfile -ExecutionPolicy Bypass -File ""C:\Scripts\backup.ps1""";

КодВозврата = Неопределено;

ЗапуститьПриложение(СтрокаКоманды, "C:\Scripts", Истина, КодВозврата);

Если КодВозврата = 0 Тогда

Сообщить("Готово");

Иначе

Сообщить("Код ошибки: " + КодВозврата);

КонецЕсли;

Второй параметр — рабочий каталог процесса, третий — ожидание завершения, четвёртый — переменная, в которую вернётся код возврата. В тонком клиенте ожидание завершения может быть недоступно: там ЗапуститьПриложение работает асинхронно, и для получения результата нужны обработчики оповещения либо запись результата в файл.

Для безопасного вызова из клиентского кода на управляемых формах используйте НачатьЗапускПриложения с обработчиком оповещения — это штатный асинхронный механизм, не блокирующий интерфейс.

Порядок действий
  1. 1
    Проверьте, что скрипт работает: запустите его вручную в PowerShell от имени того же пользователя
  2. 2
    Сформируйте командную строку с параметрами -NoProfile -ExecutionPolicy Bypass -File
  3. 3
    Вызовите скрипт через WScript.Shell.Run или ЗапуститьПриложение с ожиданием завершения
  4. 4
    Проверьте код возврата: 0 — успех, другое значение — ошибка
  5. 5
    Прочитайте файл с результатом или логом, если скрипт пишет вывод

Передача параметров в скрипт

Параметры передаются в командной строке после имени файла скрипта. Внутри .ps1 они доступны через блок param() или массив $args. Главная ловушка — значения с пробелами и кириллицей: каждый такой параметр нужно оборачивать в кавычки, а кавычки в строке 1С удваиваются.

ПутьКБазе = "C:\Мои документы\База";

Команда = "powershell.exe -NoProfile -ExecutionPolicy Bypass -File ""C:\Scripts\copy.ps1"" -Path """"" + ПутьКБазе + """""";

В самом скрипте параметры объявляются так:

param(

[string]$Path

)

Write-Output "Получен путь: $Path"

Для сложных данных (списки, структуры) надёжнее не передавать всё через командную строку, а записать JSON во временный файл из 1С, а в скрипте прочитать его через Get-Content и ConvertFrom-Json. Так вы избегаете проблем с экранированием и ограничением длины командной строки.

Как получить результат работы скрипта

Стандартный вывод PowerShell напрямую в 1С не возвращается — процесс работает отдельно. Практичное решение: скрипт пишет результат в файл, а 1С читает его после завершения. Для структурированных данных удобен JSON.

// В скрипте: результат | ConvertTo-Json | Out-File "C:\Temp\result.json" -Encoding UTF8

ЧтениеТекста = Новый ЧтениеТекста("C:\Temp\result.json", КодировкаТекста.UTF8);

ТекстJSON = ЧтениеТекста.Прочитать();

ЧтениеТекста.Закрыть();

ЧтениеJSON = Новый ЧтениеJSON;

ЧтениеJSON.УстановитьСтроку(ТекстJSON);

Результат = ПрочитатьJSON(ЧтениеJSON);

ЧтениеJSON.Закрыть();

Альтернатива для простых случаев — код возврата. В скрипте задайте exit 0 при успехе и ненулевой код при ошибке, тогда 1С сможет реагировать на результат без чтения файлов. Для диагностики полезно дополнительно писать лог: Start-Transcript в начале скрипта и Stop-Transcript в конце.

Контрольные точки

Как проверить результат

Код возврата процесса
Норма

Равен 0

Тревожный признак

Ненулевое значение — смотрите лог скрипта

Файл результата
Норма

Создан после завершения, содержит валидный JSON или ожидаемый текст

Тревожный признак

Файл отсутствует, пустой или содержит текст ошибки PowerShell

Лог Transcript
Норма

Команды выполнены без красных сообщений об ошибках

Тревожный признак

Сообщения об отказе в доступе или заблокированном скрипте

Решение типичных проблем

Самая частая ошибка — «выполнение сценариев отключено в этой системе». Это срабатывание политики ExecutionPolicy. Не меняйте её глобально через Set-ExecutionPolicy Unrestricted: достаточно параметра -ExecutionPolicy Bypass в строке запуска, который действует только на текущий процесс.

Вторая типичная ситуация — скрипт запускается, но не видит сетевые пути или не имеет прав. Причина в том, что процесс наследует контекст запустившего его пользователя: на сервере это учётная запись службы агента 1С (часто LOCALSYSTEM или специальная учётка), у которой нет доступа к сетевым ресурсам пользователя. Настройте права или используйте в скрипте net use / New-PSDrive с явными учётными данными.

Третья группа проблем — кодировка. Русский текст в выводе может превращаться в «кракозябры», если скрипт пишет файл в OEM-кодировке. Явно указывайте -Encoding UTF8 в Out-File и читайте файл из 1С в UTF8.

Типичные ошибки
01
Путь к скрипту с пробелами без кавычек — PowerShell получает обрезанное имя файла и завершается с ошибкой
02
Запуск WScript.Shell в серверном коде — COM-объект не создаётся, вызов падает с исключением
03
Ожидание результата при асинхронном запуске без флага ожидания — 1С читает файл результата до того, как скрипт его записал
04
Изменение глобальной ExecutionPolicy на Unrestricted — снижает защиту всего сервера вместо разового обхода
05
Права учётной записи сервера 1С не проверены — скрипт молча не выполняет сетевые операции

Выбор способа под вашу ситуацию

Если код выполняется на клиенте Windows и нужен код возврата с минимумом кода — берите WScript.Shell. Если логика серверная или требуется кроссплатформенность — только ЗапуститьПриложение. Для управляемых форм с требованием не блокировать интерфейс — НачатьЗапускПриложение с оповещением.

Сравнение вариантов

WScript.Shell.Run

Только клиент Windows. Даёт код возврата и ожидание, простой синтаксис. Не работает на сервере и в веб-клиенте

ЗапуститьПриложение

Клиент и сервер, Windows и Linux. Поддерживает ожидание и код возврата, но в тонком клиенте ожидание ограничено

НачатьЗапускПриложения

Асинхронный запуск из управляемых форм с обработчиком оповещения. Не блокирует интерфейс, но код сложнее

Во всех вариантах держите скрипты в защищённом каталоге, ограничьте права на их изменение и логируйте запуски — это упростит расследование инцидентов и предотвратит подмену скрипта.

Итог

Что важно запомнить

Скрипт PowerShell из 1С запускается как внешний процесс: WScript.Shell на клиенте, ЗапуститьПриложение на клиенте и сервере. Используйте -ExecutionPolicy Bypass точечно, передавайте параметры в кавычках, результат возвращайте через файл или код возврата и всегда проверяйте права учётной записи, под которой работает процесс.

Часто задаваемые вопросы

Можно ли выполнить команду PowerShell без файла скрипта?

Да. Используйте параметр -Command вместо -File и передайте команду строкой, например: powershell.exe -NoProfile -Command "Get-Date". Для многострочного кода применяйте -EncodedCommand с командой в Base64 (Unicode) — так не придётся бороться с экранированием кавычек.

Почему скрипт работает из командной строки, но не из 1С?

Чаще всего дело в контексте пользователя: из 1С процесс наследует права учётной записи клиента или службы сервера 1С, а не вашего интерактивного сеанса. Проверьте доступ к файлам, сетевым ресурсам и переменные окружения для этой учётной записи.

Как скрыть окно PowerShell при запуске?

В WScript.Shell.Run задайте второй параметр равным 0 — окно не отобразится. Дополнительно добавьте в командную строку параметр -WindowStyle Hidden. При запуске с сервера окна не появляются в любом случае, так как сеанс неинтерактивный.

Как передать в скрипт параметр с кириллицей и пробелами?

Оберните значение в двойные кавычки, удвоив их в строке 1С. Если проблемы сохраняются, передайте данные через временный файл в UTF-8: из 1С запишите JSON, в скрипте прочитайте его через Get-Content -Encoding UTF8 и ConvertFrom-Json.

Что делать, если ЗапуститьПриложение не ждёт завершения скрипта?

В тонком и веб-клиенте синхронное ожидание недоступно. Организуйте контроль через файл-маркер: скрипт в конце создаёт файл с результатом, а 1С периодически проверяет его появление по расписанию или через обработчик ожидания, либо используйте НачатьЗапускПриложения с оповещением о завершении.

Безопасно ли хранить пароли внутри скрипта?

Нет, открытые пароли в .ps1 — риск компрометации. Используйте защищённые строки (ConvertTo-SecureString с ключом), интегрированную аутентификацию Windows или отдельную учётную запись с минимально необходимыми правами, а доступ к файлу скрипта ограничьте на уровне NTFS.