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

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

В процессе разработки и администрирования систем на платформе 1С:Предприятие часто возникает необходимость автоматизации системных процессов. Это может быть выгрузка данных во внешние СУБД, архивация файлов, запуск сторонних консольных утилит или интеграция с операционной системой сервера. Одним из наиболее простых и эффективных способов решения таких задач является создание и запуск файлов сценариев командной строки Windows (файлов с расширением .bat или .cmd).

В этой статье мы подробно и по шагам разберем, как программно сформировать такой файл на стороне сервера, корректно записать его в нужный каталог с учетом прав доступа и кодировок, а также рассмотрим особенности выполнения системных команд в различных клиентах (включая веб-клиент) и правила работы в безопасном режиме платформы.

Шаг 1. Программное создание и запись .bat-файла на сервере

Для создания текстовых файлов на стороне сервера в 1С применяется специализированный объект ЗаписьТекста. При формировании исполняемых файлов для операционной системы Windows необходимо учитывать несколько важнейших нюансов.

Нюанс первый: Кодировка текста. По умолчанию файлы в 1С создаются в кодировке UTF-8. Однако стандартный интерпретатор командной строки Windows cmd.exe по умолчанию использует кодировку OEM-866 (CP866) для русскоязычных операционных систем. Если в вашем файле сценария будут присутствовать русские буквы (например, в путях к файлам или комментариях), запуск скрипта в кодировке UTF-8 приведет к ошибкам распознавания символов. Чтобы этого избежать, при инициализации объекта ЗаписьТекста обязательно нужно явно указывать кодировку КодировкаТекста.OEM866.

Нюанс второй: Права доступа. Серверная служба 1С:Предприятия (обычно работающая под учетной записью USR1CV8) должна иметь права на запись и выполнение файлов в целевом каталоге на сервере. Если прав недостаточно, платформа вызовет исключение. Наиболее надежным решением является запись файлов во временную папку сервера с помощью функции КаталогВременныхФайлов().

Рассмотрим практический пример создания bat-файла на сервере:


// Определяем путь к файлу на сервере
ИмяФайла = "RunIntegration.bat";
ПутьККаталогу = КаталогВременныхФайлов();
ПолныйПутьКФайлу = ПутьККаталогу + ИмяФайла;

// Создаем объект записи текста с кодировкой OEM-866
ЗаписьТекста = Новый ЗаписьТекста(ПолныйПутьКФайлу, КодировкаТекста.OEM866);

