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

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

Как из 1С запустить bat-файл

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

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

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

Перед внедрением важно понимать контекст безопасности: bat-файл выполняется с правами того процесса, который его запустил. Если код работает на сервере 1С, скрипт исполняется от имени служебной учётной записи агента сервера (по умолчанию USR1CV8), у которой обычно нет доступа к сетевым ресурсам и пользовательским каталогам. Это самая частая причина «неработающего» запуска.

Какие способы запуска существуют и когда какой выбрать

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

Сравнение способов запуска

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

Рекомендуемый вариант. Работает на клиенте и сервере, поддерживает ожидание и код возврата. Ограничение: на тонком клиенте требуется разрешение пользователя на запуск приложений.

КомандаСистемы()

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

WScript.Shell (COM)

Позволяет скрыть окно и прочитать вывод скрипта. Ограничение: только Windows, только там, где разрешены COM-объекты (толстый клиент или сервер).

Выбор сводится к трём вопросам: где исполняется код, нужно ли ждать окончания скрипта и нужен ли результат. Если код выполняется на сервере в фоновом задании — используйте ЗапуститьПриложение с ожиданием. Если нужно перехватить текст, который bat-файл пишет в консоль, — только WScript.Shell с методом Exec.

Запуск через ЗапуститьПриложение: базовый пример

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

bsl
Процедура ЗапуститьПакетныйФайл()
	ПутьКФайлу = "C:\Scripts\export.bat";
	КодВозврата = Неопределено;
	СтрокаКоманды = "cmd.exe /c """" + ПутьКФайлу + """"";
	ЗапуститьПриложение(СтрокаКоманды, "C:\Scripts", Истина, КодВозврата);
	Если КодВозврата = 0 Тогда
		Сообщить("Скрипт выполнен успешно");
	Иначе
		Сообщить("Ошибка выполнения, код: " + КодВозврата);
	КонецЕсли;
КонецПроцедуры

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

Если bat-файлу нужны аргументы, их дописывают в строку команды после пути, каждый аргумент с пробелами — тоже в кавычках. Внутри скрипта они доступны как %1, %2 и так далее.

Порядок действий для первого запуска
  1. 1
    Создайте тестовый bat-файл с командой echo OK > C:\Scripts\test.txt
  2. 2
    Проверьте его работу вручную из командной строки под той же учётной записью
  3. 3
    Напишите процедуру в 1С с вызовом ЗапуститьПриложение и ожиданием завершения
  4. 4
    Проверьте код возврата и наличие файла test.txt
  5. 5
    Перенесите вызов в рабочий сценарий и добавьте обработку ошибок через Попытка/Исключение

Запуск через КомандаСистемы

Метод КомандаСистемы(СтрокаКоманды, ТекущийКаталог) — унаследованный способ, который встречается в старых конфигурациях и типовых обработках. Он выполняет команду через системный интерпретатор и не требует явного вызова cmd.exe для bat-файлов, хотя явный вызов надёжнее.

bsl
Процедура ЗапускЧерезКомандуСистемы()
	КомандаСистемы("cmd.exe /c ""C:\Scripts\backup.bat""", "C:\Scripts");
КонецПроцедуры

Главное ограничение метода — он не предоставляет удобного способа получить код возврата и управлять видимостью окна. На клиенте при вызове появляется окно консоли, что для пользователя выглядит как мерцание. Если вы пишете новый код, предпочтительнее ЗапуститьПриложение; КомандаСистемы разумно использовать только при доработке решений, где он уже применяется.

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

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

bsl
Процедура ЗапускСЧтениемВывода()
	Shell = Новый COMОбъект("WScript.Shell");
	Результат = Shell.Exec("cmd.exe /c C:\Scripts\report.bat");
	Пока Результат.Status = 0 Цикл
	КонецЦикла;
	Вывод = Результат.StdOut.ReadAll();
	КодЗавершения = Результат.ExitCode;
	Сообщить("Код: " + КодЗавершения + ", вывод: " + Вывод);
КонецПроцедуры

Этот подход незаменим, когда bat-файл формирует диагностическую информацию, которую нужно сохранить в журнале регистрации или показать пользователю. Ограничения существенные: COM-объекты недоступны на тонком и веб-клиенте, работают только под Windows, а на сервере требуют, чтобы учётная запись агента имела право создавать COM-объекты. Если конфигурация должна работать на Linux-сервере 1С, этот способ неприменим — там запускают shell-скрипты через ЗапуститьПриложение.

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

Код возврата 0 по соглашению означает успешное завершение, любое другое значение — ошибку. Внутри bat-файла код задаётся командой exit /b N. Если скрипт не содержит явного exit, он возвращает код последней выполненной команды, что может вводить в заблуждение: например, успешный echo после неудачного копирования «обнулит» ошибку.

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

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

