При работе с системой 1С:Предприятие, когда ваша информационная база развернута на сервере, возникает специфическая задача: необходимо запустить внешнюю программу или скрипт непосредственно из кода 1С. Мы с вами выясним, почему это не так просто, как кажется на первый взгляд, и как правильно подойти к решению этой проблемы. Разберем ключевые аспекты, связанные с размещением файлов, правами доступа, выбором методов запуска и вопросами безопасности.
Первое, что мы должны понять, это то, что контекст выполнения серверного кода 1С отличается от контекста клиентского приложения. Когда вы запускаете внешнюю программу на клиентской машине, она выполняется под учетной записью текущего пользователя и "видит" файловую систему с его точки зрения. На сервере же ситуация иная.
Srvr="srv";Ref="base"; указывает на серверную базу), то и внешняя программа, которую вы хотите запустить, в большинстве случаев должна располагаться на этом же сервере. Альтернативный вариант – это сетевая папка, доступная для сервера 1С.Платформа 1С:Предприятие предоставляет несколько способов для запуска внешних программ. Рассмотрим их подробнее.
ЗапуститьПриложение()Этот метод предназначен для запуска внешних приложений. Однако, при вызове на сервере, его поведение может быть непредсказуемым или он может вызвать исключение, так как серверный процесс не имеет интерактивного рабочего стола для отображения окон.
// Пример использования на сервере (не всегда стабильный)
&НаСервере
Процедура ЗапуститьВнешнююПрограммуНаСервере()
ПутьКПрограмме = "C:\МояПрограмма\program.exe";
ПараметрыЗапуска = "/p1 /p2"; // Если нужны параметры
Попытка
ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска);
Сообщить("Программа успешно запущена (попытка).");
Исключение
Сообщить("Ошибка запуска программы: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
КомандаСистемы()Метод КомандаСистемы() позволяет выполнить любую команду операционной системы, как если бы вы ввели её в командной строке. Это более надежный способ для серверного запуска, но он может привести к появлению черного окна командного интерпретатора.
// Пример использования КомандаСистемы() на сервере
&НаСервере
Процедура ВыполнитьКомандуНаСервере()
ПутьКПрограмме = "C:\МояПрограмма\program.exe";
ПараметрыЗапуска = "/p1 /p2";
Команда = "" + ПутьКПрограмме + " " + ПараметрыЗапуска + ""; // Используем кавычки для путей с пробелами
Попытка
КомандаСистемы(Команда);
Сообщить("Команда системы выполнена (попытка).");
Исключение
Сообщить("Ошибка выполнения команды системы: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
WScript.Shell (для Windows)Для более контролируемого запуска внешних программ на сервере Windows, особенно если нам нужно скрытое выполнение или ожидание завершения, мы можем использовать COM-объект WScript.Shell. Этот подход является одним из самых популярных и надежных.
WScript.Shell.Run(): Используем метод Run(), который позволяет запускать программы с различными параметрами, включая скрытый режим.
// Пример использования WScript.Shell для скрытого запуска на сервере
&НаСервере
Процедура ЗапуститьСкрытоНаСервере()
Перем WshShell;
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
ПутьКПрограмме = "C:\МояПрограмма\program.exe";
ПараметрыЗапуска = "/p1 /p2";
// 0 - скрытый запуск, не дожидаться завершения
// 1 - нормальный запуск, не дожидаться завершения
// True - дождаться завершения программы
// Запуск программы скрыто и ожидание завершения
Команда = "" + ПутьКПрограмме + " " + ПараметрыЗапуска + "";
WshShell.Run(Команда, 0, True);
Сообщить("Программа успешно запущена скрыто и дождалась завершения.");
Исключение
Сообщить("Ошибка запуска программы через WScript.Shell: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если в вашей конфигурации используется БСП, мы можем рассмотреть использование стандартных механизмов, таких как ФайловаяСистема.ЗапуститьПрограмму(). Эти методы, как правило, уже учитывают особенности серверного выполнения и обеспечивают более безопасный и унифицированный подход.
Это один из самых критичных аспектов! Мы часто сталкиваемся с ситуацией, когда программа не запускается, хотя путь к ней указан верно. Причина кроется в правах доступа.
Служба агента сервера 1С:Предприятия (обычно это 1C:Enterprise 8.3 Server Agent) запускается под определенной учетной записью операционной системы. По умолчанию это может быть учетная запись USR1CV8 или аналогичная. Именно эта учетная запись должна иметь необходимые права.
USR1CV8) может не иметь доступа к сетевым папкам домена. В таких случаях часто требуется настроить службу сервера 1С для запуска под доменной учетной записью с соответствующими правами.Log on as a batch job (Вход в качестве пакетного задания) и Log on as a service (Вход в качестве службы). Иногда может потребоваться исключить эту учетную запись из политики Deny access to this computer from the network (Отказать в доступе к этому компьютеру из сети).Важно: Мы настоятельно не рекомендуем выдавать учетной записи службы 1С административные права на сервере. Это является серьезным нарушением безопасности и может привести к нежелательным последствиям.
Помним, что "то, что вы видите, не значит, что 1С сервер это видит". У вас и у сервера 1С гарантированно разные пользователи, и, следовательно, разные права и пути доступа.
Запуск любого внешнего кода на сервере 1С:Предприятия сопряжен с серьезными рисками безопасности. Мы должны всегда об этом помнить и принимать соответствующие меры.
Помимо основных моментов, мы также должны учитывать следующие аспекты:
КомандаСистемы() или WScript.Shell.Run(), убедимся в правильном использовании кавычек для путей и параметров, содержащих пробелы.ПоместитьФайл(), который позволяет разместить файл во временном хранилище на сервере 1С. После обработки файл можно вернуть клиенту с помощью ПолучитьФайл().
// Пример передачи файла на сервер
&НаКлиенте
Процедура ПередатьФайлНаСерверИОбработать()
// Предположим, у нас есть путь к файлу на клиенте
ПутьКФайлуНаКлиенте = "C:\Users\User\Documents\input.txt";
// Помещаем файл во временное хранилище на сервере
АдресФайлаНаСервере = ПоместитьФайл(ПутьКФайлуНаКлиенте, "", "", Истина);
// Теперь вызываем серверную процедуру для обработки файла
ОбработатьФайлНаСервере(АдресФайлаНаСервере);
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресФайла)
// Получаем временный путь к файлу на сервере
ПутьКФайлуНаСервере = ПолучитьИмяВременногоФайла();
ПолучитьФайл(АдресФайла, ПутьКФайлуНаСервере);
// Теперь мы можем запустить внешнюю программу, передав ей ПутьКФайлуНаСервере
// Например, используя WScript.Shell
Перем WshShell;
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
ПутьКПрограмме = "C:\МояПрограмма\file_processor.exe";
Команда = "" + ПутьКПрограмме + " """ + ПутьКФайлуНаСервере + """"; // Путь к файлу тоже в кавычках
WshShell.Run(Команда, 0, True);
Сообщить("Файл обработан внешней программой на сервере.");
Исключение
Сообщить("Ошибка обработки файла на сервере: " + ОписаниеОшибки());
КонецПопытки;
// Удаляем временный файл после обработки
УдалитьФайлы(ПутьКФайлуНаСервере);
КонецПроцедуры
Мы видим, что запуск внешней программы из 1С, когда база находится на сервере, требует комплексного подхода. Мы должны внимательно проанализировать ситуацию, установить программу в правильном месте, выбрать подходящий метод запуска и, самое главное, корректно настроить права доступа для учетной записи службы сервера 1С. Соблюдение этих правил поможет нам успешно решить поставленную задачу и обеспечить стабильную и безопасную работу системы.
← К списку