Запуск команд и внешних программ из 1С 8.3

· 10 мин

Содержание

Чтобы выполнить команду операционной системы из встроенного языка 1С, используют процедуру ЗапуститьПриложение. Она запускает любой исполняемый файл, .bat или строку вида cmd /c <команда>, умеет ждать завершения и возвращать код выхода процесса. Это основной способ, когда команду нужно выполнить прямо из кода конфигурации.

Но «выполнить команду в 1С» понимают по-разному: кто-то хочет прогнать произвольный код на встроенном языке через консоль, кто-то — запустить саму 1С в пакетном режиме из планировщика, а кто-то — выполнить shell-команду на сервере. Разберём все эти случаи: синтаксис ЗапуститьПриложение, запуск кода на сервере, пакетный режим 1cv8, получение результата и кода возврата, автоматизацию и ограничения, которые накладывает профиль безопасности.

Сразу про контекст: ЗапуститьПриложение работает и на клиенте, и на сервере, но «на сервере» значит под учётной записью службы сервера 1С, а не под вашим пользователем Windows. Это ключевое отличие — к нему вернёмся в разделе про безопасность.

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

Запуск внешней программы из встроенного языка

Классический синтаксис синхронного запуска:

КодВозврата = 0;
ЗапуститьПриложение("cmd /c dir C:\ > C:\temp\out.txt",
    , // текущий каталог — по умолчанию
    Истина, // ожидать завершения
    КодВозврата);
Сообщить("Код возврата: " + КодВозврата);

Параметры по порядку:

  • 🔹 КоманднаяСтрока — что запускаем. Для встроенных команд ОС (dir, copy, del) обязательна обёртка cmd /c, потому что это не программы, а команды интерпретатора.
  • 🔹 ТекущийКаталог — рабочая папка процесса. Можно не указывать.
  • 🔹 ОжидатьЗавершения — Истина, если нужно дождаться окончания и получить код возврата. По умолчанию Ложь — 1С запустит процесс и пойдёт дальше.
  • 🔹 КодВозврата — переменная для кода выхода. Заполняется, только когда ожидание включено.

Код возврата заполняется лишь при ОжидатьЗавершения = Истина. Если ждать не стали, переменная останется такой, какой была до вызова.

Для запуска из тонкого клиента без блокировки интерфейса есть асинхронный вариант:

Оповещение = Новый ОписаниеОповещения("ПослеЗапуска", ЭтотОбъект);
НачатьЗапускПриложения(Оповещение, "notepad.exe", , Ложь);

Результат (в том числе код возврата) приходит в процедуру-обработчик оповещения. Асинхронные методы — предпочтительный способ в веб-клиенте и на управляемых формах, где синхронные вызовы могут быть запрещены настройками конфигурации.

Путь к программе с пробелами берите в двойные кавычки прямо внутри строки команды: """C:\Program Files\app\run.exe""". В 1С двойная кавычка внутри строкового литерала удваивается.

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

Отдельный частый вопрос — выполнить команду не на клиенте, а на сервере 1С. Для этого код с ЗапуститьПриложение помещают в серверную процедуру (директива &НаСервере или общий модуль с флагом «Сервер»).

Тут важно понимать, под кем всё исполнится:

  • Процесс запускается под учётной записью службы сервера 1С (по умолчанию это USR1CV8 или та учётка, под которой работает служба агента ragent), а не под пользователем, сидящим за клиентом.
  • У этой учётки обычно нет доступа к сетевым дискам пользователя, к его профилю и к GUI-сессии. Поэтому notepad.exe, запущенный на сервере, никто не увидит — он откроется в невидимой сессии службы.
  • Путь к файлам указывайте локальный для сервера (C:\temp\... на самом сервере), а не привычный клиентский.

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

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

Пакетный режим: запуск 1С и внешних скриптов

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

Базовая строка запуска:

"C:\Program Files\1cv8\8.3.24.1234\bin\1cv8.exe" ENTERPRISE ^
 /S"srv-1c\buh" ^
 /N"Робот" /P"пароль" ^
 /Execute"C:\scripts\vygruzka.epf" ^
 /C"режим=ночь" ^
 /DisableStartupDialogs /DisableStartupMessages ^
 /Out"C:\scripts\log.txt"

Что означают ключи:

КлючНазначение
ENTERPRISEзапуск в режиме 1С:Предприятие
/S сервер\базасерверная база (для файловой — /F путь)
/N / /Pимя пользователя и пароль
/Execute путь.epfвнешняя обработка, которую надо выполнить
/C строкапараметры, которые обработка прочитает из ПараметрЗапуска
/DisableStartupDialogsподавить окна запуска (без них batch «зависнет» на диалоге)
/Out файлслужебный протокол запуска

Параметры, переданные в /C, обработка читает так:

Параметр = ПараметрЗапуска; // то, что было в /C"..."
Если Параметр = "режим=ночь" Тогда
    // ваш сценарий
КонецЕсли;

Этим же способом выполняют «внешний скрипт»: сама логика лежит в .epf, а .bat лишь запускает платформу с нужными ключами. Отдельный язык скриптов для этого не нужен — скрипт пишется на встроенном языке 1С.

Ключи /DisableStartupDialogs и /DisableStartupMessages в пакетном режиме обязательны. Без них платформа может остановиться на модальном окне и ждать человека, которого нет.

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

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

