Разработка и Конфигурация · 11 мин
Как запустить внешнюю программу из 1С
Запуск внешней программы из 1С: метод ЗапуститьПриложение, Shell, WScript.Shell, ожидание завершения, работа с параметрами и типичные ошибки.
Запуск внешней программы из 1С — типовая задача автоматизации: открыть Excel с выгруженным отчётом, вызвать архиватор для упаковки файлов, запустить скрипт обмена данными или стороннюю утилиту конвертации. В зависимости от версии платформы (7.7, 8.2, 8.3), режима работы (толстый или тонкий клиент, веб-клиент) и места исполнения кода (клиент или сервер) применяются разные методы, и выбор неправильного приводит к ошибкам или полному отказу механизма.
Основной инструмент в современных версиях платформы — метод ЗапуститьПриложение() и его асинхронный вариант НачатьЗапускПриложения(). В устаревших решениях и при необходимости тонкого управления используют COM-объект WScript.Shell. Каждый подход имеет свои ограничения по безопасности, ожиданию завершения и работе в веб-клиенте.
Перед реализацией важно определить три вещи: где должен запускаться процесс (на компьютере пользователя или на сервере 1С), нужно ли дожидаться завершения программы и требуется ли передавать параметры командной строки. От ответов зависит вся архитектура решения.
Выбор способа запуска: где исполняется код и что нужно получить
Первый вопрос — место запуска. Если код выполняется в клиентской процедуре (директива &НаКлиенте), программа стартует на компьютере пользователя под его учётной записью. Если код серверный (&НаСервере), процесс запустится на сервере 1С под учётной записью агента сервера — у него обычно нет доступа к сетевым дискам пользователя и нет интерактивного рабочего стола, поэтому GUI-приложения там бесполезны.
Второй вопрос — режим ожидания. Без ожидания 1С запускает программу и сразу продолжает выполнение кода. С ожиданием выполнение приостанавливается до закрытия внешнего процесса, и можно получить код возврата. Ожидание нужно, когда следующий шаг зависит от результата — например, сначала архиватор создаёт файл, затем 1С его отправляет.
Как выбрать способ
Метод ЗапуститьПриложение: синхронный запуск
Метод ЗапуститьПриложение() доступен в толстом и тонком клиенте, а также на сервере. Синтаксис: ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата). Первый параметр — полная команда запуска, включая путь к исполняемому файлу и аргументы.
Типовой пример — запуск архиватора с ожиданием:
КодВозврата = Неопределено;
Команда = """C:\Program Files\7-Zip\7z.exe"" a ""D:\backup\base.zip"" ""D:\backup\data\*""";
ЗапуститьПриложение(Команда, "D:\backup", Истина, КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Архив создан успешно");
Иначе
Сообщить("Ошибка архивации, код: " + КодВозврата);
КонецЕсли;
Обратите внимание на удвоенные кавычки внутри строки — так в языке 1С экранируется кавычка. Каждый путь, содержащий пробелы, должен быть обёрнут в кавычки, иначе система разобьёт его на отдельные аргументы. Код возврата 0 у большинства консольных утилит означает успешное завершение, ненулевое значение — ошибку, но конкретные коды нужно смотреть в документации запускаемой программы.
ЗапуститьПриложение("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), которую нужно учитывать при чтении русского текста.
Проверка результата и диагностика проблем
Минимальная проверка — анализ кода возврата. Но код 0 ещё не гарантирует бизнес-результат: утилита могла успешно завершиться, не создав файл из-за нехватки места. Поэтому после ожидания завершения проверяйте фактический результат — существование выходного файла, его размер, время изменения.
Если запуск «не работает», последовательно проверьте: существует ли исполняемый файл по указанному пути (проверка через Файл.Существует()), есть ли у учётной записи права на его выполнение, не блокирует ли антивирус запуск дочерних процессов из 1С. Для диагностики полезно временно заменить команду на cmd /c команда > C:\log.txt 2>&1 и прочитать сохранённый вывод ошибок.
Как проверить результат
0 или ожидаемое программой значение успеха
Ненулевой код или пустое значение при ожидании
Файл существует, размер больше нуля, время изменения свежее
Файл отсутствует или не обновился
Процесс появляется и завершается
Процесс висит — программа ждёт ввода или упала в диалог ошибки
Альтернативы прямому запуску
Не всегда запуск внешней программы — лучшее решение. Если задача — обмен данными, рассмотрите HTTP-сервисы и веб-сервисы: внешняя система сама забирает или принимает данные без запуска процессов. Для регулярных операций надёжнее планировщик Windows, который запускает утилиту независимо от 1С, а 1С лишь забирает готовый результат.
Для интеграции с офисными пакетами вместо запуска exe часто используют COM-подключение (Новый COMОбъект("Excel.Application")) — это даёт полный контроль над документом без видимого окна. А простые операции с файлами (копирование, архивация средствами платформы через ЗаписьZipФайла) вообще не требуют внешних программ.
Сравнение подходов
Универсально, работает на клиенте и сервере; нет чтения вывода и скрытого режима
Единственный вариант для асинхронного и веб-клиента; усложняет логику оповещениями
Скрытый запуск и чтение StdOut; только Windows, не работает в веб-клиенте
Надёжнее для постоянных интеграций; требуют разработки и развёртывания
Частые вопросы
Как запустить программу и дождаться её завершения в 1С 8.3?
Вызовите ЗапуститьПриложение(Команда, , Истина, КодВозврата) — третий параметр Истина включает ожидание, в четвёртый вернётся код завершения. В управляемых формах в асинхронном режиме используйте НачатьЗапускПриложения() с параметром ожидания Истина и обработкой результата в оповещении.
Почему программа запускается на клиенте, но не на сервере?
Серверный код исполняется под учётной записью агента сервера 1С. У неё может не быть прав на исполняемый файл, доступа к сетевым путям пользователя и интерактивного рабочего стола. Проверьте права учётной записи службы и используйте локальные пути сервера.
Как открыть файл в программе по умолчанию?
Передайте путь к файлу как команду: ЗапуститьПриложение("C:\Документы\отчёт.xlsx"). Операционная система сама определит ассоциированное приложение. Аналогично открываются URL в браузере по умолчанию.
Как скрыть окно консольной программы?
Штатные методы 1С не управляют видимостью окна. Используйте WScript.Shell: Shell.Run("program.exe", 0, Истина) — второй параметр 0 скрывает окно, третий включает ожидание. Учтите, что способ недоступен в веб-клиенте и на Linux.
Можно ли запустить программу из веб-клиента?
Да, но только методом НачатьЗапускПриложения() при подключённом расширении работы с файлами. Пользователь увидит предупреждение безопасности браузера. COM-объекты и синхронный запуск в веб-клиенте недоступны.
Что делать, если ЗапуститьПриложение выдаёт ошибку «Файл не обнаружен»?
Проверьте полный путь к exe через Файл.Существует(), убедитесь, что путь с пробелами обёрнут в кавычки (в строке 1С кавычки удваиваются), и что команда не содержит лишних переносов строк. Часто причина — относительный путь вместо абсолютного.
Что важно запомнить
Выбирайте метод по месту исполнения и режиму: ЗапуститьПриложение для синхронного запуска, НачатьЗапускПриложения для асинхронного и веб-клиента, WScript.Shell для скрытого запуска и чтения вывода. Всегда используйте полные пути в кавычках, проверяйте код возврата и фактический результат, не запускайте GUI-программы на сервере и не подставляйте пользовательский ввод в командную строку без проверки.