Как установить переменную окружения из 1С 7.7 с помощью WSH

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке сложных систем интеграции или автоматизации бэкапов на платформе 1С:Предприятие 7.7 часто возникает необходимость взаимодействия с внешней средой Windows. Одной из таких задач является установка переменных окружения (environment variables), например, параметров HTTP_PROXY или HTTPS_PROXY, чтобы последующие вызовы консольных утилит могли работать через прокси-сервер. Однако программисты часто сталкиваются с тем, что стандартные средства встроенного языка 1С 7.7 не позволяют напрямую изменять значения в коллекциях WScript.Shell.

В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим надежные способы её решения с использованием MSScriptControl и JScript.

Анализ проблемы: почему прямой код в 1С 7.7 не работает

Рассмотрим типичную попытку решения задачи. Программист пытается использовать объект WScript.Shell и его свойство Environment. В языке JScript или VBScript это выглядит просто, но при переносе в 1С 7.7 возникают ошибки.

Проанализируем ошибочный код:


WshShell = СоздатьОбъект("WScript.Shell");
WshEnvir = WshShell.Environment("PROCESS");
// Попытка 1:
WshEnvir("HTTP_PROXY") = "http://user:pass@proxy:3128"; // Ошибка: "Процедура не обнаружена"
// Попытка 2:
WshEnvir.HTTP_PROXY = "http://user:pass@proxy:3128";    // Ошибка: "Поле агрегатного объекта не обнаружено"

Причина неудач кроется в архитектуре платформы 1С 7.7. Объект WshEnvironment является коллекцией. Чтобы изменить значение переменной, нужно обратиться к параметризованному свойству Item. В современных языках программирования обращение к Item происходит по умолчанию при указании скобок. Однако встроенный язык 1С 7.7 не умеет передавать параметры свойствам COM-объектов при их записи. Он понимает только чтение таких свойств, а попытка присваивания через знак равенства воспринимается компилятором некорректно.

Решение через MSScriptControl (JScript)

Наиболее элегантный способ обойти ограничение — делегировать установку переменных специализированному скриптовому движку. Для этого мы воспользуемся объектом MSScriptControl.ScriptControl. Он позволяет исполнить фрагмент кода на языке JScript или VBScript прямо внутри сессии 1С.

Рассмотрим пошагово, как реализовать это решение:

  1. Создадим объект ScriptControl.
  2. Установим язык исполнения (JScript).
  3. Напишем функцию, которая инициализирует WScript.Shell и устанавливает нужные переменные.
  4. Вызовем эту функцию из 1С.

Важный технический нюанс: Внутри MSScriptControl объект WScript (который доступен в обычных .vbs или .js файлах) отсутствует. Поэтому вместо WScript.CreateObject необходимо использовать конструктор new ActiveXObject.

Вот рабочий пример кода для 1С 7.7:


Процедура УстановитьПроксиПеременные()
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.Language = "JScript";
    
    // Формируем текст скрипта
    // Используем new ActiveXObject вместо WScript.CreateObject
    ТекстКода = "
    |function SetEnvironmentVariables(proxyUrl) {
    |    var shell = new ActiveXObject('WScript.Shell');
    |    var envir = shell.Environment('PROCESS');
    |    envir('HTTP_PROXY') = proxyUrl;
    |    envir('HTTPS_PROXY') = proxyUrl;
    |    return true;
    |}";
    
    Скрипт.AddCode(ТекстКода);
    
    // Вызываем функцию с нужным параметром
    АдресПрокси = "http://user:pass@proxy:3128";
    Результат = Скрипт.Run("SetEnvironmentVariables", АдресПрокси);
    
    Если Результат = 1 Тогда
        Сообщить("Переменные окружения успешно установлены");
    КонецЕсли;
КонецПроцедуры

Разбор типов окружения (Scopes)

В примере выше мы использовали параметр "PROCESS". Выясним, на что это влияет и какие еще варианты существуют. Объект Environment в WSH поддерживает четыре области видимости:

Для задач бэкапа или временной настройки прокси значение "PROCESS" является оптимальным.

Альтернативный метод: Использование командной строки (CMD)

Если вам не хочется использовать MSScriptControl, существует обходной путь через командный интерпретатор Windows. Мы можем установить переменные непосредственно перед запуском нужной нам команды в рамках одной сессии cmd.exe.

Разберем, как это реализовать через метод Run объекта WScript.Shell:


WshShell = СоздатьОбъект("WScript.Shell");
Прокси = "http://user:pass@proxy:3128";
КомандаБэкапа = "C:\Backup\bin\util.exe --upload";

// Используем оператор && для последовательного выполнения команд
ПолнаяКоманда = "cmd /c ""set HTTP_PROXY=" + Прокси + " && set HTTPS_PROXY=" + Прокси + " && " + КомандаБэкапа + """";

// Запускаем скрыто (0) и ждем завершения (Истина)
WshShell.Run(ПолнаяКоманда, 0, -1);

Преимущество этого метода: Не требуется никаких дополнительных компонент, всё работает на чистом WScript.Shell. Недостаток: Если из 1С нужно запустить последовательно несколько разных команд, которые должны использовать эти переменные, придется прописывать set для каждой из них.

Продвинутый вариант: Использование WinAPI

Для тех, кто использует в своей работе внешние компоненты типа FormEx или DynWrap, существует возможность вызвать функции Windows API напрямую. Функция SetEnvironmentVariableA из библиотеки kernel32.dll позволяет менять блок окружения процесса максимально быстро.

Проанализируем концепцию (на примере DynWrap):


Wrapper = СоздатьОбъект("DynamicWrapper");
Wrapper.Register("KERNEL32.DLL", "SetEnvironmentVariableA", "i=ss", "f=s", "r=l");
// Установка переменной
Wrapper.SetEnvironmentVariableA("HTTP_PROXY", "http://proxy:3128");

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

Итоги и рекомендации

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

  1. Прямое использование WshShell.Environment в 1С 7.7 невозможно на запись из-за ограничений синтаксиса работы с COM.
  2. MSScriptControl с JScript — это самый гибкий и "чистый" программный способ. Он позволяет инкапсулировать логику работы с переменными в небольшую функцию.
  3. Командная строка (set && command) — отличный вариант, если переменные нужны только для разового запуска внешней утилиты.
  4. Область "PROCESS" — предпочтительна для большинства задач, так как не засоряет реестр Windows и настройки пользователя.

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

← На главную