Как обойти ошибку «Установлен безопасный режим. Выполнение операции запрещено» при записи файла в 1С:Фреш

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

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

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

Почему не работает УстановитьОтключениеБезопасногоРежима?

Рассмотрим фрагмент кода, который часто пытаются использовать разработчики, надеясь «прорваться» сквозь ограничения:


Значение = БезопасныйРежим();
Если ТипЗнч(Значение) = Тип("Булево") И Значение = Истина Тогда
    УстановитьОтключениеБезопасногоРежима(Истина);
    УстановитьПривилегированныйРежим(Истина);
    Строка.Записать(ИмяФайла, "windows-1251");
КонецЕсли;

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

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

Решение 1: Использование внешних обработок с программными разрешениями

Для реализации выгрузки файлов по расписанию в 1С:Фреш наиболее стабильным решением является использование механизма Дополнительных отчетов и обработок. Вместо того чтобы пытаться внедрить код в расширение, которое проверяется аудитом крайне строго, мы создадим внешнюю обработку и опишем необходимые нам права в функции СведенияОВнешнейОбработке. Для автоматизации выгрузки на внешний ресурс подойдёт обработка для одностороннего файлового обмена по FTP.

Разберем по шагам, как подготовить такую обработку, чтобы она могла записывать файлы или взаимодействовать с внешними ресурсами:

  1. В модуле объекта внешней обработки создаем экспортную функцию СведенияОВнешнейОбработке.
  2. В структуре параметров регистрации указываем БезопасныйРежим = Ложь.
  3. Самое важное: заполняем массив Разрешения, используя методы БСП.

Посмотрим на пример формирования разрешений для работы с файловой системой или COM-объектами:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
    ПараметрыРегистрации.Вставить("Наименование", "Экспорт данных по расписанию");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); // Запрашиваем отключение
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    
    // Описываем разрешения
    Разрешения = Новый Массив;
    
    // Пример разрешения на работу с временным каталогом
    // Используем программный интерфейс БСП "РаботаВБезопасномРежиме"
    Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("Excel.Application", "00024500-0000-0000-C000-000000000046"));
    
    // Если нужно разрешение на запись в конкретный каталог (редко одобряется во Фреше)
    // Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы("/temp", Истина, Истина));
    
    ПараметрыРегистрации.Вставить("Разрешения", Разрешения);
    
    // Добавление команд
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Запустить выгрузку", "ВыполнитьВыгрузку", "ВызовСерверногоМетода", Ложь);
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;
КонецФункции

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

Решение 2: Работа с файлами через ДвоичныеДанные

Иногда ошибка возникает не из-за самого факта записи, а из-за использования методов, которые платформа считает «опасными» в контексте строк. Метод Строка.Записать() является упрощенным и не всегда корректно обрабатывается профилями безопасности. Выясним причину: этот метод пытается напрямую взаимодействовать с файловым потоком операционной системы.

Рассмотрим более надежный путь через объект ДвоичныеДанные. Сначала мы формируем текстовый документ в памяти, преобразуем его в двоичные данные, а затем записываем. Это позволяет более гибко управлять процессом и использовать методы БСП для работы с временными файлами.


// Вместо Строка.Записать(ИмяФайла)
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(СодержимоеФайла);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
Текст.Записать(ИмяВременногоФайла, "windows-1251");

// Получаем двоичные данные для передачи в хранилище или отправки
Данные = Новый ДвоичныеДанные(ИмяВременногоФайла);
// Теперь 'Данные' можно поместить во ВременноеХранилище или отправить по HTTP

Особенности файловой системы в облачной инфраструктуре

Важно понимать специфику работы 1С:Фреш. Даже если вы получите разрешение на запись файла, путь типа C:\Exports\file.txt работать не будет. Серверный кластер Фреша состоит из множества узлов. Файл, записанный на «диск С» одного сервера, мгновенно станет недоступен, если следующее регламентное задание запустится на другом сервере кластера. Для сохранения файлов в облачную инфраструктуру можно использовать расширение для отправки отчетов в S3-хранилище.

Рекомендуемая архитектура для выгрузок по расписанию:

Критическая ошибка: изменение conf.cfg

В некоторых обсуждениях можно встретить совет добавить в файл conf.cfg строку DisableUnsafeActionProtection=.*. Ни в коем случае не пытайтесь применить это для облачных решений.

Во-первых, у вас нет доступа к файловой системе серверов 1С:Фреш для редактирования конфигурационных файлов платформы. Во-вторых, эта настройка полностью отключает защиту от опасных действий на уровне всего кластера, что недопустимо в многопользовательской среде. Любые попытки обойти безопасность через настройки сервера приведут к отклонению вашего расширения на этапе аудита.

Резюме для разработчика

Проанализируем наши действия при возникновении ошибки доступа в безопасном режиме:

  1. Определяем, действительно ли необходимо расширение, или задачу можно решить дополнительной обработкой (их аудит обычно проходит проще).
  2. В функции регистрации (СведенияОВнешнейОбработке) явно указываем БезопасныйРежим = Ложь.
  3. Используем программный интерфейс БСП РаботаВБезопасномРежиме для наполнения массива разрешений на конкретные действия (COM, доступ к сайтам, временные файлы).
  4. Отказываемся от жестких путей к файлам на диске сервера в пользу HTTP-обмена или присоединенных файлов. Например, если обмен данными требуется выполнять регулярно, можно настроить автоматический регулярный обмен по расписанию через веб-сервис без промежуточного сохранения файлов на диск.
  5. При написании кода в расширении используем аннотацию &НаСервереБезКонтекста и методы работы с двоичными данными, чтобы минимизировать влияние ограничений формы.

Соблюдение этих правил позволит вашему коду успешно пройти аудит 1С:Фреш и стабильно работать в условиях облачной инфраструктуры без нарушения политик безопасности.

← На главную