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

Разработка и Конфигурация · 11 мин

Как запустить внешнюю программу из 1С

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

Запуск внешней программы из 1С — типовая задача автоматизации: открыть Excel с выгруженным отчётом, вызвать архиватор для упаковки файлов, запустить скрипт обмена данными или стороннюю утилиту конвертации. В зависимости от версии платформы (7.7, 8.2, 8.3), режима работы (толстый или тонкий клиент, веб-клиент) и места исполнения кода (клиент или сервер) применяются разные методы, и выбор неправильного приводит к ошибкам или полному отказу механизма.

Основной инструмент в современных версиях платформы — метод ЗапуститьПриложение() и его асинхронный вариант НачатьЗапускПриложения(). В устаревших решениях и при необходимости тонкого управления используют COM-объект WScript.Shell. Каждый подход имеет свои ограничения по безопасности, ожиданию завершения и работе в веб-клиенте.

Перед реализацией важно определить три вещи: где должен запускаться процесс (на компьютере пользователя или на сервере 1С), нужно ли дожидаться завершения программы и требуется ли передавать параметры командной строки. От ответов зависит вся архитектура решения.

Выбор способа запуска: где исполняется код и что нужно получить

Первый вопрос — место запуска. Если код выполняется в клиентской процедуре (директива &НаКлиенте), программа стартует на компьютере пользователя под его учётной записью. Если код серверный (&НаСервере), процесс запустится на сервере 1С под учётной записью агента сервера — у него обычно нет доступа к сетевым дискам пользователя и нет интерактивного рабочего стола, поэтому GUI-приложения там бесполезны.

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

Маршрут решения

Как выбрать способ

Нужно просто открыть файл или программу на компьютере пользователяИспользуйте ЗапуститьПриложение() или НачатьЗапускПриложения() на клиенте
Нужно дождаться завершения и получить код возвратаЗапуститьПриложение() с параметром ДождатьсяЗавершения = Истина
Нужен скрытый запуск и чтение текстового вывода консолиИспользуйте WScript.Shell с методом Exec
Код работает в веб-клиентеТолько НачатьЗапускПриложения() после подключения расширения работы с файлами

Метод ЗапуститьПриложение: синхронный запуск

Метод ЗапуститьПриложение() доступен в толстом и тонком клиенте, а также на сервере. Синтаксис: ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата). Первый параметр — полная команда запуска, включая путь к исполняемому файлу и аргументы.

Типовой пример — запуск архиватора с ожиданием:

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

Команда = """C:\Program Files\7-Zip\7z.exe"" a ""D:\backup\base.zip"" ""D:\backup\data\*""";

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

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

Сообщить("Архив создан успешно");

Иначе

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

КонецЕсли;

Обратите внимание на удвоенные кавычки внутри строки — так в языке 1С экранируется кавычка. Каждый путь, содержащий пробелы, должен быть обёрнут в кавычки, иначе система разобьёт его на отдельные аргументы. Код возврата 0 у большинства консольных утилит означает успешное завершение, ненулевое значение — ошибку, но конкретные коды нужно смотреть в документации запускаемой программы.

bsl
ЗапуститьПриложение("notepad.exe ""C:\Отчёты\итог.txt""", , Истина, КодВозврата);

НачатьЗапускПриложения: асинхронный вариант для тонкого и веб-клиента

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

&НаКлиенте

