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

Разработка и Конфигурация · 13 мин

Как из 1С запустить командную строку cmd и выполнить команды

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

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

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

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

Способы запуска cmd из 1С: что выбрать

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

Критерии выбора простые. Если код выполняется в тонком или веб-клиенте и нужно запустить что-то на компьютере пользователя — подходит ЗапуститьПриложение с обработчиком оповещения. Если команда должна выполниться на сервере 1С (регламентное задание, серверная процедура) — используйте КомандаСистемы. Если нужно прочитать текстовый вывод команды прямо в переменную без промежуточного файла — берите WScript.Shell.Exec.

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

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

Клиентский контекст, асинхронный режим через оповещение, можно показать окно cmd. Не работает в серверных процедурах.

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

Работает на клиенте и на сервере, ждёт завершения, возвращает код выхода. Окно cmd пользователю не показывается.

WScript.Shell (Exec)

Позволяет читать StdOut процесса напрямую. Требует Windows и прав на создание COM-объекта, на веб-клиенте недоступен.

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

Метод ЗапуститьПриложение предназначен для клиентского контекста. В управляемых формах он работает асинхронно: сначала описывается оповещение, которое сработает после завершения процесса, затем вызывается сам метод. Ключ команды /c означает «выполнить команду и закрыть окно», /k — выполнить и оставить окно открытым, что удобно при отладке.

&НаКлиенте

