Запуск внешних приложений из 1С:Предприятие — задача, с которой рано или поздно сталкивается каждый разработчик.hether вам нужно открыть Excel для экспорта данных, запустить PDF-ридер для печати документа или интегрироваться с специализированным ПО (например, AutoCAD или КриптоПро), без этого функционала не обойтись. В отличие от стандартных операций внутри платформы, работа с внешними программами требует знания нюансов Windows API, COM-объектов и даже базовых команд cmd.

В этой статье мы разберём 5 рабочих способов запуска внешних приложений из 1С 8.3, включая актуальные примеры кода для каждой методики. Вы узнаете, как обойти типичные ошибки (например, Ошибка при вызове конструктора или проблемы с правами доступа), какие инструменты использовать для отладки, и почему некоторые программы отказываются запускаться из-под тонкого клиента. Материал будет полезен как начинающим разработчикам, так и опытным специалистам, которым нужно оптимизировать интеграцию 1С с внешним ПО.

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

📊 Какой способ запуска внешних приложений вы используете чаще?
COM-объекты
Командная строка (cmd)
PowerShell
WinAPI
Другой

1. Запуск через COM-объект WScript.Shell

Самый распространённый и универсальный способ — использование COM-объекта WScript.Shell. Он позволяет запускать исполняемые файлы (.exe, .bat), открывать документы по умолчанию и даже передавать параметры командной строки. Основное преимущество — простота реализации и поддержка во всех версиях 1С:Предприятие 8.3.

Пример кода для запуска Блокнота:

Попытка

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

WScriptShell.Run("notepad.exe", 1, Истина);

Исключение

Сообщить("Ошибка запуска: " + ОписаниеОшибки());

КонецПопытки;

Разберём параметры метода Run:

  • 📌 Первый параметр — путь к исполняемому файлу или команде. Можно указать полный путь (например, "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE") или просто имя программы, если она находится в системной переменной PATH.
  • 📌 Второй параметр — режим отображения окна:
    • 0 — скрыто;
    • 1 — нормальное окно (активное);
    • 2 — свёрнутое;
    • 3 — развёрнутое.
  • 📌 Третий параметр — ожидание завершения процесса (Истина/Ложь). Если Истина, 1С будет ждать, пока программа не закроется.

⚠️ Внимание: При запуске из тонкого клиента или веб-клиента этот метод может не сработать из-за ограничений безопасности. В таких случаях используйте серверный вызов или альтернативные способы (см. раздел 4).

Убедитесь, что программа установлена на клиентском ПК|

Проверьте права доступа к папке с исполняемым файлом|

Используйте полные пути, если программа не в PATH|

Тестируйте код в отладочном режиме (F5)

-->

2. Запуск через командную строку (cmd)

Если вам нужно выполнить сложную команду (например, с передачей аргументов или перенаправлением вывода), удобнее использовать вызов командной строки. Этот метод гибче, чем WScript.Shell, и позволяет работать с stdin/stdout.

Пример: запуск PowerShell-скрипта для создания резервной копии базы 1С:

Команда = "powershell.exe -Command ""& {Get-Date -Format 'yyyy-MM-dd'} > C:\backup\log.txt""";

ЗапуститьПриложение(Команда);

Для универсального вызова командной строки создайте общую процедуру:

Процедура ЗапуститьПриложение(Команда)

Попытка

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

WshShell.Run("cmd.exe /C " + Команда, 0, Ложь);

Исключение

Сообщить("Ошибка: " + ОписаниеОшибки());

КонецПопытки;

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

🔹 Когда использовать этот метод:

  • 🔧 Для запуска .bat-файлов с параметрами;
  • 🔧 Если нужно перенаправить вывод в файл (> log.txt);
  • 🔧 Для выполнения сетевых команд (ping, net use).
