Как запустить внешнюю программу из 1С, если информационная база находится на сервере?

Программист 1С v8.3 (Управляемые формы)
← К списку

При работе с системой 1С:Предприятие, когда ваша информационная база развернута на сервере, возникает специфическая задача: необходимо запустить внешнюю программу или скрипт непосредственно из кода 1С. Мы с вами выясним, почему это не так просто, как кажется на первый взгляд, и как правильно подойти к решению этой проблемы. Разберем ключевые аспекты, связанные с размещением файлов, правами доступа, выбором методов запуска и вопросами безопасности.

Размещение внешней программы и пути доступа

Первое, что мы должны понять, это то, что контекст выполнения серверного кода 1С отличается от контекста клиентского приложения. Когда вы запускаете внешнюю программу на клиентской машине, она выполняется под учетной записью текущего пользователя и "видит" файловую систему с его точки зрения. На сервере же ситуация иная.

  1. Программа должна быть на сервере: Если ваша информационная база находится на сервере (например, Srvr="srv";Ref="base"; указывает на серверную базу), то и внешняя программа, которую вы хотите запустить, в большинстве случаев должна располагаться на этом же сервере. Альтернативный вариант – это сетевая папка, доступная для сервера 1С.
  2. Разные пути: Путь к программе, который вы видите на своей клиентской машине, может быть совершенно недоступен или выглядеть иначе для сервера 1С. Мы должны прописать путь к программе так, как его "видит" серверная операционная система.
  3. Сетевые ресурсы: Если программа находится в сетевой папке, убедимся, что служба сервера 1С имеет к ней доступ.

Методы запуска внешних приложений из кода 1С

Платформа 1С:Предприятие предоставляет несколько способов для запуска внешних программ. Рассмотрим их подробнее.

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

Этот метод предназначен для запуска внешних приложений. Однако, при вызове на сервере, его поведение может быть непредсказуемым или он может вызвать исключение, так как серверный процесс не имеет интерактивного рабочего стола для отображения окон.