Процедура ВыполнитьКоманду(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияКоманды", ЭтотОбъект);

СтрокаЗапуска = "cmd /c " + Команда;

// Истина — дождаться завершения процесса

ЗапуститьПриложение(Оповещение, СтрокаЗапуска, , Истина);

КонецПроцедуры

&НаКлиенте

Процедура ПослеЗавершенияКоманды(КодВозврата, ДополнительныеПараметры) Экспорт

Если КодВозврата = 0 Тогда

Сообщить("Команда выполнена успешно");

Иначе

Сообщить("Ошибка, код возврата: " + КодВозврата);

КонецЕсли;

КонецПроцедуры

Вызов выглядит так: ВыполнитьКоманду("ping 192.168.0.1 -n 4");. Если путь к программе содержит пробелы, его нужно обернуть в кавычки, а при вложенных кавычках внутри команды — экранировать их удвоением. В обычных формах (толстый клиент) метод можно вызывать синхронно без описания оповещения: ЗапуститьПриложение("cmd /c ipconfig", , Истина);.

Важный нюанс: в тонком клиенте метод выполняется на компьютере пользователя, а не на сервере. Если команда должна обращаться к ресурсам, доступным только с сервера 1С, этот способ не подойдёт — нужен серверный вызов.

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

Метод КомандаСистемы выполняет строку так, словно она введена в командной строке, и по умолчанию дожидается завершения. Главное преимущество — он доступен в серверном контексте, поэтому подходит для регламентных заданий, фоновой выгрузки и обработок на сервере. Метод возвращает код завершения процесса: 0 обычно означает успех, ненулевые значения зависят от конкретной утилиты.

&НаСервере

Функция ВыполнитьНаСервере(СтрокаКоманды)

КодВозврата = Неопределено;

КомандаСистемы("cmd /c " + СтрокаКоманды, , КодВозврата);

Возврат КодВозврата;

КонецФункции

Особое внимание — учётной записи, под которой работает сервер 1С (по умолчанию часто USR1CV8 или LocalSystem). У неё может не быть прав на сетевые папки, пользовательский профиль и часть каталогов. Если команда на клиенте работает, а на сервере возвращает ошибку — первым делом проверяйте права служебной учётной записи и используйте полные UNC-пути вместо подключённых дисков (диски вида Z: у службы не существуют).

Как получить вывод команды: перенаправление в файл и WScript.Shell

Ни ЗапуститьПриложение, ни КомандаСистемы не возвращают текст, который команда печатает в консоль. Стандартный приём — перенаправить вывод во временный файл и прочитать его средствами 1С. Это надёжно работает и на клиенте, и на сервере.

ИмяФайла = ПолучитьИмяВременногоФайла("txt");

КомандаСистемы("cmd /c ipconfig /all > """ + ИмяФайла + """");

Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.OEM);

Результат = Текст.Прочитать();

Текст.Закрыть();

УдалитьФайлы(ИмяФайла);

Обратите внимание на кодировку: консоль Windows выводит текст в OEM-кодировке (для русской локали — CP866). Если прочитать файл как ANSI или UTF-8, кириллица превратится в нечитаемые символы. Указывайте КодировкаТекста.OEM или команду chcp 65001 перед выводом для переключения консоли на UTF-8.

Альтернатива без файлов — WScript.Shell с методом Exec, который отдаёт поток StdOut напрямую:

Shell = Новый COMОбъект("WScript.Shell");

Exec = Shell.Exec("cmd /c ping 127.0.0.1 -n 2");

Пока Exec.Status = 0 Цикл

КонецЦикла;

Вывод = Exec.StdOut.ReadAll();

Этот вариант требует Windows и права на создание COM-объектов, а в веб-клиенте недоступен. Зато он избавляет от временных файлов и проблем с кодировкой файла — хотя сам StdOut всё равно приходит в консольной кодировке.

Пошаговый пример: проверка доступности сервера из обработки

Соберём типовой сценарий целиком: обработка пингует сервер и сообщает пользователю результат. Это частая задача при диагностике обменов и сетевых путей.

Порядок действий
  1. 1
    Определите контекст: команда нужна на компьютере пользователя или на сервере 1С
  2. 2
    Сформируйте строку: cmd /c ping адрес -n 4 > временный_файл
  3. 3
    Выполните через ЗапуститьПриложение (клиент) или КомандаСистемы (сервер) с ожиданием завершения
  4. 4
    Проверьте код возврата: 0 — узел отвечает, 1 — нет ответа
  5. 5
    Прочитайте временный файл в кодировке OEM и покажите вывод пользователю
  6. 6
    Удалите временный файл через УдалитьФайлы

Для серверного варианта код компактный:

&НаСервере

Функция ПроверитьУзел(Адрес)

ИмяФайла = ПолучитьИмяВременногоФайла("txt");

КодВозврата = Неопределено;

КомандаСистемы("cmd /c ping " + Адрес + " -n 4 > """ + ИмяФайла + """", , КодВозврата);

Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.OEM);

Вывод = Текст.Прочитать();

Текст.Закрыть();

УдалитьФайлы(ИмяФайла);

Возврат Новый Структура("КодВозврата, Вывод", КодВозврата, Вывод);

КонецФункции

Признак корректной работы: функция возвращает код 0 и читаемый текст статистики ping. Если возвращается код 1 — узел недоступен или блокируется брандмауэром. Если вывод пустой или содержит «кракозябры» — проверяйте путь к файлу и кодировку.

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

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

Код возврата команды
Норма

0 — команда отработала штатно

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

Ненулевой код — смотрите документацию утилиты, чаще всего ошибка параметров или недоступность ресурса

Содержимое файла вывода
Норма

Читаемый текст на русском или английском

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

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

Поведение сеанса 1С
Норма

Управление возвращается после завершения команды

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

Сеанс «висит» — команда ожидает ввода или запущена без /c

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

Большинство проблем при запуске cmd из 1С повторяются от проекта к проекту. Знание типовых граблей экономит часы отладки.

Типичные ошибки
01
Запуск без ключа /c — окно cmd остаётся открытым, а КомандаСистемы ждёт его закрытия бесконечно, блокируя сеанс или регламентное задание
02
Сетевые диски (Z:, Y:) в серверном коде — у службы сервера 1С эти диски не подключены, используйте UNC-пути \\сервер\ресурс
03
Чтение вывода в кодировке ANSI вместо OEM — русский текст превращается в нечитаемые символы
04
Интерактивные команды (требующие ввода пароля или подтверждения) — процесс зависает в ожидании, которого никто не увидит
05
Пути с пробелами без кавычек — cmd разбирает строку по пробелам и не находит файл
06
Ожидание, что ЗапуститьПриложение сработает на сервере — метод клиентский, в серверном контексте вызовет ошибку

Отдельно стоит упомянуть антивирусы и политики безопасности: запуск дочерних процессов из службы сервера 1С может блокироваться. Если команда молча не выполняется, проверьте журналы антивируса и попробуйте выполнить ту же строку вручную под учётной записью службы через runas или планировщик задач.

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

Для команд, которые периодически отлаживаются, удобно временно заменить /c на /k и запускать через ЗапуститьПриложение — окно cmd останется открытым, и вы увидите реальное сообщение об ошибке, которое иначе теряется. После отладки верните /c.
ПЗ
Практическое замечание

Безопасность и границы самостоятельной настройки

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

Если команда должна выполнять административные действия — остановку служб, изменение реестра, работу с системными каталогами — безопаснее вынести её в отдельный bat-файл, защищённый правами NTFS, и вызывать из 1С только его. Так проще контролировать, что именно выполняется, и проще отозвать доступ.

Граница самостоятельной работы проходит там, где начинаются изменения продуктивного сервера: настройку прав служебных учётных записей, исключения антивируса и запуск команд с повышенными привилегиями стоит согласовывать с системным администратором, а эксперименты проводить на тестовой копии базы.

Итог

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

На клиенте используйте ЗапуститьПриложение с оповещением, на сервере — КомандаСистемы с кодом возврата. Вывод команды получайте через перенаправление в файл с кодировкой OEM или через WScript.Shell.Exec. Всегда добавляйте /c, используйте UNC-пути на сервере и не передавайте пользовательский ввод в командную строку без проверки.

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

Как запустить bat-файл из 1С и дождаться его завершения?

Используйте КомандаСистемы("cmd /c ""путь\файл.bat""", , КодВозврата) — метод по умолчанию ждёт окончания и вернёт код завершения. На клиенте альтернатива — ЗапуститьПриложение с параметром ожидания Истина. Путь к bat-файлу с пробелами обязательно заключайте в кавычки.

Почему команда работает из обычной cmd, но не из 1С на сервере?

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

Как скрыть чёрное окно cmd при запуске?

КомандаСистемы по умолчанию не показывает окно. При запуске через WScript.Shell метод Run с вторым параметром 0 (Shell.Run команда, 0, Истина) выполняет команду в скрытом окне. Для ЗапуститьПриложение окно можно не показывать, если вызывать не cmd напрямую, а утилиту без консоли.

Можно ли запустить cmd из 1С на Linux-сервере?

Cmd — компонент Windows, на Linux его нет. КомандаСистемы на Linux выполняет команды через системную оболочку, поэтому скрипты нужно писать под bash/sh, а вызовы специфичных для Windows утилит заменять аналогами. Код с ветвлением по типу ОС можно строить через информацию о системе.

Почему русский текст в выводе команды отображается нечитаемыми символами?

Консоль Windows работает в OEM-кодировке (CP866 для русской локали), а файл по умолчанию читается как ANSI или UTF-8. Откройте файл с КодировкаТекста.OEM либо добавьте в начало команды chcp 65001 и читайте как UTF-8.

Как передать в команду параметры с пробелами и кавычками?

Каждый параметр с пробелами оборачивайте в двойные кавычки, а внутренние кавычки удваивайте. В коде 1С кавычка внутри строки также удваивается, поэтому итоговая строка может выглядеть громоздко — собирайте её через СтрШаблон или конкатенацию с отдельными переменными для путей, это снижает риск ошибки.