Как выполнить JS-скрипт через WScript или CScript на сервере 1С

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

В процессе разработки часто возникает необходимость взаимодействия 1С с внешними компонентами или скриптами. Одной из классических задач является запуск JavaScript (JS) файлов для генерации QR-кодов или обработки данных. Однако при попытке выполнить такой скрипт в серверном контексте программисты сталкиваются с рядом неочевидных проблем: от ошибок доступа до "зависания" процессов. В этой статье мы подробно разберем, как правильно организовать работу с wscript и cscript на стороне сервера.

Анализируем контекст выполнения: WScript или CScript?

Первое, на что нам стоит обратить внимание — это выбор интерпретатора. В ОС Windows по умолчанию доступны два варианта: wscript.exe и cscript.exe. Разберем разницу между ними в контексте сервера 1С.

Процесс wscript.exe ориентирован на работу в графическом интерфейсе. Если скрипт выдаст ошибку или интерактивное сообщение (например, через WScript.Echo), на сервере это сообщение никто не увидит. Процесс просто "повиснет" в Session 0, ожидая реакции пользователя, которой никогда не будет. Это приведет к утечке памяти и блокировке ресурсов.

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

Проблема прав доступа и путей

Проанализируем типичную ошибку из обсуждения. Автор пытается обратиться к файлу по пути: C:\Users\wrooo\AppData\Local\Temp\v8_71A8_45.bmp. Когда мы запускаем код на клиенте, это работает. Но как только код переносится в Общий модуль с признаком "Сервер", ситуация кардинально меняется.

Сервер 1С (служба ragent) обычно запускается под специальной учетной записью, например, USR1CV8. Эта учетная запись:

  1. Не имеет доступа к папке AppData конкретного пользователя wrooo.
  2. Имеет свои собственные временные папки.
  3. Может не обладать правами на выполнение файлов в произвольных директориях (например, в корне диска C:\QR\).

Чтобы решить эту проблему, нам необходимо использовать функцию КаталогВременныхФайлов(). Она вернет путь к временной папке именно того пользователя, под которым работает служба сервера. Разберем правильный подход: файлы JS и входные данные должны быть скопированы в доступную серверу директорию перед запуском.

Методы запуска из 1С: ЗапуститьПриложение vs WScript.Shell

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


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

// Формируем команду с использованием cscript
// Обратите внимание на кавычки вокруг путей
Команда = "cscript.exe //NoLogo ""C:\QR\JS.js"" ""0"" ""12345"" ""C:\Temp\result.bmp""";

// Метод Run позволяет дождаться завершения (параметр Истина)
// И скрыть окно (параметр 0)
Результат = Шелл.Run(Команда, 0, Истина);

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

В данном примере мы используем параметр 0 для скрытия окна и Истина, чтобы серверный поток 1С дождался, пока скрипт отработает. Это критично, если следующим шагом в 1С идет чтение созданного файла изображения.

Работа с кавычками в командной строке

Выясним причину, по которой многие команды не срабатывают с первого раза. Это "проблема кавычек". В 1С кавычка внутри строки экранируется другой кавычкой. Если путь к файлу содержит пробелы (например, C:\Program Files\...), операционная система не поймет команду без обрамляющих кавычек.

Рассмотрим, как правильно сконструировать строку запуска:


ПутьКИнтерпретатору = "cscript.exe";
ПутьКФайлуJS = """C:\QR\My Script.js"""; // Тройные кавычки для корректного пути
Параметры = """0"" ""Текст сообщения"" ""C:\Temp\Output.png""";

ПолнаяКоманда = ПутьКИнтерпретатору + " " + ПутьКФайлуJS + " " + Параметры;
// В итоге получим: cscript.exe "C:\QR\My Script.js" "0" "Текст сообщения" "C:\Temp\Output.png"

Динамическое изменение параметров скрипта

Если передача аргументов через командную строку вызывает сложности (например, из-за специфических символов в тексте), проанализируем альтернативный вариант, предложенный в обсуждении. Мы можем подготовить "шаблон" JS-файла, считать его в 1С как текст, заменить маркеры на реальные значения и сохранить под новым именем перед запуском.

Посмотрим на пример реализации:


// 1. Читаем шаблон скрипта
ТекстСкрипта = Новый ТекстовыйДокумент;
ТекстСкрипта.Прочитать("C:\QR\Template.js");

// 2. Заменяем параметры
ПолныйТекст = ТекстСкрипта.ПолучитьТекст();
ПолныйТекст = СтрЗаменить(ПолныйТекст, "{PARAM_LEVEL}", "0");
ПолныйТекст = СтрЗаменить(ПолныйТекст, "{PARAM_STR}", "121345");
ПолныйТекст = СтрЗаменить(ПолныйТекст, "{PARAM_FILE}", "C:/Temp/v8_result.bmp");

// 3. Сохраняем временный файл для исполнения
ВременныйJS = КаталогВременныхФайлов() + "exec.js";
НовыйСкрипт = Новый ТекстовыйДокумент;
НовыйСкрипт.УстановитьТекст(ПолныйТекст);
НовыйСкрипт.Записать(ВременныйJS, КодировкаТекста.ANSI);

// 4. Запускаем без аргументов
ЗапуститьПриложение("cscript.exe //NoLogo " + """" + ВременныйJS + """");

В самом JS-файле в таком случае вместо WScript.Arguments.Item(0) будут стоять жестко прописанные значения или наши маркеры.

Особенности 64-битных систем

Проанализируем ситуацию, когда сервер 1С имеет 64-битную архитектуру. Если ваш JS-файл внутри себя обращается к 32-битным COM-объектам, стандартный запуск cscript.exe может выдать ошибку, так как по умолчанию вызовется 64-битный интерпретатор из System32. В этом случае следует явно указывать путь к 32-битной версии:

C:\Windows\SysWOW64\cscript.exe

Современные альтернативы

В завершение разберем вопрос целесообразности. Использование wscript для генерации QR-кодов — это метод, пришедший из старых версий платформы. Начиная с версии 1С 8.3.10, платформа обладает мощными встроенными средствами. Если ваша задача — генерация штрихкодов, рассмотрите возможность использования ОбъектаКартинка и методов работы с двухмерными штрихкодами внутри самой 1С. Это избавит вас от зависимости от операционной системы, проблем с правами на файлы и повысит общую надежность системы.

Резюмируем наши действия: при работе на сервере всегда используем cscript.exe, внимательно следим за правами пользователя USR1CV8 на папки, экранируем пути кавычками и по возможности используем WScript.Shell для контроля выполнения.

← На главную