// Пример использования на сервере (не всегда стабильный)
&НаСервере
Процедура ЗапуститьВнешнююПрограммуНаСервере()
    ПутьКПрограмме = "C:\МояПрограмма\program.exe";
    ПараметрыЗапуска = "/p1 /p2"; // Если нужны параметры
    Попытка
        ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска);
        Сообщить("Программа успешно запущена (попытка).");
    Исключение
        Сообщить("Ошибка запуска программы: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Метод КомандаСистемы()

Метод КомандаСистемы() позволяет выполнить любую команду операционной системы, как если бы вы ввели её в командной строке. Это более надежный способ для серверного запуска, но он может привести к появлению черного окна командного интерпретатора.


// Пример использования КомандаСистемы() на сервере
&НаСервере
Процедура ВыполнитьКомандуНаСервере()
    ПутьКПрограмме = "C:\МояПрограмма\program.exe";
    ПараметрыЗапуска = "/p1 /p2";
    Команда = "" + ПутьКПрограмме + " " + ПараметрыЗапуска + ""; // Используем кавычки для путей с пробелами
    Попытка
        КомандаСистемы(Команда);
        Сообщить("Команда системы выполнена (попытка).");
    Исключение
        Сообщить("Ошибка выполнения команды системы: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Использование COM-объекта WScript.Shell (для Windows)

Для более контролируемого запуска внешних программ на сервере Windows, особенно если нам нужно скрытое выполнение или ожидание завершения, мы можем использовать COM-объект WScript.Shell. Этот подход является одним из самых популярных и надежных.

  1. Создание объекта: Сначала мы создаем COM-объект WScript.Shell.
  2. Метод Run(): Используем метод Run(), который позволяет запускать программы с различными параметрами, включая скрытый режим.

// Пример использования WScript.Shell для скрытого запуска на сервере
&НаСервере
Процедура ЗапуститьСкрытоНаСервере()
    Перем WshShell;
    Попытка
        WshShell = Новый COMОбъект("WScript.Shell");
        ПутьКПрограмме = "C:\МояПрограмма\program.exe";
        ПараметрыЗапуска = "/p1 /p2";
        
        // 0 - скрытый запуск, не дожидаться завершения
        // 1 - нормальный запуск, не дожидаться завершения
        // True - дождаться завершения программы
        
        // Запуск программы скрыто и ожидание завершения
        Команда = "" + ПутьКПрограмме + " " + ПараметрыЗапуска + "";
        WshShell.Run(Команда, 0, True); 
        
        Сообщить("Программа успешно запущена скрыто и дождалась завершения.");
        
    Исключение
        Сообщить("Ошибка запуска программы через WScript.Shell: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Использование Библиотеки стандартных подсистем (БСП)

Если в вашей конфигурации используется БСП, мы можем рассмотреть использование стандартных механизмов, таких как ФайловаяСистема.ЗапуститьПрограмму(). Эти методы, как правило, уже учитывают особенности серверного выполнения и обеспечивают более безопасный и унифицированный подход.

Права доступа и учетная запись службы сервера 1С

Это один из самых критичных аспектов! Мы часто сталкиваемся с ситуацией, когда программа не запускается, хотя путь к ней указан верно. Причина кроется в правах доступа.

Служба агента сервера 1С:Предприятия (обычно это 1C:Enterprise 8.3 Server Agent) запускается под определенной учетной записью операционной системы. По умолчанию это может быть учетная запись USR1CV8 или аналогичная. Именно эта учетная запись должна иметь необходимые права.

  1. Права на каталог: Учетная запись службы 1С должна иметь полный доступ к каталогу, где находится запускаемая программа, а также ко всем каталогам, с которыми эта программа будет работать (например, для чтения входных файлов и записи выходных).
  2. Права на запуск: Учетная запись должна иметь разрешение на выполнение самой программы.
  3. Доступ к сетевым ресурсам: Если внешняя программа или файлы, с которыми она работает, расположены в сетевой папке, учетная запись службы 1С должна иметь к ним доступ. Важно помнить, что локальная учетная запись (например, USR1CV8) может не иметь доступа к сетевым папкам домена. В таких случаях часто требуется настроить службу сервера 1С для запуска под доменной учетной записью с соответствующими правами.
  4. Политики безопасности Windows: Нам следует убедиться, что учетная запись службы 1С включена в локальные политики безопасности Windows: Log on as a batch job (Вход в качестве пакетного задания) и Log on as a service (Вход в качестве службы). Иногда может потребоваться исключить эту учетную запись из политики Deny access to this computer from the network (Отказать в доступе к этому компьютеру из сети).

Важно: Мы настоятельно не рекомендуем выдавать учетной записи службы 1С административные права на сервере. Это является серьезным нарушением безопасности и может привести к нежелательным последствиям.

Помним, что "то, что вы видите, не значит, что 1С сервер это видит". У вас и у сервера 1С гарантированно разные пользователи, и, следовательно, разные права и пути доступа.

Аспекты безопасности при запуске внешнего кода на сервере

Запуск любого внешнего кода на сервере 1С:Предприятия сопряжен с серьезными рисками безопасности. Мы должны всегда об этом помнить и принимать соответствующие меры.

  1. Риски: Вредоносный или некорректно написанный код может нанести ущерб данным, операционной системе сервера и даже другим компьютерам в сети.
  2. Ограничения 1С: Платформа 1С по умолчанию запрещает выполнение в небезопасном режиме любого кода на сервере, который не является частью конфигурации.
  3. Контроль над внешними компонентами: Мы должны тщательно контролировать, какие внешние отчеты, обработки, расширения и компоненты подключаются к системе, а также какие внешние приложения запускаются. Пользователи без административных прав не должны иметь возможности загружать и устанавливать внешние компоненты на сервере.
  4. Доверенные лица: Рекомендуется отключать возможность интерактивного открытия внешних отчетов и обработок через меню "Файл – Открыть" для большинства пользователей и предусматривать разрешение этого действия только для доверенных и специально обученных лиц.

Дополнительные рекомендации

Помимо основных моментов, мы также должны учитывать следующие аспекты:

  1. Параметры запуска: При передаче параметров внешней программе через КомандаСистемы() или WScript.Shell.Run(), убедимся в правильном использовании кавычек для путей и параметров, содержащих пробелы.
  2. Передача файлов на сервер: Если внешняя программа должна обработать файл, который находится на клиентской машине, мы сначала должны передать его на сервер. Для этого используем метод ПоместитьФайл(), который позволяет разместить файл во временном хранилище на сервере 1С. После обработки файл можно вернуть клиенту с помощью ПолучитьФайл().
  3. 
    // Пример передачи файла на сервер
    &НаКлиенте
    Процедура ПередатьФайлНаСерверИОбработать()
        // Предположим, у нас есть путь к файлу на клиенте
        ПутьКФайлуНаКлиенте = "C:\Users\User\Documents\input.txt";
            
        // Помещаем файл во временное хранилище на сервере
        АдресФайлаНаСервере = ПоместитьФайл(ПутьКФайлуНаКлиенте, "", "", Истина);
            
        // Теперь вызываем серверную процедуру для обработки файла
        ОбработатьФайлНаСервере(АдресФайлаНаСервере);
    КонецПроцедуры
        
    &НаСервере
    Процедура ОбработатьФайлНаСервере(АдресФайла)
        // Получаем временный путь к файлу на сервере
        ПутьКФайлуНаСервере = ПолучитьИмяВременногоФайла();
        ПолучитьФайл(АдресФайла, ПутьКФайлуНаСервере);
            
        // Теперь мы можем запустить внешнюю программу, передав ей ПутьКФайлуНаСервере
        // Например, используя WScript.Shell
        Перем WshShell;
        Попытка
            WshShell = Новый COMОбъект("WScript.Shell");
            ПутьКПрограмме = "C:\МояПрограмма\file_processor.exe";
            Команда = "" + ПутьКПрограмме + " """ + ПутьКФайлуНаСервере + """"; // Путь к файлу тоже в кавычках
            WshShell.Run(Команда, 0, True);
            Сообщить("Файл обработан внешней программой на сервере.");
        Исключение
            Сообщить("Ошибка обработки файла на сервере: " + ОписаниеОшибки());
        КонецПопытки;
            
        // Удаляем временный файл после обработки
        УдалитьФайлы(ПутьКФайлуНаСервере);
    КонецПроцедуры
    

Мы видим, что запуск внешней программы из 1С, когда база находится на сервере, требует комплексного подхода. Мы должны внимательно проанализировать ситуацию, установить программу в правильном месте, выбрать подходящий метод запуска и, самое главное, корректно настроить права доступа для учетной записи службы сервера 1С. Соблюдение этих правил поможет нам успешно решить поставленную задачу и обеспечить стабильную и безопасную работу системы.

← К списку