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

· 9 мин

Содержание

Внешнюю программу из 1С запускает метод ЗапуститьПриложение("строка команды"), а в формах с асинхронной моделью — НачатьЗапускПриложения(). Внешний отчёт или обработку открывают через Файл → Открыть или программно: файл кладут во временное хранилище, подключают методом ВнешниеОбработки.Подключить() и открывают форму. Для тонкой работы с Windows-программами (скрытое окно, чтение вывода, Excel) используют Новый COMОбъект(...).

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

Метод ЗапуститьПриложение: как запустить программу из 1С

Сигнатура метода:

ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>)
  • 📌 СтрокаКоманды — то, что вы набрали бы в окне «Выполнить» Windows: путь к exe и аргументы.
  • 📂 ТекущийКаталог — рабочая папка запущенной программы. Важна для bat-файлов с относительными путями.
  • ⏳ ДождатьсяЗавершения — Истина, если 1С должна ждать окончания работы программы. По умолчанию Ложь.
  • 🔢 КодВозврата — переменная, в которую попадёт код завершения процесса (только при ожидании).

Самый короткий пример — открыть папку в Проводнике:

&НаКлиенте
Процедура ОткрытьПапкуВыгрузки(Команда)
    ЗапуститьПриложение("explorer.exe ""C:\Обмен\Выгрузка""");
КонецПроцедуры

Если в строку команды передать путь к документу ("D:\Счета\счет_125.pdf"), Windows откроет его программой, сопоставленной с расширением. Так открывают PDF, xlsx, сайты по адресу https://....

Синхронный и асинхронный вызов

В конфигурациях на БСП свойство «Режим использования синхронных вызовов расширений платформы и внешних компонент» обычно стоит в «Не использовать». Тогда синхронный ЗапуститьПриложение на клиенте падает с ошибкой, и нужен асинхронный вариант:

&НаКлиенте
Процедура ЗаархивироватьВыгрузку(Команда)
    СтрокаКоманды = """C:\Program Files\7-Zip\7z.exe"" a ""D:\Архив\выгрузка.zip"" ""D:\Обмен\*.xml""";
    Оповещение = Новый ОписаниеОповещения("ПослеАрхивации", ЭтотОбъект);
    НачатьЗапускПриложения(Оповещение, СтрокаКоманды, "D:\Обмен", Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПослеАрхивации(КодВозврата, ДополнительныеПараметры) Экспорт
    Если КодВозврата = 0 Тогда
        ЗапуститьПриложение("explorer.exe ""D:\Архив""");
    Иначе
        Сообщить("7-Zip завершился с кодом " + Формат(КодВозврата, "ЧН=0; ЧГ=0"));
    КонецЕсли;
КонецПроцедуры

На платформе 8.3.18 и выше доступна запись через Асинх/Ждать, она короче и читается сверху вниз:

&НаКлиенте
Асинх Процедура ЗапуститьСкрипт(Команда)
    КодВозврата = Ждать ЗапуститьПриложениеАсинх("""D:\Скрипты\выгрузка.bat""", "D:\Скрипты", Истина);
    Сообщить("Код возврата: " + Формат(КодВозврата, "ЧН=0; ЧГ=0"));
КонецПроцедуры

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

Аргументы командной строки, пробелы и кавычки в путях

Восемь из десяти «не запускается» — это пробел в пути. Строка C:\Program Files\7-Zip\7z.exe без кавычек Windows разрежет на C:\Program и аргумент Files\7-Zip\7z.exe.

Правило простое: каждый путь с пробелом оборачивается в кавычки, а внутри строки 1С кавычка удваивается.

Что нужно WindowsКак записать в 1С
"C:\Program Files\app.exe""""C:\Program Files\app.exe"""
"C:\Program Files\app.exe" /s "D:\Мои файлы\a.txt""""C:\Program Files\app.exe"" /s ""D:\Мои файлы\a.txt"""
notepad.exe D:\log.txt"notepad.exe D:\log.txt"

Чтобы не путаться в кавычках, собирайте строку через СтрШаблон:

ПутьПрограммы = "C:\Program Files\7-Zip\7z.exe";
ПутьАрхива    = КаталогВременныхФайлов() + "выгрузка.zip";
СтрокаКоманды = СтрШаблон("""%1"" a ""%2"" ""%3""", ПутьПрограммы, ПутьАрхива, "D:\Обмен\*.xml");

Запуск самой 1С с параметрами

Иногда «приложение» — это вторая копия 1С. Полезные ключи 1cv8.exe:

  • 🗂 ENTERPRISE — режим пользователя, DESIGNER — Конфигуратор;
  • 🗄 /F"путь к каталогу базы" — файловая база, /S"сервер\база" — серверная;
  • 👤 /N"Имя" и /P"Пароль" — пользователь и пароль;
  • 📝 /C"строка" — произвольный параметр, внутри базы он доступен через глобальное свойство ПараметрЗапуска;
  • ⚙️ /Execute"путь к .epf" — сразу после входа открыть внешнюю обработку .

Пример ярлыка, который каждую ночь запускает обработку выгрузки через планировщик Windows:

"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" ENTERPRISE /S"srv1c\buh" /N"Регламент" /P"***" /Execute"D:\Обработки\НочнаяВыгрузка.epf" /C"АвтоЗапуск"

В модуле обработки проверяйте ПараметрЗапуска = "АвтоЗапуск", выполняйте работу без диалогов и в конце вызывайте ЗавершитьРаботуСистемы(Ложь). Номер версии в пути подставьте свой: он совпадает с каталогом в C:\Program Files\1cv8\.

Пароль в bat-файле лежит открытым текстом. Заведите для регламента отдельного пользователя с минимальными правами и ограничьте доступ к файлу на уровне NTFS.

Внешние отчёты и обработки: открыть вручную и программно

Ручное открытие файла .epf / .erf

  1. Нажмите кнопку главного меню (значок с тремя полосками слева вверху).
  2. Выберите Файл → Открыть.
  3. Укажите файл .epf (обработка) или .erf (отчёт).
  4. Платформа предупредит о возможной небезопасности файла — подтвердите, если источник надёжный.

Пункт работает, только если у роли пользователя есть права «Интерактивное открытие внешних обработок» и «Интерактивное открытие внешних отчётов». Обычному бухгалтеру их часто не выдают — и правильно.

Регистрация в справочнике дополнительных обработок

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) надёжнее зарегистрировать файл:

КонфигурацияГде регистрируется
Бухгалтерия предприятия 3.0Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки
ЗУП 3.1, УТ 11Раздел НСИ и администрирование (в УТ) или Администрирование (в ЗУП), группа «Печатные формы, отчеты и обработки»

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

Программное подключение

Схема всегда одна: двоичные данные файла во временное хранилище → подключение на сервере → открытие формы на клиенте.

&НаСервере
Функция ПодключитьОбработкуНаСервере(АдресВХранилище)
    // Третий параметр — безопасный режим. Истина — по умолчанию.
    Возврат ВнешниеОбработки.Подключить(АдресВХранилище, , Истина);
КонецФункции

&НаКлиенте
Процедура ОткрытьПодключеннуюОбработку(АдресВХранилище)
    ИмяОбработки = ПодключитьОбработкуНаСервере(АдресВХранилище);
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры

Адрес в хранилище получают, передав файл с клиента асинхронным методом помещения файла, либо на сервере: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлу)). Для отчётов то же самое делает ВнешниеОтчеты.Подключить(), а форма открывается по имени "ВнешнийОтчет." + Имя + ".Форма".

В безопасном режиме код обработки не может запускать программы, создавать COM-объекты и писать файлы. Если обработка из стороннего источника, оставьте Истина. Ложь ставьте только для своего кода, прошедшего проверку.

COM-объекты и OLE Automation: управление Windows-программами

ЗапуститьПриложение запускает программу «вслепую». Когда нужно спрятать окно, прочитать вывод консольной утилиты или заполнить Excel, используют COM. Работает только под Windows: на Linux-сервере и в веб-клиенте COM недоступен.

WScript.Shell: скрытый запуск и чтение вывода

Shell = Новый COMОбъект("WScript.Shell");
// 0 — без окна, Истина — ждать завершения; возвращает код выхода
КодВозврата = Shell.Run("cmd /c ""D:\Скрипты\выгрузка.bat""", 0, Истина);

Если нужен текст, который программа печатает в консоль:

Shell   = Новый COMОбъект("WScript.Shell");
Процесс = Shell.Exec("ping -n 2 srv1c");
Вывод   = Процесс.StdOut.ReadAll();
Сообщить(Вывод);

Exec всегда показывает окно консоли на мгновение — для фоновых задач берите Run с перенаправлением вывода в файл (cmd /c команда > D:\log.txt) и затем читайте файл.

Excel и другие OLE-серверы

Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Книга = Excel.Workbooks.Open("D:\Отчеты\план.xlsx");
Значение = Книга.Worksheets(1).Cells(2, 3).Value;
Книга.Close(Ложь);
Excel.Quit();

Всегда закрывайте книгу и вызывайте Quit() — иначе в диспетчере задач копится процесс EXCEL.EXE на каждый вызов.

1С как COM-сервер

Обратное направление — внешняя программа или другая база 1С подключается к вашей:

  • 🔌 V83.COMConnector — внешнее соединение без интерфейса, быстрый доступ к данным;
  • 🖥 V83.Application — полноценный запуск клиента 1С как сервера автоматизации.
