При работе в клиент-серверном варианте 1С программисты часто сталкиваются с необходимостью запуска внешних исполняемых файлов или скриптов (VBS, Python, PowerShell) непосредственно на стороне сервера. Типичная ситуация: есть сетевая папка, в которой лежат скрипты и файлы данных, и нам нужно инициировать процесс их обработки из кода 1С. Однако здесь возникают подводные камни, связанные с правами доступа, сетевыми путями (UNC) и окружением операционной системы.
Разберем подробно, почему прямая попытка запустить файл по адресу типа \\Server\PriceIM\start.bat часто заканчивается неудачей, и как реализовать надежное решение.
Первое, что нам необходимо проанализировать — это окружение, в котором выполняется серверный код 1С. Рассмотрим основные препятствия:
1C:Enterprise 8 Server Agent) запускается от имени локального пользователя USR1CV8. У этой учетной записи, как правило, нет прав на доступ к сетевым ресурсам (шарам). Даже если вы, залогинившись под собой, видите сетевой диск или папку, сервер 1С их «не видит».cd \\Server\PriceIM приведет к ошибке: "CMD.EXE не поддерживает пути UNC в качестве текущей папки".ЗапуститьПриложение процесс может не подхватить необходимые пути к исполняемым файлам, если они не прописаны в системных переменных.Рассмотрим по шагам наиболее эффективный алгоритм решения этой задачи.
Проанализировав опыт участников обсуждения, мы пришли к выводу, что самый стабильный способ — это копирование всех необходимых компонентов во временную папку на локальном диске сервера, их запуск и последующая очистка. Это избавляет нас от проблем с сетевыми путями и правами доступа к шаре в момент исполнения.
Разберем пример кода, который подготавливает окружение и запускает процесс:
// 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С это реализуется через четыре кавычки """". Это необходимо, так как путь к временным файлам (особенно в профиле пользователя) часто содержит пробелы.
Если копирование файлов невозможно (например, из-за их огромного объема), можно воспользоваться командой pushd. В отличие от cd, команда pushd при передаче ей UNC-пути временно монтирует сетевой ресурс как виртуальный диск и делает его текущим.
Рассмотрим пример формирования такого батника:
@echo off
pushd "\\Server\PriceIM"
cscript.exe upload.vbs 1460717 .\Gruz.txt
popd
Здесь popd автоматически размонтирует временный диск после завершения работы. Однако помните, что это сработает только в том случае, если у пользователя, под которым работает сервер 1С, есть физический доступ к этой сетевой папке.
Проанализируем ситуацию, когда даже правильный код выдает "Ошибка доступа к файлу". Если вы работаете в доменной сети, рекомендуется выполнить следующие действия:
svc_1c_server).\\Server\PriceIM.После этого сервер 1С сможет напрямую обращаться к сетевым ресурсам без предварительного копирования, используя стандартный метод КопироватьФайл или ЗапуститьПриложение.
Вместо создания промежуточных .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.