Код возврата
Норма

Равен 0, переменная заполнена

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

Неопределено или ненулевое значение — скрипт не стартовал или завершился с ошибкой

Файл-результат работы скрипта
Норма

Файл создан, время изменения совпадает с моментом запуска

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

Файл отсутствует или устарел — скрипт не выполнился до конца

Журнал регистрации 1С
Норма

Нет ошибок вызова внешних приложений

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

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

Ручной запуск того же bat-файла
Норма

Из командной строки под той же учётной записью работает

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

Ошибка воспроизводится и вручную — проблема в самом скрипте или правах

Надёжный приём — заставить bat-файл по завершении создавать файл-маркер с результатом (например, записывать код ошибки в текстовый файл), а из 1С читать этот файл. Это работает даже при асинхронном запуске без ожидания и упрощает диагностику в фоновых заданиях, где нет интерактивного вывода.

Права, контекст выполнения и типичные проблемы

Когда код выполняется на сервере 1С, bat-файл запускается от имени учётной записи агента сервера. У этой записи, как правило, нет доступа к сетевым путям вида \\server\share, к профилям пользователей и к дискам, подключённым интерактивно (буквы сетевых дисков для неё не существуют). Скрипт, отлично работающий у разработчика, на сервере молча завершается ошибкой.

Вторая группа проблем — пути и кодировки. Пробелы в путях решаются кавычками, русские буквы в именах файлов — обычно работают, но вывод консоли в кодировке OEM (CP866) при чтении через COM может отображаться кракозябрами; в самом bat-файле это лечится командой chcp 65001 или chcp 1251 в начале скрипта. Третья группа — блокировки антивируса: некоторые защитные решения приостанавливают запуск bat-файлов из нестандартных процессов, что проявляется как «зависание» при ожидании завершения.

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

Асинхронный запуск и фоновые задания

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

Альтернатива для простых случаев — запуск без ожидания (Ложь в третьем параметре) с последующей периодической проверкой появления файла-результата через ПодключитьОбработчикОжидания. Это проще в реализации, но менее надёжно: если скрипт упадёт, не создав маркер, проверка будет крутиться бесконечно, поэтому всегда задавайте предельное время ожидания.

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

Как выбрать сценарий запуска

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

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

Почему ЗапуститьПриложение не запускает bat-файл и не выдаёт ошибку?

Чаще всего срабатывает режим защиты от опасных действий: на клиенте платформа молча блокирует запуск или ждёт подтверждения пользователя. Проверьте настройки пользователя (флажок «Защита от опасных действий»), а на сервере — профиль безопасности кластера. Также убедитесь, что путь к файлу существует именно в том контексте, где выполняется код: сервер не видит локальные диски клиента.

Как передать параметры в bat-файл из 1С?

Допишите аргументы в строку команды после пути к файлу, заключая каждый аргумент с пробелами в кавычки. Внутри bat-файла они доступны как %1, %2 и далее. Не подставляйте в параметры непроверенный пользовательский ввод — это создаёт риск внедрения произвольных команд.

Можно ли запустить bat-файл без чёрного окна консоли?

Да, через COM-объект WScript.Shell: метод Run с параметром стиля окна, равным 0, скрывает консоль полностью. Штатный ЗапуститьПриложение такой настройки не имеет — окно cmd появится, хотя при быстром скрипте оно лишь мелькнёт.

Как узнать, что скрипт завершился с ошибкой, если запуск без ожидания?

Организуйте обмен через файл: в конце bat-файла запишите код завершения в текстовый файл командой вида echo %ERRORLEVEL% > result.txt, а из 1С периодически проверяйте его наличие и содержимое. Обязательно ограничьте время ожидания, чтобы при падении скрипта проверка не продолжалась бесконечно.

Работает ли запуск bat-файла в файловой базе и через веб-клиент?

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

Что делать, если скрипт на сервере не видит сетевую папку?

Используйте полный UNC-путь (\\сервер\ресурс) вместо буквы диска и выдайте учётной записи агента сервера 1С явные права на этот ресурс. Альтернатива — запуск агента под выделенной доменной учётной записью с необходимыми доступами, что требует согласования с администратором сети.

Итог

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

Основной инструмент — ЗапуститьПриложение с вызовом cmd.exe /c, кавычками вокруг путей и проверкой кода возврата. Для долгих скриптов используйте фоновые задания, для чтения вывода — WScript.Shell. Большинство проблем связано с правами служебной учётной записи сервера и с режимом защиты от опасных действий, а не с самим кодом.