Как выполнить bat-файл и VBS-скрипт на сервере 1С из сетевого каталога?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе в клиент-серверном варианте 1С программисты часто сталкиваются с необходимостью запуска внешних исполняемых файлов или скриптов (VBS, Python, PowerShell) непосредственно на стороне сервера. Типичная ситуация: есть сетевая папка, в которой лежат скрипты и файлы данных, и нам нужно инициировать процесс их обработки из кода 1С. Однако здесь возникают подводные камни, связанные с правами доступа, сетевыми путями (UNC) и окружением операционной системы.

Разберем подробно, почему прямая попытка запустить файл по адресу типа \\Server\PriceIM\start.bat часто заканчивается неудачей, и как реализовать надежное решение.

Выясняем причины возникновения проблем

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

  1. Учетная запись службы 1С. По умолчанию сервер 1С (служба 1C:Enterprise 8 Server Agent) запускается от имени локального пользователя USR1CV8. У этой учетной записи, как правило, нет прав на доступ к сетевым ресурсам (шарам). Даже если вы, залогинившись под собой, видите сетевой диск или папку, сервер 1С их «не видит».
  2. Ограничения командной строки (CMD.EXE). Командный интерпретатор Windows не умеет работать с UNC-путями в качестве текущего рабочего каталога. Попытка выполнить команду cd \\Server\PriceIM приведет к ошибке: "CMD.EXE не поддерживает пути UNC в качестве текущей папки".
  3. Отсутствие переменных окружения. При запуске через ЗапуститьПриложение процесс может не подхватить необходимые пути к исполняемым файлам, если они не прописаны в системных переменных.

Рассмотрим по шагам наиболее эффективный алгоритм решения этой задачи.

Способ 1. Использование локального временного каталога (рекомендуемый)

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

Разберем пример кода, который подготавливает окружение и запускает процесс:


// 1. Определяем пути к исходным файлам в сетевой шаре
ПутьКШаре = "\\Server\PriceIM\";
ФайлСценария = "upload.vbs";
ФайлДанных = "Gruz.txt";
ИсполняемыйФайл = "curl.exe";

// 2. Получаем путь к локальному временному каталогу сервера
КаталогВременный = КаталогВременныхФайлов();

// 3. Копируем файлы из сети на локальный диск сервера
Попытка
    КопироватьФайл(ПутьКШаре + ФайлСценария, КаталогВременный + ФайлСценария);
    КопироватьФайл(ПутьКШаре + ФайлДанных, КаталогВременный + ФайлДанных);
    КопироватьФайл(ПутьКШаре + ИсполняемыйФайл, КаталогВременный + ИсполняемыйФайл);
Исключение
    ЗаписьЖурналаРегистрации("ЗапускСкрипта", УровеньЖурналаРегистрации.Ошибка, , , 
        "Ошибка копирования файлов: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// 4. Формируем BAT-файл программно для запуска
// Важно: пути с пробелами обязательно берем в кавычки!
ПутьКBat = КаталогВременный + "start.bat";
ТекстBat = Новый ТекстовыйДокумент;
ТекстBat.ДобавитьСтроку("@echo off");
// Устанавливаем текущий каталог, чтобы скрипты находили зависимости рядом
ТекстBat.ДобавитьСтроку("cd /d " + """" + КаталогВременный + """"); 

// Формируем строку запуска cscript.exe
КомандаЗапуска = "cscript.exe " + """" + КаталогВременный + ФайлСценария + """" + 
                 " 1460717 " + """" + КаталогВременный + ФайлДанных + """";
ТекстBat.ДобавитьСтроку(КомандаЗапуска);

ТекстBat.Записать(ПутьКBat, КодировкаТекста.OEM);

// 5. Запускаем приложение
Попытка
    // Используем Истина во втором параметре, если нужно дождаться завершения
    ЗапуститьПриложение(ПутьКBat, КаталогВременный, Истина);
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

Важный момент: при формировании командной строки для cscript.exe или других утилит всегда используйте дополнительные кавычки. В 1С это реализуется через четыре кавычки """". Это необходимо, так как путь к временным файлам (особенно в профиле пользователя) часто содержит пробелы.

Способ 2. Работа с сетевыми путями через PUSHD

Если копирование файлов невозможно (например, из-за их огромного объема), можно воспользоваться командой pushd. В отличие от cd, команда pushd при передаче ей UNC-пути временно монтирует сетевой ресурс как виртуальный диск и делает его текущим.

Рассмотрим пример формирования такого батника:


@echo off
pushd "\\Server\PriceIM"
cscript.exe upload.vbs 1460717 .\Gruz.txt
popd

Здесь popd автоматически размонтирует временный диск после завершения работы. Однако помните, что это сработает только в том случае, если у пользователя, под которым работает сервер 1С, есть физический доступ к этой сетевой папке.

Тонкости настройки прав доступа

Проанализируем ситуацию, когда даже правильный код выдает "Ошибка доступа к файлу". Если вы работаете в доменной сети, рекомендуется выполнить следующие действия:

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

Альтернатива: Использование COM-объекта WScript.Shell

Вместо создания промежуточных .bat файлов мы можем использовать возможности Windows Script Host напрямую из 1С. Это более «чистый» программный способ, позволяющий, например, скрыть окно консоли или получить код возврата процесса.

Пример использования WScript.Shell:


Shell = Новый COMОбъект("WScript.Shell");
// Параметр 0 скрывает окно, Истина - ожидание завершения
КодВозврата = Shell.Run("cscript.exe ""C:\Temp\script.vbs""", 0, Истина);

Если КодВозврата <> 0 Тогда
    Сообщить("Скрипт завершился с ошибкой: " + КодВозврата);
КонецЕсли;

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

Если скрипт запускается, но «ничего не происходит» или вылетает непонятная ошибка, воспользуйтесь перенаправлением вывода в файл. Измените строку запуска в вашем батнике следующим образом:

cscript.exe upload.vbs > log.txt 2>&1

После выполнения вы сможете прочитать файл log.txt из 1С и увидеть реальный текст ошибки, который выдает консоль (включая ошибки синтаксиса VBS или отсутствие прав на запись). Это значительно ускоряет поиск причины неисправности при работе регламентных заданий на сервере.

Также обратите внимание на разрядность. На 64-битном сервере Windows есть две версии cscript.exe. Если ваш скрипт использует 32-битные драйверы или COM-объекты, вызывайте интерпретатор принудительно из папки C:\Windows\SysWOW64\cscript.exe.

← На главную