Автоматизация · 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Проверьте, что скрипт работает: запустите его вручную в PowerShell от имени того же пользователя
- 2Сформируйте командную строку с параметрами -NoProfile -ExecutionPolicy Bypass -File
- 3Вызовите скрипт через WScript.Shell.Run или ЗапуститьПриложение с ожиданием завершения
- 4Проверьте код возврата: 0 — успех, другое значение — ошибка
- 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
Команды выполнены без красных сообщений об ошибках
Сообщения об отказе в доступе или заблокированном скрипте
Решение типичных проблем
Самая частая ошибка — «выполнение сценариев отключено в этой системе». Это срабатывание политики ExecutionPolicy. Не меняйте её глобально через Set-ExecutionPolicy Unrestricted: достаточно параметра -ExecutionPolicy Bypass в строке запуска, который действует только на текущий процесс.
Вторая типичная ситуация — скрипт запускается, но не видит сетевые пути или не имеет прав. Причина в том, что процесс наследует контекст запустившего его пользователя: на сервере это учётная запись службы агента 1С (часто LOCALSYSTEM или специальная учётка), у которой нет доступа к сетевым ресурсам пользователя. Настройте права или используйте в скрипте net use / New-PSDrive с явными учётными данными.
Третья группа проблем — кодировка. Русский текст в выводе может превращаться в «кракозябры», если скрипт пишет файл в OEM-кодировке. Явно указывайте -Encoding UTF8 в Out-File и читайте файл из 1С в UTF8.
Выбор способа под вашу ситуацию
Если код выполняется на клиенте Windows и нужен код возврата с минимумом кода — берите WScript.Shell. Если логика серверная или требуется кроссплатформенность — только ЗапуститьПриложение. Для управляемых форм с требованием не блокировать интерфейс — НачатьЗапускПриложение с оповещением.
Сравнение вариантов
Только клиент 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.