Процедура ЗапуститьКонвертер(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияКонвертации", ЭтотОбъект);

НачатьЗапускПриложения(Оповещение, "C:\Tools\converter.exe /auto", "C:\Tools", Истина);

КонецПроцедуры

&НаКлиенте

Процедура ПослеЗавершенияКонвертации(КодВозврата, ДопПараметры) Экспорт

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

ПоказатьПредупреждение(, "Конвертация завершена");

КонецЕсли;

КонецПроцедуры

В веб-клиенте запуск внешних приложений возможен только при установленном расширении работы с файлами, и пользователь получит предупреждение системы безопасности. Перед запуском стоит программно проверить подключение расширения методом НачатьПодключениеРасширенияРаботыСФайлами(), иначе вызов завершится ошибкой.

Запуск через WScript.Shell: скрытый запуск и чтение вывода

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

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

Exec = Shell.Exec("cmd /c ping 10.0.0.1 -n 2");

Пока Exec.Status = 0 Цикл

КонецЦикла;

Вывод = Exec.StdOut.ReadAll();

Сообщить(Вывод);

Метод Run объекта WScript.Shell позволяет указать стиль окна (0 — скрытое) и флаг ожидания: Shell.Run("program.exe", 0, Истина). Это удобно для фоновых утилит, которые не должны мелькать окном перед пользователем.

Ограничения существенные: COM-объекты недоступны в веб-клиенте и на Linux-сервере, а в файловом режиме под тонким клиентом создание COM-объекта может быть заблокировано настройками безопасности. Кроме того, антивирусы иногда блокируют создание WScript.Shell из сторонних процессов.

Передача параметров и работа с путями

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

Для передачи файла в программу по умолчанию (открыть PDF в ассоциированной программе) достаточно передать сам файл как команду: ЗапуститьПриложение("C:\Документы\счёт.pdf") — Windows сама найдёт приложение. Для открытия URL в браузере аналогично передают адрес.

Если внешняя программа должна вернуть данные в 1С, самый надёжный канал — файл: программа пишет результат во временный файл, 1С после завершения его читает. Прямой разбор StdOut через WScript.Shell работает, но чувствителен к кодировке консоли (обычно CP866), которую нужно учитывать при чтении русского текста.

Типичные ошибки
01
Путь с пробелами без кавычек — система ищет программу 'C:\Program' и выдаёт ошибку запуска
02
Ожидание завершения на клиенте в асинхронном режиме — платформа выдаёт ошибку о недопустимости синхронного вызова
03
Запуск GUI-программы на сервере — процесс стартует без видимого окна и зависает, блокируя сеанс
04
Игнорирование кода возврата — внешняя программа завершилась с ошибкой, а 1С продолжает работать с несуществующим результатом
05
Использование относительных путей — рабочий каталог 1С непредсказуем, всегда указывайте полные пути

Проверка результата и диагностика проблем

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

Если запуск «не работает», последовательно проверьте: существует ли исполняемый файл по указанному пути (проверка через Файл.Существует()), есть ли у учётной записи права на его выполнение, не блокирует ли антивирус запуск дочерних процессов из 1С. Для диагностики полезно временно заменить команду на cmd /c команда > C:\log.txt 2>&1 и прочитать сохранённый вывод ошибок.

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

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

Код возврата внешней программы
Норма

0 или ожидаемое программой значение успеха

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

Ненулевой код или пустое значение при ожидании

Выходной файл после завершения
Норма

Файл существует, размер больше нуля, время изменения свежее

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

Файл отсутствует или не обновился

Процесс в диспетчере задач
Норма

Процесс появляется и завершается

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

Процесс висит — программа ждёт ввода или упала в диалог ошибки

Альтернативы прямому запуску

Не всегда запуск внешней программы — лучшее решение. Если задача — обмен данными, рассмотрите HTTP-сервисы и веб-сервисы: внешняя система сама забирает или принимает данные без запуска процессов. Для регулярных операций надёжнее планировщик Windows, который запускает утилиту независимо от 1С, а 1С лишь забирает готовый результат.

Для интеграции с офисными пакетами вместо запуска exe часто используют COM-подключение (Новый COMОбъект("Excel.Application")) — это даёт полный контроль над документом без видимого окна. А простые операции с файлами (копирование, архивация средствами платформы через ЗаписьZipФайла) вообще не требуют внешних программ.

Сравнение подходов

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

Универсально, работает на клиенте и сервере; нет чтения вывода и скрытого режима

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

Единственный вариант для асинхронного и веб-клиента; усложняет логику оповещениями

WScript.Shell

Скрытый запуск и чтение StdOut; только Windows, не работает в веб-клиенте

Внешние компоненты / HTTP

Надёжнее для постоянных интеграций; требуют разработки и развёртывания

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

Как запустить программу и дождаться её завершения в 1С 8.3?

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

Почему программа запускается на клиенте, но не на сервере?

Серверный код исполняется под учётной записью агента сервера 1С. У неё может не быть прав на исполняемый файл, доступа к сетевым путям пользователя и интерактивного рабочего стола. Проверьте права учётной записи службы и используйте локальные пути сервера.

Как открыть файл в программе по умолчанию?

Передайте путь к файлу как команду: ЗапуститьПриложение("C:\Документы\отчёт.xlsx"). Операционная система сама определит ассоциированное приложение. Аналогично открываются URL в браузере по умолчанию.

Как скрыть окно консольной программы?

Штатные методы 1С не управляют видимостью окна. Используйте WScript.Shell: Shell.Run("program.exe", 0, Истина) — второй параметр 0 скрывает окно, третий включает ожидание. Учтите, что способ недоступен в веб-клиенте и на Linux.

Можно ли запустить программу из веб-клиента?

Да, но только методом НачатьЗапускПриложения() при подключённом расширении работы с файлами. Пользователь увидит предупреждение безопасности браузера. COM-объекты и синхронный запуск в веб-клиенте недоступны.

Что делать, если ЗапуститьПриложение выдаёт ошибку «Файл не обнаружен»?

Проверьте полный путь к exe через Файл.Существует(), убедитесь, что путь с пробелами обёрнут в кавычки (в строке 1С кавычки удваиваются), и что команда не содержит лишних переносов строк. Часто причина — относительный путь вместо абсолютного.

Итог

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

Выбирайте метод по месту исполнения и режиму: ЗапуститьПриложение для синхронного запуска, НачатьЗапускПриложения для асинхронного и веб-клиента, WScript.Shell для скрытого запуска и чтения вывода. Всегда используйте полные пути в кавычках, проверяйте код возврата и фактический результат, не запускайте GUI-программы на сервере и не подставляйте пользовательский ввод в командную строку без проверки.