⚠️ Внимание: При передаче путей с пробелами обязательно заключайте их в кавычки: """C:\Program Files\MyApp\app.exe"" param1". Иначе команда будет разбита на части.
Способ Поддержка тонкого клиента Возможность передачи параметров Ожидание завершения
WScript.Shell.Run ❌ Нет ✅ Да ✅ Да
cmd.exe /C ❌ Нет ✅ Да ❌ Нет
Process.Start() (через .NET) ⚠️ Частично ✅ Да ✅ Да
PowerShell скрипт ❌ Нет ✅ Да ✅ Да

3. Использование PowerShell для сложных задач

PowerShell — мощный инструмент для автоматизации, и его можно интегрировать с 1С. Например, если вам нужно:

  • 📁 Архивировать файлы перед отправкой;
  • 🔄 Перезапустить службу Windows;
  • 📊 Собрать данные о системе.

Пример: запуск скрипта для сжатия папки в ZIP:

ТекстСкрипта = "

$source = 'C:\1C\Exchange'

$destination = 'C:\1C\Backup\archive.zip'

Compress-Archive -Path $source -DestinationPath $destination -Force

";

ЗапуститьPowerShellСкрипт(ТекстСкрипта);

Процедура для выполнения PowerShell-кода:

Процедура ЗапуститьPowerShellСкрипт(Скрипт)

Попытка

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

PS.ShellExecute("powershell.exe", "-NoProfile -ExecutionPolicy Bypass -Command """ + Скрипт + """", "", "open", 1);

Исключение

Сообщить("Ошибка PowerShell: " + ОписаниеОшибки());

КонецПопытки;

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

🔹 Преимущества PowerShell:

  • 🛠️ Доступ к WIN32_API и .NET;
  • 📂 Удобная работа с файловой системой;
  • 🔒 Возможность обхода ограничений UAC (при правильных правах).
💡

Если скрипт содержит кавычки, экранируйте их удвоением: """" вместо "". Например: -Command ""Write-Host 'Привет'"

4. Запуск через WinAPI (для опытных)

Для максимального контроля над запускаемыми процессами можно использовать Windows API через внешние компоненты (например, AddIn) или 1Script. Этот метод сложнее остальных, но позволяет:

  • 🎯 Запускать процессы от имени другого пользователя;
  • 🔄 Получать PID процесса для дальнейшего управления;
  • 🛡️ Обходить ограничения тонкого клиента.

Пример кода с использованием внешней компоненты (например, OneScript.WinApi):

Перем m_Kernel32;

Перем m_CreateProcessA;

Процедура ИнициализироватьWinAPI()

m_Kernel32 = ВнешняяКомпонента.Подключить("kernel32.dll");

m_CreateProcessA = m_Kernel32.ПолучитьФункцию("CreateProcessA");

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

Процедура ЗапуститьПроцесс(ПутьКФайлу)

ИнициализироватьWinAPI();

Результат = m_CreateProcessA.Вызвать(..., ПутьКФайлу, ...); // Упрощено для примера

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

⚠️ Внимание: Работа с WinAPI требует знания C/C++ и структур Windows. Ошибки в коде могут привести к краху клиента 1С или утечкам памяти. Используйте этот метод только при необходимости!

Что делать, если внешняя компонента не подключается?

Если при подключении DLL вы получаете ошибку Не найден указанный модуль, проверьте:

1. Разрядность компоненты (x86/x64) — она должна совпадать с разрядностью 1С.

2. Наличие зависимости (например, Microsoft Visual C++ Redistributable).

3. Права на доступ к файлу DLL.

4. Путь к файлу — используйте полный путь (например, C:\AddIns\MyComponent.dll).

5. Запуск через .NET (Process.Start)

Если ваша конфигурация работает под управлением управляемого приложения (например, на сервере 1С:Предприятие), вы можете использовать .NET-интеграцию для запуска процессов. Это актуально для серверных задач, где WScript.Shell недоступен.

Пример кода:

Попытка

Process = Новый NETОбъект("System.Diagnostics.Process");

ProcessStartInfo = Новый NETОбъект("System.Diagnostics.ProcessStartInfo");

ProcessStartInfo.FileName = "calc.exe";

ProcessStartInfo.UseShellExecute = Истина;

Process.Start(ProcessStartInfo);

Исключение

Сообщить("Ошибка .NET: " + ОписаниеОшибки());

КонецПопытки;

🔹 Особенности метода:

  • 🖥️ Работает только на сервере или в толстом клиенте с правами .NET;
  • 🔧 Позволяет гибко настраивать параметры процесса (рабочий каталог, переменные окружения);
  • 📡 Можно получать выходной поток (StandardOutput).
⚠️ Внимание: Для работы с .NET в 1С необходимо подключить сборки в конфигураторе: Сервис → Параметры → Загрузка сборок .NET. Без этого код не будет выполняться.
💡

