Запуск команд и внешних программ из 1С 8.3
Содержание
Чтобы выполнить команду операционной системы из встроенного языка 1С, используют процедуру ЗапуститьПриложение. Она запускает любой исполняемый файл, .bat или строку вида cmd /c <команда>, умеет ждать завершения и возвращать код выхода процесса. Это основной способ, когда команду нужно выполнить прямо из кода конфигурации.
Но «выполнить команду в 1С» понимают по-разному: кто-то хочет прогнать произвольный код на встроенном языке через консоль, кто-то — запустить саму 1С в пакетном режиме из планировщика, а кто-то — выполнить shell-команду на сервере. Разберём все эти случаи: синтаксис ЗапуститьПриложение, запуск кода на сервере, пакетный режим 1cv8, получение результата и кода возврата, автоматизацию и ограничения, которые накладывает профиль безопасности.
Сразу про контекст: ЗапуститьПриложение работает и на клиенте, и на сервере, но «на сервере» значит под учётной записью службы сервера 1С, а не под вашим пользователем Windows. Это ключевое отличие — к нему вернёмся в разделе про безопасность.
ЗапуститьПриложение (синхронно) или НачатьЗапускПриложения (асинхронно на клиенте). См. раздел про встроенный язык.Файл → Открыть.1cv8 ENTERPRISE … /Execute из .bat-файла, а запуск — через планировщик заданий Windows.> out.txt) и прочитайте его из 1С. Текстом процесс результат не возвращает.Запуск внешней программы из встроенного языка
Классический синтаксис синхронного запуска:
КодВозврата = 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С.
Порядок такой:
- Сформируйте команду с перенаправлением вывода в файл:
cmd /c ipconfig > C:\temp\net.txt. - Запустите с
ОжидатьЗавершения = Истина, иначе прочитаете файл раньше, чем команда успеет его создать. - Прочитайте файл текстовым документом.
ПутьФайла = "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 и к базе. Задача, запущенная «только при входе пользователя», ночью не сработает — ставьте «выполнять вне зависимости от входа».
Безопасность и ограничения среды выполнения
Возможность выполнять команды ОС из кода — это риск, поэтому платформа умеет её ограничивать. Два механизма.
Безопасный режим. Когда код выполняется в безопасном режиме (БезопасныйРежим(Истина) или при открытии непроверенной внешней обработки), платформа запрещает запуск внешних программ, обращение к файловой системе, работу с COM-объектами и внешними компонентами. Попытка вызвать ЗапуститьПриложение вызовет ошибку. Это защита от «чужого» кода.
Профили безопасности кластера. В клиент-серверном варианте для информационной базы назначают профиль безопасности. В нём точечно разрешают или запрещают: запуск внешних программ, доступ к конкретным каталогам, обращение в интернет, использование внешних компонент. Настраивают профили через консоль администрирования кластера или утилитой rac (точные подкоманды смотрите в rac help — не полагайтесь на память). Для баз в облаке и сервисах профиль обычно запрещает ЗапуститьПриложение полностью.
Что это значит на практике:
- 🔸 Код, который отлично работал в файловой базе на вашем компьютере, на сервере с профилем безопасности может падать с запретом.
- 🔸 Запуск под учёткой службы — это не «меньше прав» автоматически; наоборот, служебная учётка нередко имеет лишние права на сервере, и
ЗапуститьПриложениена сервере потенциально опаснее, чем на клиенте. - 🔸 Сетевые пути вида
\\server\shareиз серверного кода могут быть недоступны — у службы нет смонтированных дисков пользователя.
Правило простое: команды, меняющие систему, запускайте с минимально необходимыми правами и только там, где это оправдано. Для разовой операции лучше клиент под вашей учёткой, для регулярной — продуманный профиль безопасности и отдельная учётка с нужным доступом.
Если команда не запускается
Когда вызов отрабатывает, но результата нет, обычно виноват не синтаксис метода, а окружение. Диагностика по симптому:
cmd /c <команда>, иначе система не найдёт исполняемый файл./DisableStartupDialogs и /DisableStartupMessages, а задачу планировщика настройте на запуск без входа пользователя.Отдельно про сетевые ресурсы: если команда копирует файлы на сетевую шару, а из серверного кода путь \\server\share не виден, используйте UNC-путь с учётными данными, под которыми служба имеет к нему доступ, — проброс «буквы диска» пользователя на сервере не работает
.
Частые вопросы
Чем `ЗапуститьПриложение` отличается от `НачатьЗапускПриложения`?
Почему код возврата всегда ноль, хотя команда явно падает?
cmd, и ноль возвращает сам интерпретатор, а не ваша команда внутри него. Проверяйте вывод, перенаправленный в файл.Как передать команде путь с пробелами?
"""C:\Program Files\app.exe""".Можно ли из команды получить текст, который она вывела в консоль?
> out.txt), дождитесь завершения и прочитайте файл текстовым документом.