При переходе на новые версии платформы 1С:Предприятие 8.3 разработчики и пользователи часто сталкиваются с появлением диалогового окна: «Предупреждение безопасности. Открывается... Разрешить открывать данный файл?». В некоторых релизах (в частности, 8.3.9.2016) это поведение усугублялось ошибкой платформы: диалоговое окно содержало только кнопку «ОК» без кнопок выбора («Да» и «Нет»), из-за чего после закрытия окна внешняя обработка или печатная форма просто не запускалась. Кроме того, данная проверка блокирует выполнение регламентных и фоновых заданий, которые запускаются в неинтерактивном режиме.
Механизм «Защита от опасных действий» контролирует открытие внешних отчетов и обработок (файлы с расширениями .epf и .erf), подключение расширений конфигурации (.cfe), загрузку внешних компонент и вызов системных команд через ЗапуститьПриложение. Разберем подробно несколько проверенных способов решения проблемы и отключения назойливого предупреждения.
Если с внешней обработкой работает ограниченный круг лиц или администратор базы, проще всего снять флаг защиты непосредственно в списке пользователей. Рассмотрим по шагам, как это сделать:
После этого сеансы данного пользователя перестанут выводить предупреждающие сообщения при открытии внешних файлов.
Когда требуется отключить предупреждения для всех пользователей сразу, а также обеспечить корректную работу фоновых и регламентных заданий без ручной правки списка учетных записей, воспользуемся параметром DisableUnsafeActionProtection в конфигурационном файле conf.cfg.
Выясним причину важности правильного расположения файла: платформа считывает conf.cfg как на стороне клиента (при интерактивном запуске), так и на стороне сервера 1С:Предприятия (для регламентных заданий и серверных вызовов). Рекомендуется вносить правки в файл, расположенный в общем каталоге настроек платформы (например, C:\Program Files\1cv8\conf\conf.cfg), чтобы настройки сохранялись при последующих обновлениях версий 1С.
Проанализируем примеры синтаксиса строки отключения:
Для отключения защиты для конкретных информационных баз по маске имени строки соединения укажем регулярное выражение через точку с запятой:
DisableUnsafeActionProtection=test_.*;stage_.*;
Если требуется полностью отключить защиту от опасных действий для абсолютно всех баз, запущенных на данном компьютере или сервере, зададим регулярное выражение, соответствующее любой строке:
DisableUnsafeActionProtection=.*
Обратите внимание: разбор масок выполняется по стандарту регулярных выражений POSIX. Любая синтаксическая ошибка в правиле приведет к ошибке инициализации сеанса 10301 (U_REGEX_RULE_SYNTAX).
Если в базе создано множество пользователей и изменять настройки конфигурационных файлов на сервере нет возможности, снимем флаг предупреждения программно. Посмотрим на пример кода внешней обработки или разового скрипта, который перебирает всех пользователей информационной базы:
НомерПП = 0;
Попытка
ВсеПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого Пользователь1с Из ВсеПользователи Цикл
НомерПП = НомерПП + 1;
Пользователь1с.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
Пользователь1с.Записать();
КонецЦикла;
Сообщить("Успешно изменено пользователей: " + НомерПП);
Исключение
Сообщить("Ошибка при обработке пользователей: " + ОписаниеОшибки());
КонецПопытки;
Данный фрагмент кода получает системную коллекцию ПользователиИнформационнойБазы, обращается к свойству ЗащитаОтОпасныхДействий каждого пользователя и устанавливает свойство ПредупреждатьОбОпасныхДействиях в значение Ложь.
Если внешняя обработка или печатная форма подключается и открывается программным кодом конфигурации (например, при разработке собственных механизмов интеграции или в фоновом задании), воспользуемся объектом ОписаниеЗащитыОтОпасныхДействий. Рассмотрим пример:
ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Открытие внешней обработки без предупреждения пользователя:
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь, ОписаниеЗащиты);
// Подключение внешней обработки из временного хранилища:
ИмяОбработки = ВнешниеОбработки.Подключить(АдресВХранилище, , Ложь, ОписаниеЗащиты);
При таком подходе платформа не будет запрашивать интерактивное подтверждение у пользователя вне зависимости от настроек его учетной записи.
Регламентные задания, выполняющие запуск внешнего кода, работают в контексте системного сеанса без привязки к конкретному пользователю, из-за чего механизм защиты блокирует выполнение. Для обхода этой проблемы разберем два шага:
DisableUnsafeActionProtection=.* добавлен в файл conf.cfg на сервере 1С:Предприятия (в каталоге службы rphost).Если проблема вызвана конкретным релизом платформы (например, релизом 8.3.9.2016, где диалог не содержал рабочих кнопок), наиболее правильным системным решением будет обновление платформы на исправленную версию (релиз 8.3.9.2033 или старшие версии ветки 8.3.10 и выше), где окно диалога работает в штатном режиме и позволяет пользователю запомнить выбор.