Ошибка безопасного режима при записи файла во внешней обработке: причины и способы решения

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

При разработке и использовании внешних обработок в клиент-серверном варианте работы 1С:Предприятие мы часто сталкиваемся с ограничениями безопасности. Одна из самых распространенных проблем возникает, когда мы пытаемся сохранить файл на сервере (например, во временный каталог), но получаем сообщение об ошибке.

Рассмотрим ситуацию подробно: пользователь открывает внешнюю обработку через меню «Файл — Открыть», загружает файл с клиента, передает его на сервер, и серверный код пытается сохранить этот файл на диск для дальнейшей обработки. В этот момент платформа прерывает выполнение с ошибкой:

Ошибка при вызове метода контекста (Записать): Установлен безопасный режим. Выполнение операции запрещено.

Давайте разберемся, почему это происходит, даже если мы прописали все разрешения в сведениях о внешней обработке, и как правильно решить эту задачу.

Почему возникает ошибка?

В данной ситуации важно понимать различие между двумя способами запуска внешних обработок в 1С:

  1. Через механизм «Дополнительные отчеты и обработки» (БСП): Обработка загружается в справочник информационной базы (здесь пригодится справочник по методам БСП с примерами использования). При этом администратор соглашается с перечнем разрешений, которые запрашивает обработка (доступ к файловой системе, интернету и т.д.).
  2. Интерактивно через меню «Файл — Открыть»: Пользователь просто выбирает файл на диске.

Автор темы столкнулся с проблемой именно во втором случае. Он добавил код для запроса разрешений в функцию СведенияОВнешнейОбработке, но это не помогло.

Причина проста: функция СведенияОВнешнейОбработке вызывается только при регистрации обработки в справочнике дополнительных отчетов и обработок. Когда мы открываем файл через «Файл — Открыть», платформа этот метод игнорирует. Поскольку платформа не знает, что делает этот файл, она по умолчанию включает «Безопасный режим» для защиты сервера от потенциально вредоносного кода, запрещая доступ к файловой системе сервера, COM-объектам и внешним компонентам.

Разберем три основных способа решения этой проблемы: от настройки прав до изменения подхода к программированию.

Способ 1. Отключение защиты от опасных действий (Административный)

Если обработку необходимо запускать именно через «Файл — Открыть» и у вас есть административные права (или вы предварительно выполнили анализ и сравнение ролей для уточнения доступов), можно снять ограничения на уровне настроек пользователя. Начиная с версии платформы 8.3.9, работает механизм «Защита от опасных действий».

Чтобы разрешить пользователю выполнение любых операций из внешних файлов, выполним следующие шаги:

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

После этого платформа перестанет блокировать операции с файловой системой для внешних обработок, запускаемых этим пользователем. Однако, стоит помнить, что это снижает уровень безопасности системы.

Способ 2. Регистрация обработки в справочнике (Рекомендованный)

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

Проанализируем код регистрации разрешений. В модуле объекта внешней обработки должна быть экспортная функция СведенияОВнешнейОбработке. Нам необходимо запросить разрешение на использование каталога временных файлов.


Функция СведенияОВнешнейОбработке() Экспорт
    
    РегистрационныеДанные = Новый Структура;
    РегистрационныеДанные.Вставить("Наименование", "Загрузка данных");
    РегистрационныеДанные.Вставить("БезопасныйРежим", Истина); // Важно: режим остается безопасным, но с разрешениями
    РегистрационныеДанные.Вставить("Версия", "1.0");
    РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
    
    // Формируем массив разрешений
    РегистрационныеДанные.Вставить("Разрешения", Новый Массив);
    
    // Добавляем разрешение на временные файлы
    Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина);
    РегистрационныеДанные.Разрешения.Добавить(Разрешение);
    
    Возврат РегистрационныеДанные;
    
КонецФункции

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

Способ 3. Работа с потоками в памяти (Программный)

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

Вместо методов ПолучитьИмяВременногоФайла и Записать, мы можем использовать чтение из потока. Рассмотрим, как изменить код серверной процедуры.

Изначальный проблемный код:


&НаСервере
Процедура РазобратьФайлНаСервере(Адрес)
    ФайлПриемник = ПолучитьИмяВременногоФайла("txt");
    ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
    ДанныеХранилища.Записать(ФайлПриемник); // ОШИБКА ЗДЕСЬ
    
    ТекстовыйДок = Новый ТекстовыйДокумент;
    ТекстовыйДок.Прочитать(ФайлПриемник);
    // ... обработка ...
КонецПроцедуры

Оптимизированный код с использованием потоков (работает в безопасном режиме):


&НаСервере
Процедура РазобратьФайлНаСервере(Адрес)
    
    // Получаем двоичные данные из хранилища
    ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
    
    // Открываем поток чтения из памяти
    Поток = ДанныеХранилища.ОткрытьПотокДляЧтения();
    
    // Читаем текстовый документ напрямую из потока
    ТекстовыйДок = Новый ТекстовыйДокумент;
    ТекстовыйДок.Прочитать(Поток); // Метод Прочитать умеет работать с потоками
    
    // Закрываем поток
    Поток.Закрыть();
    
    // Дальнейшая обработка текста
    ТекстФайла = ТекстовыйДок.ПолучитьТекст();
    // ...
    
КонецПроцедуры

Этот метод является наиболее элегантным, так как не требует настройки прав пользователя и не засоряет диск сервера временными файлами. Однако он подходит только в том случае, если используемые вами методы (например, чтение текста, чтение XML, FastInfoSet, ЧтениеZipФайла) поддерживают работу с объектом Поток.

Резюме

Подведем итоги. Ошибка записи файла при открытии внешней обработки вызвана работой механизма безопасного режима, который активируется по умолчанию для недоверенных источников.

Для решения проблемы выберите один из путей:

  1. Если нужно просто прочитать данные — перепишите код на использование потоков в памяти.
  2. Если нужно часто использовать обработку или выполнять сложные действия — зарегистрируйте её как Дополнительную обработку, правильно настроив длительные операции (БСП) и прописав разрешения в функции сведений.
  3. Если обработка нужна "здесь и сейчас" для разработки — отключите у пользователя флаг «Защита от опасных действий» (с осторожностью).
← На главную