Для серверных задач (фоновые задания, регламентные операции) используйте .NET или WinAPI. COM-объекты в таких случаях работать не будут.

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

Даже опытные разработчики сталкиваются с проблемами при запуске внешних приложений. Рассмотрим самые частые ошибки и способы их исправления:

1. "Ошибка при вызове конструктора (COMОбъект)"

  • 🔹 Причина: Отсутствует регистрация WScript.Shell или блокировка антивирусом.
  • 🔹 Решение:
    • Зарегистрируйте библиотеку: regsvr32 wshom.ocx;
    • Добавьте исключение в антивирус для wscript.exe;
    • Проверьте права пользователя (требуются права администратора для регистрации).

2. "Не удалось найти указанный файл"

  • 🔹 Причина: Неверный путь к файлу или отсутствие программы на клиентском ПК.
  • 🔹 Решение:
    • Используйте ПолучитьИмяВременногоФайла() для тестирования путей;
    • Проверьте наличие программы через НайтиФайлы();
    • Укажите полный путь (например, "C:\Windows\System32\calc.exe").

3. Программа запускается, но не видна пользователю

  • 🔹 Причина: Неправильный параметр отображения окна (0 — скрыто).
  • 🔹 Решение: Установите второй параметр Run в 1 (нормальное окно).

📌 Дополнительная диагностика:

  • 🛠️ Проверьте журналы Windows (Event Viewer) на ошибки запуска;
  • 🛠️ Используйте Process Monitor для отслеживания вызовов;
  • 🛠️ Тестируйте команду напрямую в cmd перед внедрением в 1С.

FAQ: Частые вопросы по запуску внешних приложений

Можно ли запустить внешнюю программу из веб-клиента 1С?

Нет, в веб-клиенте и тонком клиенте запуск внешних приложений через WScript.Shell или cmd заблокирован по соображениям безопасности. Альтернативные варианты:

  • Использовать серверный вызов (если программа установлена на сервере);
  • Разработать веб-сервис, который будет запускать приложение на стороне клиента;
  • Применить ActiveX (только для Internet Explorer, устаревший метод).
Как передать параметры в запускаемую программу?

Параметры передаются через пробел после пути к файлу. Пример:

WScriptShell.Run("notepad.exe C:\temp\file.txt", 1, Истина);

Для сложных параметров (с пробелами или кавычками) используйте экранирование:

WScriptShell.Run("""C:\Program Files\MyApp\app.exe"" --param ""value with spaces""", 1, Истина);
Почему программа запускается, но сразу закрывается?

Это происходит, если:

  • Вы не указали Истина в третьем параметре Run (1С не ждёт завершения);
  • Программа завершается с ошибкой (проверьте код возврата через Process.ExitCode в .NET);
  • Это консольное приложение без команды pause.

Решение: добавьте cmd /K перед командой, чтобы окно не закрывалось:

WScriptShell.Run("cmd /K notepad.exe", 1, Истина);
Как запустить программу от имени администратора?

Для этого нужно:

  1. Создать .manifest-файл с запросом прав администратора;
  2. Или использовать PowerShell с параметром -Verb RunAs:
Попытка

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

Команда = "powershell Start-Process notepad -Verb RunAs";

WScriptShell.Run("cmd /C " + Команда, 1, Истина);

Исключение

Сообщить("Ошибка: " + ОписаниеОшибки());

КонецПопытки;

⚠️ Обратите внимание: это вызовет окно UAC, что может прервать автоматический процесс.

Можно ли получить вывод запущенной программы в 1С?

Да, но только через .NET или внешние компоненты. Пример на .NET:

Process = Новый NETОбъект("System.Diagnostics.Process");

ProcessStartInfo = Новый NETОбъект("System.Diagnostics.ProcessStartInfo");

ProcessStartInfo.FileName = "cmd.exe";

ProcessStartInfo.Arguments = "/C dir C:\";

ProcessStartInfo.RedirectStandardOutput = Истина;

ProcessStartInfo.UseShellExecute = Ложь;

Process.StartInfo = ProcessStartInfo;

Process.Start();

Вывод = Process.StandardOutput.ReadToEnd();

Сообщить(Вывод);

Для WScript.Shell получение вывода невозможно — он не поддерживает перенаправление потоков.