При открытии внешних обработок (например, типовой обработки выгрузки структуры метаданных MD83Exp.epf) через меню Файл → Открыть в конфигурациях на базе БСП (включая 1С:Управление нашей фирмой) разработчики часто сталкиваются с исключением:
Ошибка при вызове метода контекста (ОткрытьФайл): Установлен безопасный режим. Выполнение операции запрещено
Рассмотрим подробнее причины возникновения данной блокировки и разберем все способы решения проблемы.
Проанализируем механизм защиты платформы 1С:Предприятие. Безопасный режим предназначен для предотвращения выполнения потенциально опасных действий внешним кодом. В этом режиме платформой блокируются:
ЗаписьXML, ТекстовыйДокумент и др.).ЗапуститьПриложение().Если код формирования файла исполняется на стороне сервера 1С в безопасном контексте, любая попытка открыть локальный файл пользователя приводит к ошибке безопасности. Если же попытаться передать серверу путь к локальному диску клиента (например, C:\Users\...\Desktop\...), сервер вернет ошибку Каталог не обнаружен, так как на физическом сервере 1С такого пути нет, либо у пользователя службы USR1CV8 отсутствуют к нему права доступа.
В типовых обработках выгрузки метаданных (MD83Exp.epf) предусмотрено переключение контекста выполнения. Если файл открывается интерактивно через Файл → Открыть, проще всего переключить исполнение в клиентский контекст.
Разберем по шагам, как это сделать:
В этом случае метод мЗаписьXML.ОткрытьФайл() выполнится на стороне клиентского приложения, где ограничения безопасного режима сервера не блокируют создание файла.
Если обработка должна выполняться на сервере без ограничений, ее необходимо подключить к механизму БСП с явным отключением безопасного режима.
Рассмотрим, как настроить модуль обработки. В модуле объекта внешней обработки добавим экспортную функцию СведенияОВнешнейОбработке:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
// Отключаем безопасный режим
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Выгрузка метаданных";
НоваяКоманда.Идентификатор = "ВыгрузитьМетаданные";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
После добавления функции выполним следующие действия:
Если запуск внешней обработки выполняется из программного кода другой процедуры, необходимо явно передать признак отключения безопасного режима вторым параметром метода создания объекта.
Посмотрим на пример вызова:
// Второй параметр Ложь отключает безопасный режим для создаваемого объекта
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
ВнешняяОбработкаОбъект.ВыполнитьВыгрузку();
Важно: отключение безопасного режима через параметр Ложь сработает только в том случае, если вызывающий код сам не находится внутри безопасного контекста. Отключить безопасный режим «изнутри» самого безопасного режима платформа не позволяет.
Если выгрузка метаданных или обмен данными обязательно должны выполняться в серверном контексте, проанализируем правила работы с файловыми путями:
C:\Users\... текущего пользователя.\\server\share\file.xml. При этом у учетной записи операционной системы, под которой запущена служба кластера серверов 1С (обычно USR1CV8), должны быть полные права на чтение и запись в эту сетевую папку.КаталогВременныхФайлов(), после чего передать его на клиент через ПоместитьВоВременноеХранилище() и сохранить на клиенте методом ПолучитьФайл().Если в информационной базе используются профили безопасности кластера 1С:Предприятия, платформа принудительно изолирует внешние модули независимо от настроек внутри базы.
Для снятия ограничений необходимо: