Автоматизация · 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-объектов.
Сравнение способов запуска
Подходит для сервера и толстого клиента; всегда ждёт завершения и возвращает код возврата. Не работает в тонком и веб-клиенте.
Подходит для клиентских вызовов; можно не ждать завершения. В асинхронном варианте результат приходит через оповещение.
Подходит, когда нужен скрытый запуск без окна консоли и чтение вывода скрипта. Требует Windows и прав на создание COM-объектов.
Запуск на клиенте: ЗапуститьПриложение и НачатьЗапускПриложения
Самый простой клиентский сценарий — синхронный запуск с ожиданием. Путь к файлу обязательно заключается в кавычки, если в нём есть пробелы, а рабочий каталог лучше задавать явно, иначе относительные пути внутри bat-файла будут разрешаться от каталога 1С.
КодВозврата = Неопределено;
ЗапуститьПриложение("""C:\Scripts\export.bat""", "C:\Scripts", Истина, КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Скрипт выполнен успешно");
Иначе
Сообщить("Ошибка выполнения, код " + КодВозврата);
КонецЕсли;Третий параметр (Истина) заставляет 1С ждать окончания работы скрипта — без него код возврата не будет получен, а дальнейшая логика (например, загрузка созданного файлом ответа) может сработать раньше времени. Если ожидание не нужно, передайте Ложь, но тогда контроль результата придётся организовывать отдельно — например, по появлению итогового файла.
В конфигурациях с отказом от модальности синхронный вызов недоступен. Используйте асинхронный вариант: НачатьЗапускПриложения(ОписаниеОповещения, СтрокаКоманды, Каталог, ДождатьсяЗавершения, КодВозврата). Результат обрабатывается в процедуре-обработчике оповещения, куда передаётся код возврата.
Запуск на сервере: КомандаСистемы и WScript.Shell
На сервере 1С:Предприятия методы запуска приложений недоступны, поэтому используется КомандаСистемы(). Важно понимать: скрипт выполняется на сервере под учётной записью агента сервера 1С (обычно USR1CV8), а не под пользователем сеанса. У этой учётной записи должны быть права на чтение bat-файла, на все используемые им каталоги и сетевые ресурсы.
КодВозврата = КомандаСистемы("""C:\Scripts\backup.bat""", "C:\Scripts");
Если КодВозврата <> 0 Тогда
ВызватьИсключение "Скрипт завершился с ошибкой, код " + КодВозврата;
КонецЕсли;Если нужно скрыть окно консоли или прочитать текстовый вывод скрипта, применяют WScript.Shell:
Shell = Новый COMОбъект("WScript.Shell");
КодВозврата = Shell.Run("""C:\Scripts\export.bat""", 0, Истина);
// 0 — скрытое окно, Истина — ждать завершенияПередача параметров и работа с путями
Параметры передаются в bat-файл через пробел после имени файла; внутри скрипта они доступны как %1, %2 и так далее. Каждый параметр, содержащий пробелы или кириллицу, заключайте в кавычки. В строковых литералах 1С кавычка удваивается, поэтому строка команды выглядит громоздко — собирайте её через переменные для читаемости.
СтрокаКоманды = """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-файл из командной строки под той же учётной записью, под которой работает сервер 1С или клиент. Часто выясняется, что скрипт спрашивает подтверждение, не находит команду из-за отсутствия пути в PATH или блокируется антивирусом.
Типичные ошибки и ограничения
Отдельно учитывайте антивирусную защиту и политики безопасности: запуск bat-файлов может блокироваться групповыми политиками или запрещён для определённых каталогов. В таких случаях скрипт просто не выполняется, а 1С возвращает общий код ошибки. Проверяйте журналы безопасности Windows и согласуйте исключения с администратором.
Ещё одно ограничение — длина командной строки Windows (около 8191 символа). Если нужно передать много параметров или длинные тексты, не встраивайте их в строку команды: запишите данные во временный файл, а в bat-файл передайте только путь к нему.
Как выбрать подходящий вариант
Как выбрать действие
Во всех вариантах полезно обернуть вызов в попытку/исключение и записывать факт запуска, строку команды и код возврата в журнал регистрации через ЗаписьЖурналаРегистрации(). Это сильно упрощает сопровождение: при жалобе «обмен не отработал» вы сразу видите, запускался ли скрипт вообще и с каким результатом завершился.
Что важно запомнить
На клиенте используйте ЗапуститьПриложение/НачатьЗапускПриложения, на сервере — КомандаСистемы или 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 и по возможности используйте латинские имена файлов для обмена.