Перевод внешней обработки в безопасный режим — это обязательное требование для публикации решения в сервисе 1С:Фреш. Однако простая установка флага БезопасныйРежим = Истина часто приводит к тому, что код перестает работать, выдавая ошибки доступа. Разберем подробно, почему это происходит и как правильно настроить разрешения, чтобы ваша обработка успешно прошла технический аудит.
Когда внешняя обработка запускается в безопасном режиме, платформа 1С накладывает жесткие ограничения на выполнение определенных операций. Проанализируем типичную ситуацию: ваша обработка формирует XML-файл и использует стандартные механизмы конфигурации для проверки данных контрагентов или загрузки классификаторов. В этот момент выполнение кода переходит в общие модули (например, ИнтернетПоддержкаПользователей или РаботаСКлассификаторами), которые пытаются установить HTTPСоединение.
Платформа блокирует такие действия, так как безопасный режим по умолчанию запрещает:
Даже если опасный код находится не в самой обработке, а в типовом общем модуле, вызов считается инициированным из безопасного режима, и операция прерывается с ошибкой «Установлен безопасный режим. Выполнение операции запрещено».
Для того чтобы обработка работала корректно и при этом оставалась в безопасном режиме, необходимо использовать механизм профилей безопасности через функцию СведенияОВнешнейОбработке. Рассмотрим, как прописать необходимые разрешения в модуле объекта обработки.
Ранее программисты часто устанавливали параметр регистрации ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);. Это решало проблему локально, но такой вариант недопустим для облачных сервисов. Нам нужно оставить режим безопасным, но добавить в него исключения (разрешения).
В функции СведенияОВнешнейОбработке мы должны создать массив разрешений и наполнить его конкретными требованиями. Проанализируем пример кода:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидДополнительнойОбработки();
ПараметрыРегистрации.Наименование = "Выгрузка электронных документов (Фреш)";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Истина;
// Создаем массив для хранения разрешений
Разрешения = Новый Массив;
// Здесь мы будем добавлять разрешения, которые разберем ниже
// ...
ПараметрыРегистрации.Разрешения = Разрешения;
Возврат ПараметрыРегистрации;
КонецФункции
Если ваша обработка обращается к внешним сервисам (например, для проверки ИНН через сервис 1С или работы с ЭДО), необходимо запросить доступ к конкретным протоколам и адресам. Выясним причину ошибки из стека вызовов автора: программа ругается на создание HTTPСоединение в модуле ИнтернетПоддержкаПользователей. Чтобы исправить это, добавим разрешение:
// Разрешение на использование интернет-ресурса по протоколу HTTPS
// Вместо "*" лучше указывать конкретный URL-адрес сервера
АдресРесурса = "https://api.orgname.ru";
Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса("HTTPS", АдресРесурса));
Важный момент: Для 1С:Фреш крайне не рекомендуется запрашивать доступ ко всем ресурсам (использовать маски или пустые адреса). Аудиторы потребуют перечислить конкретные домены, с которыми взаимодействует код.
Поскольку суть обработки — формирование и выгрузка XML, нам потребуется работать с файловой системой. В безопасном режиме нельзя писать файлы в произвольные папки типа C:\Temp. Мы должны использовать временное хранилище или временный каталог сеанса.
// Разрешение на использование каталога временных файлов
Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов());
// Если требуется работа с конкретным каталогом файловой системы (редко для Фреш)
// Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы("C:\ExportData", Истина, Истина));
Помните, что при выгрузке файлов во Фреше лучше всего формировать данные в памяти или во временном каталоге, а затем передавать их пользователю через ПолучитьФайл() или помещать в ВременноеХранилище.
Иногда типовые модули конфигурации (как в случае с ФорматыЭДО_ФНС) требуют кратковременного перехода в привилегированный режим для чтения защищенных данных или выполнения операций, недоступных обычному пользователю. Если ваша обработка вызывает такие методы, добавьте следующее разрешение:
// Разрешение на использование привилегированного режима
Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима());
Внимание: Использование этого разрешения — «красный флаг» для аудиторов Фреша. Если вы добавляете его, будьте готовы обосновать в комментариях к коду, почему нельзя обойтись без него. Проанализируем, можно ли переписать код так, чтобы использовать только стандартные права пользователя.
Помимо настройки безопасного режима, проанализируем дополнительные требования, без выполнения которых обработку отклонят:
Выполнить() и Вычислить(): Эти функции позволяют исполнять произвольный код в обход всех проверок. В 99% случаев их использование приводит к мгновенному отказу в публикации.Новый COMОбъект просто не создастся (например, Linux-серверы). Используйте кроссплатформенные аналоги (Native API или чтение файлов через ТекстовыйДокумент / ЧтениеXML).Разберем, как убедиться, что всё сделано правильно, не дожидаясь ответа от службы поддержки Фреша. Выполните следующие действия:
1. Включите в своей локальной базе (которая должна быть максимально близка по версии к базе Фреш) профили безопасности. Это делается в параметрах запуска или настройках сервера.
2. Загрузите обработку через справочник «Дополнительные отчеты и обработки».
3. Убедитесь, что при регистрации программа не выдала предупреждений о безопасности, а все запрашиваемые разрешения соответствуют вашему списку в коде.
4. Запустите выполнение обработки. Если возникают ошибки — внимательно изучите стек вызовов. Каждая строка, указывающая на ошибку в общем модуле, — это подсказка, какого разрешения не хватает в вашей функции СведенияОВнешнейОбработке.
Использование механизмов БСП (Библиотеки Стандартных Подсистем) для управления разрешениями позволяет гибко настраивать доступ, сохраняя безопасность системы. Это требует больше времени на разработку, чем простая выгрузка «как есть», но это единственный путь для легальной и стабильной работы ваших расширений в облаке 1С.