Разработка и Конфигурация · 10 мин
Как запустить командную строку в 1С 8
Способы запуска командной строки из 1С 8: КомандаСистемы, ЗапуститьПриложение, WScript.Shell. Примеры кода, передача параметров, ошибки и ограничения.
Задача запустить командную строку из 1С 8 возникает при интеграции с внешними утилитами: архиваторами, скриптами резервного копирования, конвертерами файлов, сетевыми командами. Платформа 1С:Предприятие 8 предоставляет несколько встроенных механизмов для этого — от простого вызова команды до полноценного управления процессом с чтением вывода.
Выбор способа зависит от контекста: код выполняется на клиенте или на сервере, нужно ли дождаться завершения команды, требуется ли получить результат выполнения. Неправильный выбор приводит к типичным проблемам — окно консоли «мигает» и исчезает, команда не находит файлы, а серверный вызов блокируется политиками безопасности.
Ниже разобраны основные методы с примерами кода на встроенном языке 1С, особенности тонкого и толстого клиента, работа с параметрами и путями, а также типичные ошибки и способы проверки результата.
Способы запуска командной строки из 1С
Платформа предлагает три основных подхода. Первый — функция КомандаСистемы(), которая выполняет команду так, как если бы она была введена в командной строке Windows. Второй — процедура ЗапуститьПриложение(), более гибкая: позволяет указать рабочий каталог, дождаться завершения и получить код возврата. Третий — COM-объект WScript.Shell, доступный только в толстом клиенте и на сервере Windows, дающий максимальный контроль над процессом.
Сравнение способов запуска
Простой вызов команды. Не работает в тонком и веб-клиенте, нет кода возврата.
Универсальный метод для тонкого клиента и сервера. Поддерживает ожидание завершения и код возврата.
Максимум возможностей: чтение вывода, скрытый запуск. Только Windows, толстый клиент или сервер.
Для новых разработок рекомендуется ЗапуститьПриложение(): метод кроссплатформенный, работает в тонком клиенте и не требует отключения безопасного режима в большинстве сценариев. КомандаСистемы() считается устаревшим подходом и недоступна в тонком клиенте.
Запуск через КомандаСистемы()
Функция КомандаСистемы() принимает строку команды и необязательный параметр — рабочий каталог. Вызов выглядит так:
КомандаСистемы("cmd /c ipconfig > C:\Temp\net.txt");
КомандаСистемы("notepad.exe C:\Temp\log.txt");
Конструкция cmd /c означает: открыть интерпретатор команд, выполнить указанную команду и закрыть окно. Если использовать cmd /k, окно останется открытым — это удобно при отладке, когда нужно увидеть вывод. Перенаправление вывода в файл через > позволяет потом прочитать результат средствами 1С (объект ЧтениеТекста).
КомандаСистемы("cmd /c chcp 65001 > nul && ping 127.0.0.1 > C:\Temp\ping.txt");Важное ограничение: в тонком и веб-клиенте функция недоступна. Если конфигурация работает в управляемом приложении, при попытке вызова вы получите ошибку о недопустимости операции. Поэтому перед использованием проверяйте тип клиента или сразу используйте ЗапуститьПриложение().
Запуск через ЗапуститьПриложение()
Процедура ЗапуститьПриложение() — основной способ для тонкого клиента и серверных вызовов. Синтаксис позволяет указать строку команды, рабочий каталог, флаг ожидания завершения и переменную для кода возврата.
КодВозврата = Неопределено;
ЗапуститьПриложение("cmd /c myscript.bat", "C:\Scripts", Истина, КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Команда выполнена успешно");
Иначе
Сообщить("Ошибка, код: " + КодВозврата);
КонецЕсли;
Третий параметр (Истина) заставляет 1С дождаться завершения процесса. Без него выполнение кода продолжится сразу, а код возврата получить не удастся. Учтите: ожидание блокирует интерфейс клиента, поэтому для длительных операций лучше выносить вызов в фоновое задание на сервере.
- 1Сформируйте строку команды с полными путями к файлам
- 2Вызовите ЗапуститьПриложение с параметром ДождатьсяЗавершения = Истина
- 3Проверьте код возврата: 0 обычно означает успех
- 4При ошибке прочитайте файл вывода или журнал, куда команда писала результат
Если команда должна выполняться на сервере, оберните вызов в серверную процедуру с директивой &НаСервере. Помните, что процесс будет запущен от имени учётной записи агента сервера 1С — у неё должны быть права на исполняемые файлы и каталоги.
Запуск через WScript.Shell
COM-объект Windows Script Host даёт возможности, недоступные штатным методам: скрытый запуск без окна консоли, чтение стандартного вывода напрямую, доступ к переменным окружения. Объект создаётся так:
Shell = Новый COMОбъект("WScript.Shell");
Shell.Run("cmd /c backup.bat", 0, Истина); // 0 — скрытое окно, Истина — ждать завершения
Для чтения вывода команды без промежуточного файла используется метод Exec вместо Run:
Shell = Новый COMОбъект("WScript.Shell");
Процесс = Shell.Exec("cmd /c ipconfig");
Пока Процесс.Status = 0 Цикл
КонецЦикла;
Вывод = Процесс.StdOut.ReadAll();
Метод Exec требует аккуратности: если буфер вывода переполняется, а вы не читаете его, процесс может зависнуть. Для команд с большим выводом читайте поток в цикле или перенаправляйте в файл.
Передача параметров и работа с путями
Главный источник ошибок — пути с пробелами и кириллицей. Любой путь, содержащий пробелы, должен быть заключён в кавычки. В строке встроенного языка кавычки удваиваются:
ПутьКАрхиву = """C:\Мои документы\backup.zip""";
Команда = "cmd /c 7z.exe a " + ПутьКАрхиву + " C:\Data\.";
ЗапуститьПриложение(Команда, , Истина);
Кириллица в выводе консоли часто отображается «кракозябрами» из-за несовпадения кодировок: консоль Windows по умолчанию работает в OEM-кодировке (866), а 1С ожидает ANSI или UTF-8. Решения: добавить в начало команды chcp 65001 для переключения на UTF-8, либо читать файл вывода с явным указанием кодировки КодировкаТекста.OEM в объекте ЧтениеТекста.
Проверка результата и отладка
Код возврата — первый индикатор: ноль почти всегда означает успешное завершение, любое другое значение — ошибку, смысл которой зависит от конкретной утилиты. Если код возврата недоступен (например, при вызове без ожидания), проверяйте косвенные признаки: появился ли результирующий файл, изменилась ли его дата.
Как проверить результат
Равен 0
Любое ненулевое значение — смотрите документацию утилиты
Существует, содержит ожидаемый текст
Пустой или отсутствует — команда не выполнилась
Команда отработала, виден нормальный вывод
Сообщение об ошибке или «не является внутренней или внешней командой»
При отладке замените /c на /k, чтобы окно консоли осталось открытым, и посмотрите реальный текст ошибки. Также полезно сначала выполнить сформированную строку команды вручную в обычной командной строке — так вы отделите ошибки синтаксиса команды от ошибок вызова из 1С.
Ограничения и безопасность
Запуск внешних команд — потенциальная уязвимость, если часть строки команды формируется из пользовательского ввода. Никогда не подставляйте в команду введённые пользователем данные без проверки: это открывает путь к выполнению произвольных команд на сервере. Во внешних обработках вызов внешних приложений может блокироваться безопасным режимом — тогда потребуется разрешение в настройках или профиле безопасности кластера.
Учитывайте и архитектурные ограничения: веб-клиент не может запускать локальные приложения вовсе, тонкий клиент — только через ЗапуститьПриложение(), а на Linux-сервере команды Windows (cmd, bat-файлы) недоступны. Для кроссплатформенных решений используйте вызовы, соответствующие операционной системе сервера.
Что важно запомнить
Используйте ЗапуститьПриложение как универсальный способ, КомандаСистемы — только в толстом клиенте, WScript.Shell — когда нужен скрытый запуск или чтение вывода. Всегда заключайте пути в кавычки, проверяйте код возврата и учитывайте, где выполняется код — на клиенте или на сервере.
Частые вопросы
Как запустить командную строку из 1С, чтобы окно не появлялось?
Используйте объект WScript.Shell с методом Run и вторым параметром 0 — окно будет скрыто. Альтернатива без COM: запускать bat-файл через ЗапуститьПриложение, но кратковременное окно консоли всё равно может мелькнуть.
Почему КомандаСистемы выдаёт ошибку в тонком клиенте?
Функция недоступна в тонком и веб-клиенте по архитектурным причинам. Замените вызов на ЗапуститьПриложение — он поддерживается во всех клиентах и на сервере.
Как получить результат выполнения команды обратно в 1С?
Самый надёжный способ — перенаправить вывод в файл (cmd /c команда > файл.txt) и прочитать его объектом ЧтениеТекста с нужной кодировкой. Через WScript.Shell можно прочитать StdOut напрямую без файла.
Команда работает вручную, но не работает из 1С. В чём причина?
Чаще всего дело в рабочем каталоге, правах учётной записи (на сервере это учётка агента 1С) или отсутствии кавычек вокруг путей с пробелами. Проверьте, что в команде используются полные абсолютные пути.
Можно ли запустить командную строку на сервере 1С?
Да, вызов ЗапуститьПриложение в серверной процедуре запустит процесс на сервере от имени учётной записи агента сервера 1С. Убедитесь, что у этой учётной записи есть права на исполняемый файл и рабочие каталоги.
Как дождаться завершения команды и узнать, что она завершилась успешно?
Передайте в ЗапуститьПриложение третий параметр Истина (дождаться завершения) и четвёртый — переменную для кода возврата. Код 0 обычно означает успех; ненулевое значение смотрите в документации конкретной утилиты.