В практике разработки на платформе 1С часто встречается ситуация: внешняя обработка корректно запускается и выполняет все функции через стандартное меню Файл > Открыть, но при подключении к базе через справочник Дополнительные отчеты и обработки завершается аварийно. Ошибка возникает в момент попытки сохранения данных или создания временного файла на сервере:
Ошибка при вызове метода контекста (Записать): Установлен безопасный режим. Выполнение операции запрещено
Рассмотрим подробно, почему это происходит и какими способами можно решить данную проблему.
Проанализируем механику работы платформы 1С и Библиотеки Стандартных Подсистем (БСП). Когда мы открываем обработку вручную через интерактивное меню, объект создается в стандартном режиме с полными правами на текущее окружение пользователя. Однако при программном вызове метода ВнешниеОбработки.Создать() платформа принимает второй необязательный параметр БезопасныйРежим:
ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяФайла, БезопасныйРежим);
По умолчанию параметр БезопасныйРежим имеет значение Истина. Подсистема БСП при запуске обработки из справочника Дополнительные отчеты и обработки всегда исполняет код в безопасном режиме, если явно не указаны другие настройки регистрации.
В безопасном режиме платформа вводит жесткие ограничения на выполнение потенциально опасных операций:
ПолучитьИмяВременногоФайла() и последующий метод .Записать()).УстановитьПривилегированныйРежим(Истина).Разберем основной вариант решения на уровне кода обработки. Если обработка поставляется как дополнительная для БСП, в ее модуле объекта присутствует функция СведенияОВнешнейОбработке(). Чтобы разрешить обработке запись файлов и выполнение других операций, необходимо явно отключить безопасный режим при регистрации.
Посмотрим на пример заполнения параметров регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Обработка загрузки правил";
ПараметрыРегистрации.Версия = "1.0";
// Явно отключаем безопасный режим
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Возврат ПараметрыРегистрации;
КонецФункции
Важно: После изменения кода функции модуля обработки необходимо обновить файл обработки в справочнике Дополнительные отчеты и обработки в режиме «1С:Предприятие».
Если нет возможности оперативно изменить исходный код обработки, администратор базы данных может отключить безопасный режим непосредственно через пользовательский интерфейс:
Бывают ситуации, когда безопасный режим нельзя отключать (например, при работе базы в сервисе 1С:Fresh или при строгих корпоративных политиках безопасности). Если задача обработки заключается в чтении XML-правил из макета типа ТекстовыйДокумент, мы можем извлечь данные напрямую из оперативной памяти без сохранения во временный файл.
Рассмотрим, как заменить сохранение файла на прямое чтение строки:
// Получаем макет текстового документа
МакетПравил = НашаОбработка.ПолучитьМакет("ПравилаОбмена");
ТекстПравил = МакетПравил.ПолучитьТекст();
// Инициализируем объект ЧтениеXML непосредственно из строки
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстПравил);
// Далее передаем объект ЧтениеXML в механизмы обработки правил
Такой подход полностью исключает обращение к файловой системе сервера, благодаря чему код успешно выполняется даже в безопасном режиме.