Почему не выполняется создание COM-объекта WScript.Shell в 1С и как это исправить

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

При интеграции торгового оборудования, например терминалов сбора данных (ТСД), разработчики часто используют готовые внешние обработки. В устаревших или специализированных решениях обмен данными часто реализуется через вызов системных утилит операционной системы с помощью строки Новый COMОбъект("Wscript.Shell"). Однако в современных версиях платформы «1С:Предприятие 8.3» этот код может внезапно перестать работать: отладка прекращается без сообщений об ошибках, либо система выдает предупреждение безопасности и закрывает обработку. Выясним причину такого поведения и разберем все способы решения этой проблемы.

Почему возникает блокировка WScript.Shell

Начиная с версии 8.3.9, в платформе «1С:Предприятие» появился встроенный механизм безопасности — «Защита от опасных действий». Его цель — защитить компьютеры пользователей и серверы от выполнения потенциально опасного кода без их ведома. Платформа перехватывает попытки взаимодействия с операционной системой и внешними программами.

К потенциально опасным действиям платформа относит:

Внешняя обработка ТСД пытается создать COM-объект WScript.Shell для работы с консольными командами Windows. По умолчанию платформа блокирует это действие, что и приводит к прекращению работы обработки.

Способ 1. Отключение защиты в свойствах пользователя (в Конфигураторе)

Рассмотрим самый простой способ, который помог автору темы на форуме. Если обработка запускается под конкретным пользователем, мы можем отключить проверку безопасности лично для него.

Разберем этот процесс по шагам:

  1. Запустите базу данных в режиме Конфигуратора с правами администратора.
  2. Откройте меню Администрирование и выберите пункт Пользователи.
  3. Найдите в списке пользователя, под которым работает оператор ТСД, и откройте его свойства.
  4. На вкладке Основные найдите опцию «Защита от опасных действий» (в некоторых версиях платформы она называется «Предупреждать об опасных действиях»).
  5. Снимите этот флажок.
  6. Нажмите кнопку ОК, чтобы сохранить изменения, и перезапустите сеанс «1С:Предприятие».

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

Способ 2. Глобальное отключение защиты через файл conf.cfg

Если пользователей в базе много или обмен данными с ТСД должен происходить под разными учетными записями (включая служебные), ручная настройка каждого пользователя неудобна. В таком случае мы можем настроить глобальное исключение с помощью файла конфигурации conf.cfg.

Выясним, как это сделать:

  1. Перейдите в каталог установки платформы 1С. Обычно это папка C:\Program Files\1cv8\conf\ (или C:\Program Files (x86)\1cv8\conf\ для 32-разрядных версий). Если файла conf.cfg там нет, создайте обычный текстовый файл с таким именем.
  2. Откройте файл в текстовом редакторе от имени Администратора.
  3. Чтобы полностью отключить защиту от опасных действий на данном компьютере, добавьте строку: DisableUnsafeActionProtection=.*
  4. Если нужно отключить предупреждения только для определенных информационных баз, укажите их имена по маске через точку с запятой: DisableUnsafeActionProtection=ut_work_db;ut_test_db
  5. Сохраните файл конфигурации.

Важно: При работе в клиент-серверном режиме файл conf.cfg необходимо изменять как на клиентских компьютерах пользователей, так и на самом сервере 1С:Предприятия.

Способ 3. Программный обход защиты для всех пользователей

Если у вас крупная база данных со множеством пользователей, администратор может отключить предупреждения безопасности программно для всех учетных записей сразу. Для этого достаточно выполнить в режиме «1С:Предприятие» (например, через консоль кода) следующий фрагмент кода:


Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
    Если ТекущийПользователь.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях Тогда
        ТекущийПользователь.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
        Попытка
            ТекущийПользователь.Записать();
        Исключение
            Сообщить("Не удалось обновить пользователя: " + ТекущийПользователь.Имя);
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Этот код обходит весь список зарегистрированных пользователей информационной базы и отключает вывод предупреждений безопасности, позволяя внешним обработкам беспрепятственно работать с COM-объектами.

Способ 4. Программное подключение внешней обработки в безопасном режиме

Если политика безопасности вашей компании запрещает полное отключение защиты ИБ, вы можете разрешить выполнение опасных действий конкретно для доверенной обработки ТСД. При подключении внешней обработки программным способом (например, через механизмы БСП) можно явно указать параметры защиты.

Посмотрим на пример кода подключения внешней обработки:


ПараметрыЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ПараметрыЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;

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

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

Современная кроссплатформенная альтернатива WScript.Shell

Использование COM-объекта Wscript.Shell сегодня считается устаревшим подходом по нескольким причинам:

В современных конфигурациях для выполнения внешних команд операционной системы рекомендуется использовать штатные функции платформы 1С или механизмы Библиотеки стандартных подсистем (БСП).

Рассмотрим замену вызова Wscript.Shell на кроссплатформенный метод ЗапуститьПриложение():


// Вместо небезопасного COM-вызова:
// хШелл = Новый COMОбъект("Wscript.Shell");
// хШелл.Run(КомандаЗапуска, 0, Истина);

// Используем встроенный метод платформы:
ЗапуститьПриложение(КомандаЗапуска, , Истина);

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


ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ДождатьсяЗавершения", Истина);

Результат = ФайловаяСистемаКлиент.ЗапуститьПрограмму("C:\TSD\exchange.exe", ПараметрыВыполнения);
Если Результат.КодВозврата <> 0 Тогда
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при обмене с ТСД!");
КонецЕсли;

Использование платформенных методов и БСП делает систему стабильной, избавляет от проблем с безопасностью и подготавливает вашу конфигурацию к работе в кроссплатформенных средах.

← На главную