Порядок такой:

  1. Сформируйте команду с перенаправлением вывода в файл: cmd /c ipconfig > C:\temp\net.txt.
  2. Запустите с ОжидатьЗавершения = Истина, иначе прочитаете файл раньше, чем команда успеет его создать.
  3. Прочитайте файл текстовым документом.
ПутьФайла = "C:\temp\net.txt";
КодВозврата = 0;
ЗапуститьПриложение("cmd /c ipconfig > " + ПутьФайла, , Истина, КодВозврата);

Если КодВозврата = 0 Тогда
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ПутьФайла);
    Сообщить(Текст.ПолучитьТекст());
Иначе
    Сообщить("Команда завершилась с ошибкой, код " + КодВозврата);
КонецЕсли;

Про коды возврата коротко:

  • 🟢 0 — почти всегда «успешно». На это значение и ориентируйтесь в проверках.
  • 🔴 любое ненулевое — ошибка; конкретное число зависит от самой программы, единого справочника нет.
  • 🔵 если код возврата всегда 0, хотя команда явно падает, — проверьте, что ожидание включено, а команда действительно запускается, а не отдаётся интерпретатору с ошибкой синтаксиса.

Для разбора вывода удобно не читать весь текст сразу, а пройти построчно ЧтениемТекста — так проще искать нужную строку в длинном логе.

Автоматизация: расписание и планировщик заданий

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

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

Планировщик заданий Windows. Запускает .bat по времени независимо от того, открыта 1С или нет. Именно он нужен для ночного пакетного запуска 1cv8, когда база должна стартовать «с нуля». Создаёте задачу, в действии указываете путь к .bat, в триггере — время.

Сравним, что когда выбирать:

КритерийРегламентное заданиеПланировщик Windows + batch
Где живёт логикав конфигурацииво внешней обработке .epf
Нужна ли поднятая базада, сервер работаетнет, 1С стартует сама
Под кем выполняетсяучётка службы 1Сучётка задачи планировщика
Удобно дляобменов, пересчётовночных выгрузок, бэкапов

Если batch-запуск по расписанию «молча» ничего не делает, первым делом проверьте, под какой учётной записью запускается задача планировщика и есть ли у неё доступ к каталогу .epf и к базе. Задача, запущенная «только при входе пользователя», ночью не сработает — ставьте «выполнять вне зависимости от входа».

Проверка перед настройкой пакетного запуска
Выполнено: 0 / 6

Безопасность и ограничения среды выполнения

Возможность выполнять команды ОС из кода — это риск, поэтому платформа умеет её ограничивать. Два механизма.

Безопасный режим. Когда код выполняется в безопасном режиме (БезопасныйРежим(Истина) или при открытии непроверенной внешней обработки), платформа запрещает запуск внешних программ, обращение к файловой системе, работу с COM-объектами и внешними компонентами. Попытка вызвать ЗапуститьПриложение вызовет ошибку. Это защита от «чужого» кода.

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

Что это значит на практике:

  • 🔸 Код, который отлично работал в файловой базе на вашем компьютере, на сервере с профилем безопасности может падать с запретом.
  • 🔸 Запуск под учёткой службы — это не «меньше прав» автоматически; наоборот, служебная учётка нередко имеет лишние права на сервере, и ЗапуститьПриложение на сервере потенциально опаснее, чем на клиенте.
  • 🔸 Сетевые пути вида \\server\share из серверного кода могут быть недоступны — у службы нет смонтированных дисков пользователя.

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

Если команда не запускается

Когда вызов отрабатывает, но результата нет, обычно виноват не синтаксис метода, а окружение. Диагностика по симптому:

Диагностика: выберите симптом

Отдельно про сетевые ресурсы: если команда копирует файлы на сетевую шару, а из серверного кода путь \\server\share не виден, используйте UNC-путь с учётными данными, под которыми служба имеет к нему доступ, — проброс «буквы диска» пользователя на сервере не работает .

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

Чем `ЗапуститьПриложение` отличается от `НачатьЗапускПриложения`?
Первая — синхронная: код ждёт завершения процесса (если включено ожидание) и только потом идёт дальше. Вторая — асинхронная, результат приходит в обработчик оповещения; она нужна в веб-клиенте и там, где синхронные вызовы запрещены настройками.
Почему код возврата всегда ноль, хотя команда явно падает?
Скорее всего, не включён параметр ожидания завершения — без него переменная кода возврата не заполняется. Вторая причина: вы запускаете cmd, и ноль возвращает сам интерпретатор, а не ваша команда внутри него. Проверяйте вывод, перенаправленный в файл.
Как передать команде путь с пробелами?
Возьмите путь в двойные кавычки внутри строки команды. В коде 1С двойная кавычка удваивается, поэтому выглядит это как """C:\Program Files\app.exe""".
Можно ли из команды получить текст, который она вывела в консоль?
Напрямую — нет, метод отдаёт только числовой код выхода. Перенаправьте вывод в файл (> out.txt), дождитесь завершения и прочитайте файл текстовым документом.
Почему на сервере команда не выполняется, а на моём компьютере работает?
На сервере код исполняется под учётной записью службы 1С, а не под вами, и может быть ограничен профилем безопасности или безопасным режимом. Проверьте права служебной учётки и настройки профиля для этой базы.