При разработке расширений или внешних обработок для информационных баз, работающих в сервисе 1С:Фреш (или других облачных средах с жестким контролем безопасности), программисты часто сталкиваются с блокировкой выполнения некоторых операций. Самая типичная ситуация — попытка сохранить сформированный текстовый или двоичный файл на диск сервера. Платформа мгновенно возвращает ошибку: «Установлен безопасный режим. Выполнение операции запрещено».
В этой статье мы подробно разберем, почему стандартные методы отключения безопасного режима не работают в облаке, как правильно использовать механизмы БСП для получения разрешений и какой архитектурный подход выбрать для выгрузки файлов по расписанию.
Рассмотрим фрагмент кода, который часто пытаются использовать разработчики, надеясь «прорваться» сквозь ограничения:
Значение = БезопасныйРежим();
Если ТипЗнч(Значение) = Тип("Булево") И Значение = Истина Тогда
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Строка.Записать(ИмяФайла, "windows-1251");
КонецЕсли;
Проанализируем ситуацию: метод УстановитьОтключениеБезопасногоРежима(Истина) сработает только в том случае, если текущий программный код сам обладает правом на отмену этого режима. В условиях 1С:Фреш расширения и внешние обработки запускаются внутри заранее созданного «песочного» окружения (профиля безопасности). Если в этом профиле явно не разрешены операции с файловой системой, попытка программно отключить защиту будет проигнорирована платформой из соображений безопасности системы.
Безопасный режим в 1С является аддитивным. Это означает, что если он включен на уровне сеанса или вызван вышестоящим методом, вы не можете понизить уровень безопасности из «внутреннего» кода, не имея на то санкции от администратора системы (или аудитора сервиса).
Для реализации выгрузки файлов по расписанию в 1С:Фреш наиболее стабильным решением является использование механизма Дополнительных отчетов и обработок. Вместо того чтобы пытаться внедрить код в расширение, которое проверяется аудитом крайне строго, мы создадим внешнюю обработку и опишем необходимые нам права в функции СведенияОВнешнейОбработке. Для автоматизации выгрузки на внешний ресурс подойдёт обработка для одностороннего файлового обмена по FTP.
Разберем по шагам, как подготовить такую обработку, чтобы она могла записывать файлы или взаимодействовать с внешними ресурсами:
СведенияОВнешнейОбработке.БезопасныйРежим = Ложь.Разрешения, используя методы БСП.Посмотрим на пример формирования разрешений для работы с файловой системой или COM-объектами:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Экспорт данных по расписанию");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); // Запрашиваем отключение
ПараметрыРегистрации.Вставить("Версия", "1.1");
// Описываем разрешения
Разрешения = Новый Массив;
// Пример разрешения на работу с временным каталогом
// Используем программный интерфейс БСП "РаботаВБезопасномРежиме"
Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("Excel.Application", "00024500-0000-0000-C000-000000000046"));
// Если нужно разрешение на запись в конкретный каталог (редко одобряется во Фреше)
// Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы("/temp", Истина, Истина));
ПараметрыРегистрации.Вставить("Разрешения", Разрешения);
// Добавление команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Запустить выгрузку", "ВыполнитьВыгрузку", "ВызовСерверногоМетода", Ложь);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
При загрузке такой обработки в сервис 1С:Фреш, система безопасности проанализирует массив Разрешения. Аудитор увидит, что обработке требуются специфические права, и если они обоснованы бизнес-задачей, обработка будет допущена к работе с возможностью выхода из безопасного режима.
Иногда ошибка возникает не из-за самого факта записи, а из-за использования методов, которые платформа считает «опасными» в контексте строк. Метод Строка.Записать() является упрощенным и не всегда корректно обрабатывается профилями безопасности. Выясним причину: этот метод пытается напрямую взаимодействовать с файловым потоком операционной системы.
Рассмотрим более надежный путь через объект ДвоичныеДанные. Сначала мы формируем текстовый документ в памяти, преобразуем его в двоичные данные, а затем записываем. Это позволяет более гибко управлять процессом и использовать методы БСП для работы с временными файлами.
// Вместо Строка.Записать(ИмяФайла)
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(СодержимоеФайла);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
Текст.Записать(ИмяВременногоФайла, "windows-1251");
// Получаем двоичные данные для передачи в хранилище или отправки
Данные = Новый ДвоичныеДанные(ИмяВременногоФайла);
// Теперь 'Данные' можно поместить во ВременноеХранилище или отправить по HTTP
Важно понимать специфику работы 1С:Фреш. Даже если вы получите разрешение на запись файла, путь типа C:\Exports\file.txt работать не будет. Серверный кластер Фреша состоит из множества узлов. Файл, записанный на «диск С» одного сервера, мгновенно станет недоступен, если следующее регламентное задание запустится на другом сервере кластера. Для сохранения файлов в облачную инфраструктуру можно использовать расширение для отправки отчетов в S3-хранилище.
Рекомендуемая архитектура для выгрузок по расписанию:
ВременноеХранилище и прикрепляйте к объектам системы (например, справочник «Присоединенные файлы»).HTTPСоединение) для передачи сформированных файлов на ваш собственный FTP-сервер или в облачное хранилище (S3, Яндекс.Диск и т.д.). Для этого также потребуется запросить разрешение РазрешениеНаИспользованиеИнтернетРесурса в функции регистрации обработки.В некоторых обсуждениях можно встретить совет добавить в файл conf.cfg строку DisableUnsafeActionProtection=.*. Ни в коем случае не пытайтесь применить это для облачных решений.
Во-первых, у вас нет доступа к файловой системе серверов 1С:Фреш для редактирования конфигурационных файлов платформы. Во-вторых, эта настройка полностью отключает защиту от опасных действий на уровне всего кластера, что недопустимо в многопользовательской среде. Любые попытки обойти безопасность через настройки сервера приведут к отклонению вашего расширения на этапе аудита.
Проанализируем наши действия при возникновении ошибки доступа в безопасном режиме:
СведенияОВнешнейОбработке) явно указываем БезопасныйРежим = Ложь.РаботаВБезопасномРежиме для наполнения массива разрешений на конкретные действия (COM, доступ к сайтам, временные файлы).&НаСервереБезКонтекста и методы работы с двоичными данными, чтобы минимизировать влияние ограничений формы.Соблюдение этих правил позволит вашему коду успешно пройти аудит 1С:Фреш и стабильно работать в условиях облачной инфраструктуры без нарушения политик безопасности.