Запуск внешних программ и обработок из 1С:Предприятия 8.3
Содержание
Внешнюю программу из 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
- Нажмите кнопку главного меню (значок с тремя полосками слева вверху).
- Выберите
Файл → Открыть. - Укажите файл
.epf(обработка) или.erf(отчёт). - Платформа предупредит о возможной небезопасности файла — подтвердите, если источник надёжный.
Пункт работает, только если у роли пользователя есть права «Интерактивное открытие внешних обработок» и «Интерактивное открытие внешних отчётов». Обычному бухгалтеру их часто не выдают — и правильно.
Регистрация в справочнике дополнительных обработок
В типовых конфигурациях на БСП (Бухгалтерия 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С:Предприятия» (оснастка «Службы» Windows, вкладка «Вход в систему»).
- Проверьте, что этой учётке доступны программа и рабочая папка.
- Если программа работает только «вручную», запустите её от имени той же учётки (
runas /user:...) и посмотрите, что она пишет.
Ошибки запуска и диагностика
Общий порядок диагностики, если неясно, на каком шаге сбой:
- Выведите собранную строку команды через
Сообщить(СтрокаКоманды)и скопируйте её вWin+Rна той машине, где выполняется код. Не работает там — ошибка в строке, а не в 1С. - Оберните вызов в
Попытка ... Исключениеи выведитеПодробноеПредставлениеОшибки(ИнформацияОбОшибке())— текст ошибки Windows придёт целиком. - Для bat-файлов перенаправьте вывод в лог:
cmd /c ""D:\Скрипты\run.bat"" > D:\Скрипты\run.log 2>&1. - Проверьте журнал регистрации (
Администрирование → Обслуживание → Журнал регистрациив БП 3.0) — серверные ошибки фиксируются там с именем пользователя и временем.
Если программа запускается из Конфигуратора в режиме отладки, но не у пользователей, сравните права: в отладке вы обычно работаете под администратором и с полными правами.
Частые вопросы
Можно ли запустить программу на компьютере пользователя из фонового или регламентного задания?
Как открыть сайт или ссылку из 1С?
ПерейтиПоНавигационнойСсылке("https://...") на клиенте: ссылку откроет браузер по умолчанию. ЗапуститьПриложение с адресом тоже работает, но не в веб-клиенте.Работает ли ЗапуститьПриложение на Linux и macOS?
Как запустить внешнюю обработку автоматически при входе в базу?
/Execute"путь к .epf" в строке запуска 1cv8.exe. Обработка откроется сразу после авторизации; параметры передавайте через ключ /C и читайте из ПараметрЗапуска.