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

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

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

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

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

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

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

Какие способы запуска bat-файла существуют в 1С

Платформа 1С не имеет отдельной команды «запустить bat-файл» — пакетный файл выполняется интерпретатором командной строки cmd.exe, а 1С лишь вызывает его напрямую или через оболочку. Отсюда три практических варианта.

Первый — КомандаСистемы("путь\script.bat"). Метод доступен и на клиенте (толстый клиент), и на сервере, блокирует выполнение до завершения команды и возвращает код возврата. В тонком и веб-клиенте недоступен, а в файловом варианте с разделением выполняется там, где вызван.

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

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

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

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

Подходит для сервера и толстого клиента; всегда ждёт завершения и возвращает код возврата. Не работает в тонком и веб-клиенте.

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

Подходит для клиентских вызовов; можно не ждать завершения. В асинхронном варианте результат приходит через оповещение.

WScript.Shell (COM)

Подходит, когда нужен скрытый запуск без окна консоли и чтение вывода скрипта. Требует Windows и прав на создание COM-объектов.

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

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

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

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

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

Запуск на сервере: КомандаСистемы и WScript.Shell

На сервере 1С:Предприятия методы запуска приложений недоступны, поэтому используется КомандаСистемы(). Важно понимать: скрипт выполняется на сервере под учётной записью агента сервера 1С (обычно USR1CV8), а не под пользователем сеанса. У этой учётной записи должны быть права на чтение bat-файла, на все используемые им каталоги и сетевые ресурсы.

bsl
КодВозврата = КомандаСистемы("""C:\Scripts\backup.bat""", "C:\Scripts");
Если КодВозврата <> 0 Тогда
    ВызватьИсключение "Скрипт завершился с ошибкой, код " + КодВозврата;
КонецЕсли;

Если нужно скрыть окно консоли или прочитать текстовый вывод скрипта, применяют WScript.Shell:

bsl
Shell = Новый COMОбъект("WScript.Shell");
КодВозврата = Shell.Run("""C:\Scripts\export.bat""", 0, Истина);
// 0 — скрытое окно, Истина — ждать завершения

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

Параметры передаются в bat-файл через пробел после имени файла; внутри скрипта они доступны как %1, %2 и так далее. Каждый параметр, содержащий пробелы или кириллицу, заключайте в кавычки. В строковых литералах 1С кавычка удваивается, поэтому строка команды выглядит громоздко — собирайте её через переменные для читаемости.

bsl
СтрокаКоманды = """C:\Scripts\upload.bat"" """" + КаталогВыгрузки + """ """" + ИмяФайла + """"";
КодВозврата = КомандаСистемы(СтрокаКоманды);

Кириллица в путях — отдельный источник проблем: консоль Windows по умолчанию работает в кодировке CP866, а 1С передаёт строки в Unicode. Если bat-файл не видит файл с русским именем, добавьте в начало скрипта команду chcp 1251 или chcp 65001 и сохраните сам bat-файл в соответствующей кодировке. Сам bat-файл должен быть сохранён в OEM/ANSI-кодировке — UTF-8 с BOM часто ломает выполнение первой строки.

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

Код возврата 0 означает успешное завершение, любое другое значение — ошибку, которую скрипт сообщил через exit /b N. Чтобы диагностика была возможна, внутри bat-файла выставляйте осмысленные коды на каждой ветке ошибки и пишите лог: перенаправьте вывод командой >> C:\\Scripts\\log.txt 2>&1. Без лога разбор «почему не сработало» превращается в гадание.

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

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

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

Равен 0

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

Любое ненулевое значение — смотрите лог скрипта

Результирующий файл
Норма

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

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

Файла нет или он пустой — скрипт отработал частично

Лог bat-файла
Норма

Последняя строка — завершающее сообщение скрипта

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

Сообщения об ошибках команд или обрыв лога посередине

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

Типичные ошибки и ограничения

Типичные ошибки
01
Путь без кавычек при пробелах — cmd воспринимает часть пути как параметр, скрипт не находится
02
Ожидание завершения отключено, а следующая строка кода уже читает файл результата — получает пустоту или ошибку доступа
03
Bat-файл сохранён в UTF-8 с BOM — первая команда выполняется с ошибкой или скрипт не стартует
04
Запуск на сервере сетевого скрипта без прав у учётной записи агента — «отказано в доступе»
05
Интерактивные команды (pause, set /p) в скрипте — процесс зависает и блокирует сеанс 1С
06
Вызов КомандаСистемы в тонком клиенте — метод недоступен, код падает с ошибкой

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

Ещё одно ограничение — длина командной строки Windows (около 8191 символа). Если нужно передать много параметров или длинные тексты, не встраивайте их в строку команды: запишите данные во временный файл, а в bat-файл передайте только путь к нему.

Как выбрать подходящий вариант

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

Как выбрать действие

Код выполняется на сервере 1С и нужен просто запуск с кодом возвратаИспользуйте КомандаСистемы() и проверяйте права учётной записи агента сервера
Код выполняется на клиенте в управляемом приложении без модальностиИспользуйте НачатьЗапускПриложения() с описанием оповещения
Нужно скрыть окно консоли или прочитать вывод скриптаИспользуйте COM-объект WScript.Shell (методы Run или Exec)
Скрипт работает долго и блокировка сеанса недопустимаЗапускайте без ожидания и контролируйте результат по появлению итогового файла или записи в логе

Во всех вариантах полезно обернуть вызов в попытку/исключение и записывать факт запуска, строку команды и код возврата в журнал регистрации через ЗаписьЖурналаРегистрации(). Это сильно упрощает сопровождение: при жалобе «обмен не отработал» вы сразу видите, запускался ли скрипт вообще и с каким результатом завершился.

Итог

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

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

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

Почему bat-файл запускается вручную, но не запускается из 1С?

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

Как получить текстовый вывод bat-файла в 1С?

Используйте COM-объект WScript.Shell с методом Exec — у возвращаемого объекта есть поток StdOut, из которого читается вывод. Альтернатива — перенаправить вывод в файл внутри самого скрипта и прочитать этот файл средствами 1С после завершения.

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

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

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

Через WScript.Shell методом Run с параметром стиля окна равным 0 — окно будет скрыто. Учтите, что скрытый запуск затрудняет отладку: на время разработки лучше оставить окно видимым и включить логирование в файл.

Что делать, если скрипт работает долго и 1С «зависает»?

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

Почему скрипт не видит файлы с русскими именами?

Из-за несовпадения кодировок: консоль работает в CP866, а 1С передаёт строки в Unicode. Добавьте в начало bat-файла команду chcp 1251 (или 65001), сохраните сам файл в кодировке OEM/ANSI без BOM и по возможности используйте латинские имена файлов для обмена.