При автоматизации рутинных процессов часто возникает необходимость запускать внешние обработки по расписанию через регламентные задания (подсистема «Дополнительные отчеты и обработки» БСП). Если логика обработки требует взаимодействия с операционной системой — например, вызова системных команд через COMОбъект("WScript.Shell") или работы с внешними компонентами, — разработчики сталкиваются с ошибками выполнения. При этом даже явное указание параметра "БезопасныйРежим", Ложь в функции СведенияОВнешнейОбработке() не всегда решает проблему.
Разберем подробнее, почему возникает данная ошибка и какими способами можно обеспечить корректное выполнение фонового задания.
Проанализируем технические особенности платформы 1С:Предприятие 8.3, приводящие к блокировке:
rphost. Механизм защиты от опасных действий при обнаружении потенциально небезопасной операции (создание COM-объекта, доступ к файловой системе или запуск внешних программ) пытается запросить подтверждение у пользователя. Так как диалоговое окно в фоновом режиме открыть невозможно, система аварийно завершает выполнение с исключением.КомандаСистемы() и внешним библиотекам.USR1CV8). У нее могут отсутствовать права на доступ к определенным ресурсам ОС или веткам реестра через WScript.Shell.Регламентные задания в информационной базе обычно выполняются от имени назначенного служебного пользователя. Если отключить механизм предупреждений для этой учетной записи, платформа перестанет блокировать вызовы.
Выполнить настройку можно программно в режиме администрирования:
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("РегламентныйПользователь");
Если ПользовательИБ <> Неопределено Тогда
ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
ПользовательИБ.Записать();
КонецЕсли;
Также это свойство можно отключить вручную в конфигураторе или в справочнике пользователей, сняв соответствующий признак защиты от опасных действий.
Если обработка подключается из двоичных данных собственным программным кодом, используем объект ОписаниеЗащитыОтОпасныхДействий при вызове метода менеджера внешних обработок:
ОбъектОписанияЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОбъектОписанияЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Подключаем внешнюю обработку во временное хранилище без вывода диалогов
ИмяПодключеннойОбработки = ВнешниеОбработки.Подключить(
АдресВоВременномХранилище,
,
Ложь, // Отключаем безопасный режим
ОбъектОписанияЗащиты
);
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяПодключеннойОбработки);
ОбработкаОбъект.ВыполнитьКоманду();
В конфигурациях на базе Библиотеки стандартных подсистем (БСП) с включенными профилями безопасности рекомендуется явно декларировать необходимые права в модуле объекта внешней обработки внутри экспортной функции СведенияОВнешнейОбработке():
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Запрашиваем явное разрешение на создание COM-объекта
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(
"WScript.Shell",
"{72C24DD5-D70A-438B-8A42-98424B88AFB8}",
"Запуск системных команд"
);
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
Возврат ПараметрыРегистрации;
КонецФункции
При регистрации обработки в справочнике администратор один раз подтверждает предоставление прав, после чего регламентное задание выполняется без ошибок.
Если требуется полностью исключить запросы механизма защиты на сервере для всех фоновых заданий, отредактируем файл conf.cfg, расположенный в каталоге установки платформы на сервере (например, C:\Program Files\1cv8\conf\conf.cfg):
Параметр в conf.cfg:
DisableUnsafeActionProtection=.*
Данная директива отключает проверку опасных действий для всех информационных баз сервера. При необходимости можно ограничить действие регулярным выражением конкретной базы данных.
Рекомендуется отказаться от создания внешних COM-объектов WScript.Shell в пользу штатных возможностей платформы:
ЗапуститьПриложение(). Встроенный платформенный метод позволяет выполнять системные команды и запускать внешние исполняемые файлы кроссплатформенно (как в среде Windows, так и в Linux) без инициализации COM-интерфейсов.ФайловаяСистема (например, ФайловаяСистема.ЗапуститьПрограмму()), которые содержат механизмы перехвата ошибок и оптимизированы для выполнения в фоновых процессах.