Разработка и Конфигурация · 13 мин
Как запустить внешнее приложение из 1С
Как запустить внешнее приложение из 1С: ЗапуститьПриложение, КомандаСистемы, ожидание завершения, работа с параметрами, типичные ошибки и безопасные практики.
Запуск внешнего приложения из 1С — типовая задача интеграции: открыть Excel с готовым файлом, вызвать архиватор, выполнить скрипт обмена данными, запустить утилиту банковского клиента или сканер. Во встроенном языке для этого предусмотрены несколько механизмов, которые различаются местом выполнения (клиент или сервер), возможностью дождаться завершения процесса и требованиями к безопасности.
Выбор способа зависит от режима работы конфигурации. В тонком и веб-клиенте действуют ограничения безопасности: запуск произвольных программ на клиентской машине возможен только после подтверждения пользователя или при соответствующих настройках. На сервере запуск внешних процессов требует аккуратности, поскольку выполняется под учётной записью службы агента сервера 1С и может повлиять на стабильность всего кластера.
Ниже разобраны основные методы — ЗапуститьПриложение, НачатьЗапускПриложения, КомандаСистемы и WScript.Shell, а также практические вопросы: передача параметров, ожидание завершения, получение кода возврата, типичные ошибки и меры безопасности.
Какие способы запуска внешних программ есть в 1С
Платформа 1С:Предприятие предлагает несколько инструментов, и они не взаимозаменяемы в полной мере. Основные варианты:
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата)— синхронный или асинхронный запуск с возможностью ожидания и получения кода возврата.НачатьЗапускПриложения(ОписаниеОповещения, СтрокаКоманды, ...)— асинхронный вариант, рекомендуемый для тонкого и веб-клиента, где модальное ожидание запрещено.КомандаСистемы(СтрокаКоманды, ТекущийКаталог)— выполнение команды через командный интерпретатор ОС, удобно для конвейеров и перенаправления вывода.ЗапуститьСистему— запуск другой информационной базы 1С, а не произвольного приложения.- COM-объект
WScript.Shellс методом Run — только в толстом клиенте и на сервере Windows, где доступна COM-технология.
В тонком клиенте большинство синхронных методов работы с файловой системой и запуска программ требуют установки расширения работы с файлами и вызывают у пользователя диалог подтверждения. Если конфигурация работает в режиме управляемого приложения, ориентируйтесь в первую очередь на асинхронные вызовы.
Сравнение способов запуска
Универсальный метод; поддерживает ожидание завершения и код возврата. В тонком клиенте требует подтверждения пользователя.
Асинхронный запуск с оповещением о завершении; подходит для тонкого и веб-клиента, не блокирует интерфейс.
Запуск через командную оболочку ОС; удобен для конвейеров и перенаправления вывода, работает на клиенте и сервере.
Гибкий контроль окна и ожидания; доступен только там, где поддерживается COM — толстый клиент и сервер под Windows.
Запуск приложения на клиенте: ЗапуститьПриложение
Метод ЗапуститьПриложение доступен в тонком, толстом и веб-клиенте, а также на сервере. Простейший пример — открыть файл в ассоциированной программе:
ЗапуститьПриложение("C:\Отчеты\Реестр.xlsx");
Если нужно запустить конкретную программу с параметрами, командная строка формируется целиком. Пути, содержащие пробелы, обязательно заключаются в кавычки:
СтрокаКоманды = """C:\Program Files\7-Zip\7z.exe"" a ""D:\Архив\backup.zip"" ""D:\Данные\.""";
ЗапуститьПриложение(СтрокаКоманды);
Второй параметр — рабочий каталог процесса. Он важен, когда внешняя программа ищет свои файлы относительно текущей папки. Если каталог не указан, процесс унаследует каталог вызывающего приложения, что часто становится причиной ошибок «файл не найден».
Ожидание завершения и код возврата
Третий параметр ДождатьсяЗавершения переводит вызов в синхронный режим: выполнение кода 1С приостановится до окончания внешнего процесса. Четвёртый параметр — переменная, в которую платформа поместит код возврата:
КодВозврата = Неопределено;
ЗапуститьПриложение(СтрокаКоманды, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
Сообщить("Внешняя программа завершилась с ошибкой: " + КодВозврата);
КонецЕсли;
Соглашение о кодах возврата задаёт сама внешняя программа, но общепринято, что 0 — успешное завершение, ненулевое значение — ошибка. Перед анализом кода убедитесь в документации запускаемой утилиты, какие значения она возвращает.
Учтите, что синхронное ожидание блокирует интерфейс пользователя. Если внешняя программа может работать долго, лучше использовать асинхронный запуск с оповещением.
Асинхронный запуск: НачатьЗапускПриложения
В управляемых формах, где модальные вызовы запрещены или нежелательны, используется НачатьЗапускПриложения. Метод принимает описание оповещения — процедуру, которая будет вызвана после завершения процесса:
&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияПриложения", ЭтотОбъект);
НачатьЗапускПриложения(Оповещение, СтрокаКоманды, , Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗавершенияПриложения(КодВозврата, ДопПараметры) Экспорт
Если КодВозврата = 0 Тогда
ПоказатьОповещениеПользователя("Обработка завершена успешно");
Иначе
ПоказатьПредупреждение(, "Ошибка, код: " + КодВозврата);
КонецЕсли;
КонецПроцедуры
Четвёртый параметр Истина означает, что оповещение придёт именно после завершения процесса, а не сразу после его запуска. Такой подход не блокирует интерфейс и корректно работает в тонком клиенте.
- 1Сформируйте строку команды, заключив пути с пробелами в кавычки
- 2Создайте ОписаниеОповещения на процедуру обработки результата
- 3Вызовите НачатьЗапускПриложения с параметром ожидания Истина
- 4В процедуре оповещения проверьте код возврата и сообщите результат пользователю
- 5Убедитесь, что на клиенте установлено расширение работы с файлами, иначе вызов завершится ошибкой
Запуск на сервере и через командную оболочку
Когда обработка выполняется на сервере (фоновое задание, регламентная операция, серверная процедура), запуск внешней программы выполняется на серверном компьютере под учётной записью агента сервера 1С. Это принципиально: у этой учётной записи должны быть права на исполняемый файл и все используемые каталоги.
Метод КомандаСистемы выполняет команду через интерпретатор ОС (cmd.exe в Windows, sh в Linux) и возвращает код завершения:
КодВозврата = КомандаСистемы("cmd /c ""D:\Scripts\export.bat"" > ""D:\Logs\export.log"" 2>&1");
Если КодВозврата <> 0 Тогда
ЗаписьЖурналаРегистрации("Обмен", УровеньЖурналаРегистрации.Ошибка, , ,
"Внешняя команда завершилась с кодом " + КодВозврата);
КонецЕсли;
Перенаправление вывода в файл — практичный способ получить диагностику, потому что напрямую читать stdout внешнего процесса штатными средствами нельзя. На Linux-сервере синтаксис перенаправления аналогичный, но учитывайте экранирование и права доступа.
Для толстого клиента и сервера под Windows доступен COM-объект WScript.Shell, который позволяет управлять видимостью окна и ожиданием:
Shell = Новый COMОбъект("WScript.Shell");
КодВозврата = Shell.Run("notepad.exe", 1, Истина);
Работа с параметрами и путями
Большинство проблем при запуске внешних программ связано не с самим вызовом, а с формированием командной строки. Основные правила:
- Путь к исполняемому файлу и каждый аргумент с пробелами заключайте в двойные кавычки; в строковом литерале 1С кавычка удваивается.
- Не полагайтесь на PATH: указывайте полный путь к exe, особенно при запуске на сервере, где переменные окружения службы отличаются от пользовательских.
- Разделители путей различаются в Windows и Linux; если решение кроссплатформенное, формируйте пути через системные функции и проверяйте тип платформы.
- Русские буквы в путях обычно не мешают, но некоторые внешние утилиты некорректно обрабатывают юникодные аргументы — проверяйте на тестовом запуске.
Если нужно открыть файл в программе по умолчанию без указания конкретного exe, достаточно передать путь к файлу — платформа делегирует открытие операционной системе. Это удобно для просмотра сформированных отчётов и PDF.
КодВозврата = Неопределено;
СтрокаКоманды = """C:\Tools\converter.exe"" /in ""%1"" /out ""%2""";
СтрокаКоманды = СтрЗаменить(СтрокаКоманды, "%1", ПутьВход);
СтрокаКоманды = СтрЗаменить(СтрокаКоманды, "%2", ПутьВыход);
ЗапуститьПриложение(СтрокаКоманды, , Истина, КодВозврата);Проверка результата и типичные ошибки
После запуска проверяйте не только факт отсутствия исключения, но и код возврата и наличие ожидаемого результата — созданного файла, записи в логе, изменения данных. Успешный старт процесса не гарантирует успешного завершения его работы.
Отдельная категория проблем — диалоги безопасности. Если в тонком клиенте пользователь отвечает «Нет» в диалоге подтверждения запуска, вызов завершится ошибкой, которую нужно обработать через попытку/исключение или проверку результата асинхронного вызова.
Как проверить результат
0 или иное задокументированное значение успеха
Ненулевой код либо Неопределено при ожидании завершения
Файл существует, имеет ненулевой размер и свежую дату изменения
Файл отсутствует, пустой или со старой датой
Запущенный процесс завершился и не остался в памяти
Копятся зависшие экземпляры программы
Безопасность и ограничения
Запуск внешних приложений — потенциально опасная операция, поэтому платформа и ОС накладывают ограничения. В файловом режиме запуск на клиенте выполняется от имени текущего пользователя и ограничен его правами. В клиент-серверном режиме серверный запуск идёт от учётной записи службы агента, которой обычно запрещён интерактивный вход и доступ к сетевым ресурсам без дополнительной настройки.
Рекомендуемые меры: храните пути к внешним утилитам в настройках конфигурации, а не зашивайте в код; валидируйте все данные, попадающие в командную строку; логируйте факт запуска, параметры и код возврата в журнал регистрации; ограничьте права на функции запуска через роли, чтобы рядовой пользователь не мог выполнить произвольную команду.
Если требуется регулярный обмен с внешней системой, рассмотрите альтернативы запуску программ: файловый обмен через каталог, HTTP-сервисы, COM-соединение с другой базой 1С или внешние компоненты. Они управляемее и безопаснее, чем вызов exe.
Что важно запомнить
На клиенте используйте ЗапуститьПриложение или асинхронный НачатьЗапускПриложения, на сервере — ЗапуститьПриложение или КомандаСистемы. Всегда заключайте пути в кавычки, проверяйте код возврата и фактический результат, не запускайте GUI-программы на сервере и не передавайте в командную строку непроверенный ввод.
Частые вопросы
Как запустить bat-файл из 1С и дождаться его выполнения?
Передайте путь к bat-файлу в ЗапуститьПриложение с параметром ДождатьсяЗавершения = Истина либо выполните его через КомандаСистемы. Для надёжности запускайте через cmd /c с полным путём, а вывод перенаправляйте в лог-файл — так проще диагностировать ошибки внутри скрипта.
Почему ЗапуститьПриложение не работает в тонком клиенте?
Чаще всего не установлено расширение работы с файлами, либо пользователь отклонил диалог подтверждения запуска. Проверьте наличие расширения методом ПодключитьРасширениеРаботыСФайлами и обработайте отказ пользователя через оповещение или исключение.
Как получить текст, который внешняя программа выводит в консоль?
Штатного чтения stdout в платформе нет. Стандартное решение — перенаправить вывод в файл через символы > и 2>&1 в командной строке, а затем прочитать этот файл средствами ЧтениеТекста после завершения процесса.
Можно ли запустить приложение на компьютере пользователя, если обработка выполняется на сервере?
Нет, серверный код запускает процесс только на сервере. Чтобы стартовать программу на клиентской машине, вынесите вызов в клиентскую процедуру формы или передайте управление на клиента через оповещение из серверной логики.
Запускаю программу на сервере — процесс стартует, но ничего не происходит. В чём причина?
Типичные причины: у учётной записи агента сервера нет прав на каталоги программы или сетевой ресурс; программа ожидает интерактивный ввод в невидимой сессии; относительные пути не совпадают с рабочим каталогом. Проверьте права, задайте рабочий каталог явно и соберите вывод в лог-файл.
Чем КомандаСистемы отличается от ЗапуститьПриложение?
КомандаСистемы выполняет строку через командный интерпретатор ОС, поэтому поддерживает конвейеры, перенаправление вывода и встроенные команды оболочки, и всегда дожидается завершения. ЗапуститьПриложение запускает программу напрямую и позволяет выбирать между синхронным и асинхронным режимом.