Коннектор = Новый COMОбъект("V83.COMConnector");
База = Коннектор.Connect("Srvr=""srv1c"";Ref=""buh"";Usr=""Обмен"";Pwd=""***"";");

Если объект V83.COMConnector не создаётся, зарегистрируйте библиотеку comcntr.dll нужной версии платформы — из командной строки от имени администратора: regsvr32 "C:\Program Files\1cv8\8.3.24.1586\bin\comcntr.dll". Разрядность важна: 64-битный процесс видит только 64-битную регистрацию.

Клиент или сервер: где на самом деле запустится программа

Директива перед процедурой определяет компьютер, на котором стартует процесс.

Где вызван кодГде запустится программаОт чьего имени
&НаКлиенте, тонкий клиент на ПКНа компьютере пользователяПользователь Windows
&НаКлиенте на терминальном сервереНа терминальном сервере, в сеансе пользователяПользователь RDP
&НаСервере, файловая базаНа компьютере пользователя (сервер — это его процесс 1С)Пользователь Windows
&НаСервере, клиент-серверная базаНа сервере 1СУчётная запись службы, часто USR1CV8
Веб-клиентНа компьютере пользователя, только при установленном расширении для работы с 1С:ПредприятиемПользователь браузера

Из таблицы следуют практические выводы:

  • 🖥 Программа с окном, запущенная на сервере 1С, пользователю не видна: служба работает без рабочего стола. Блокнот «завис» в диспетчере задач сервера — классика.
  • 📁 Пути на сервере — это диски сервера. D:\Обмен пользователя и D:\Обмен сервера — разные папки. Для общей папки используйте UNC-путь \\fileserver\obmen и выдайте права учётке службы.
  • 🔐 Для COM на сервере (Excel.Application) учётке службы нужны права на запуск через DCOM, а у Excel на сервере ещё и профиль пользователя. Лучше обходиться без Excel на сервере: для xlsx в 1С есть ТабличныйДокумент.Прочитать() и запись в формат xlsx.
  • 🧪 Файловый режим обманчив: на тестовой файловой базе серверный код запускает программу у вас на ПК, а в рабочей клиент-серверной — уже на сервере. Тестируйте на базе того же типа.

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

  1. Выясните, под какой учётной записью работает служба «Агент сервера 1С:Предприятия» (оснастка «Службы» Windows, вкладка «Вход в систему»).
  2. Проверьте, что этой учётке доступны программа и рабочая папка.
  3. Если программа работает только «вручную», запустите её от имени той же учётки (runas /user:...) и посмотрите, что она пишет.

Ошибки запуска и диагностика

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

Общий порядок диагностики, если неясно, на каком шаге сбой:

  1. Выведите собранную строку команды через Сообщить(СтрокаКоманды) и скопируйте её в Win+R на той машине, где выполняется код. Не работает там — ошибка в строке, а не в 1С.
  2. Оберните вызов в Попытка ... Исключение и выведите ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) — текст ошибки Windows придёт целиком.
  3. Для bat-файлов перенаправьте вывод в лог: cmd /c ""D:\Скрипты\run.bat"" > D:\Скрипты\run.log 2>&1.
  4. Проверьте журнал регистрации (Администрирование → Обслуживание → Журнал регистрации в БП 3.0) — серверные ошибки фиксируются там с именем пользователя и временем.

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

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

Можно ли запустить программу на компьютере пользователя из фонового или регламентного задания?
Нет. Фоновые и регламентные задания выполняются на сервере, у них нет связи с клиентом. Для запуска у пользователя нужен клиентский код в открытой форме, например в обработчике ожидания.
Как открыть сайт или ссылку из 1С?
Подойдёт метод ПерейтиПоНавигационнойСсылке("https://...") на клиенте: ссылку откроет браузер по умолчанию. ЗапуститьПриложение с адресом тоже работает, но не в веб-клиенте.
Работает ли ЗапуститьПриложение на Linux и macOS?
Да, метод кроссплатформенный: строка команды передаётся оболочке ОС, поэтому пути и команды пишут по правилам этой системы. COM-объекты на Linux и macOS недоступны.
Как запустить внешнюю обработку автоматически при входе в базу?
Ключом /Execute"путь к .epf" в строке запуска 1cv8.exe. Обработка откроется сразу после авторизации; параметры передавайте через ключ /C и читайте из ПараметрЗапуска.
Можно ли запретить пользователям запускать сторонние программы через внешние обработки?
Да: не выдавайте права на интерактивное открытие внешних отчётов и обработок, а нужные файлы регистрируйте в справочнике дополнительных обработок с безопасным режимом.