// Записываем команды командной строки
ЗаписьТекста.ЗаписатьСтроку("@echo off");
ЗаписьТекста.ЗаписатьСтроку("echo Начинаем процесс интеграции...");
ЗаписьТекста.ЗаписатьСтроку("xcopy ""C:\SourceData\*.*"" ""D:\BackupData\"" /Y /E");
ЗаписьТекста.ЗаписатьСтроку("echo Процесс успешно завершен!");

// Обязательно закрываем файл, чтобы сохранить изменения и освободить ресурсы
ЗаписьТекста.Закрыть();

В результате выполнения данного кода во временном каталоге сервера будет создан готовый к запуску файл RunIntegration.bat.

Шаг 2. Запуск системных команд и bat-файлов на сервере

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

Чтобы запустить исполняемый файл или системную команду непосредственно на сервере под управлением ОС Windows, мы используем программный доступ к возможностям операционной системы через COM-объект WScript.Shell. Рассмотрим, как это реализовать:


// Инициализируем COM-объект для работы со скриптами Windows
Шелл = Новый COMОбъект("WScript.Shell");

// Формируем команду запуска нашего bat-файла
// Символ /c указывает cmd.exe выполнить команду и завершить работу консоли
КомандаЗапуска = "cmd.exe /c """ + ПолныйПутьКФайлу + """";

// Запускаем исполнение
// Второй параметр "0" означает запуск в скрытом режиме (окно консоли не будет отображаться)
// Третий параметр "Истина" указывает платформе ожидать завершения работы скрипта перед продолжением кода 1С
Шелл.Run(КомандаЗапуска, 0, Истина);

Использование параметра ожидания (третий параметр метода Run) крайне важно, если ваш дальнейший алгоритм в 1С зависит от результатов работы bat-файла (например, если скрипт должен был сформировать файл ответа, который вам нужно прочитать).

Особенности работы в Веб-клиенте

Веб-клиент работает в контексте интернет-браузера, что накладывает жесткие ограничения на безопасность. Напрямую запустить системную команду или исполняемый файл на локальном компьютере пользователя из веб-клиента невозможно, так как браузер работает в изолированной среде ("песочнице").

Для решения этой задачи в веб-клиенте необходимо соблюдение двух условий:

  1. В браузере пользователя должно быть установлено и настроено расширение работы с файлами.
  2. Вместо классических синхронных методов необходимо использовать асинхронные аналоги, такие как ЗапуститьПриложениеАсинх().

Проанализируем пример асинхронного запуска приложения на стороне клиента:


&НаКлиенте
АсинхроннаяПроцедура ЗапуститьЛокальноеПриложение()
    
    #Если ВебКлиент Тогда
        // Проверяем подключение расширения работы с файлами
        Подключено = Ждать ПодключитьРасширениеРаботыСФайлами();
        Если Не Подключено Тогда
            Предупреждение("Для запуска внешних приложений необходимо установить расширение работы с файлами!");
            Возврат;
        КонецЕсли;
    #КонецЕсли
    
    ПараметрыЗапуска = Новый ПараметрыЗапускаПриложения;
    ПараметрыЗапуска.ТекущийКаталог = "C:\Temp";
    
    // Запускаем локальный скрипт на компьютере пользователя
    Ждать ЗапуститьПриложениеАсинх("C:\Temp\local_script.bat", ПараметрыЗапуска);
    
КонецПроцедуры

Важно помнить: данный код запустит файл на компьютере пользователя. Если вам требуется выполнить скрипт именно на сервере по инициативе пользователя из веб-клиента, то веб-клиент должен вызвать серверный метод (например, через неконтекстный серверный вызов), который уже выполнит процедуру создания и запуска файла на сервере, как описано в Шаге 1 и Шаге 2.

Управление безопасным режимом и профилями безопасности

Безопасный режим в 1С:Предприятии блокирует любые потенциально опасные действия программного кода: создание COM-объектов (включая WScript.Shell), обращение к файловой системе сервера за пределами временных папок, доступ к сетевым ресурсам и запуск внешних компонент. Если ваш код выполняется внутри безопасного режима, попытка записать файл или вызвать консоль Windows завершится аварийно.

Выясним, как правильно управлять безопасным режимом:

  1. Программное отключение: Если код уже выполняется в безопасном режиме, вызвать функцию УстановитьБезопасныйРежим(Ложь) внутри этого же контекста невозможно. Платформа пресекает любые попытки самовольного снятия ограничений.
  2. Подключение внешних обработок: Если логика работы с bat-файлами вынесена во внешнюю обработку, ее необходимо подключать программно с явным указанием отключения безопасного режима. Для этого используется метод менеджера внешних обработок:
    
    ВнешниеОбработки.Подключить(ПутьКФайлуОбработки, , Ложь); // Третий параметр "Ложь" отключает безопасный режим
    
    Данный метод доступен только администраторам системы или в привилегированном режиме модуля.
  3. Профили безопасности: В клиент-серверном варианте работы наиболее правильным подходом является настройка Профилей безопасности в консоли администрирования кластера серверов 1С. Это позволяет точечно разрешить конкретной внешней обработке или коду доступ только к определенным каталогам на диске сервера или к конкретным COM-объектам, сохраняя общую безопасность системы на высоком уровне.

Опасность использования произвольного кода через Выполнить()

Наличие в пользовательском режиме поля ввода, код из которого напрямую передается в функцию Выполнить() на сервере, представляет собой критическую уязвимость информационной безопасности (Arbitrary Code Execution). Неавторизованный или неквалифицированный пользователь может случайно или намеренно ввести деструктивный код (например, удаление файлов базы данных, запуск вредоносного ПО или шифровальщиков через командную строку).

Если бизнес-требования все же обязывают вас предоставить пользователям возможность написания собственных формул или простых скриптов, их исполнение необходимо строго изолировать. Сделать это можно с помощью принудительного включения безопасного режима перед запуском пользовательского алгоритма:


// Запоминаем текущее состояние безопасного режима
ПредыдущийРежим = БезопасныйРежим();

// Включаем безопасный режим для изоляции кода
УстановитьБезопасныйРежим(Истина);

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

// Возвращаем исходное состояние безопасного режима
УстановитьБезопасныйРежим(ПредыдущийРежим);

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

← На главную