При выполнении интеграционных задач, связанных с переносом данных между базами 1С (например, при переходе с УПП на ERP или обмене между филиалами), программисты часто сталкиваются с ситуацией, когда стандартная обработка Универсальный обмен данными XML отказывается загружать присоединенные файлы. Проблема проявляется на этапе записи файла в том хранения или при создании каталогов на диске. Система выдает критическую ошибку: «Установлен безопасный режим. Выполнение операции запрещено». Рассмотрим детально, почему это происходит и как обойти данное ограничение, сохранив работоспособность обмена.
Для начала проанализируем, что такое безопасный режим в понимании платформы 1С:Предприятие. Это специальное состояние программного кода, в котором ограничиваются действия, потенциально опасные для сервера или данных. К таким действиям относятся:
В современных конфигурациях, таких как 1С:ERP, Комплексная автоматизация или Управление торговлей, активно используется Библиотека стандартных подсистем (БСП). Особенность заключается в том, что внешние обработки, запущенные интерактивно, часто принудительно переводятся платформой или самой логикой БСП в безопасный режим. В случае с обработкой Универсальный обмен данными XML, ограничение может быть жестко прописано в коде самой обработки в модуле формы или в процедурах инициализации на сервере.
Как мы видим из анализа исходного кода типовой обработки, в процедуре ПриСозданииНаСервере часто встречается строка:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.БезопасныйРежим = Истина;
КонецПроцедуры
Эта установка приводит к тому, что весь последующий код, выполняемый в контексте этой обработки (включая обработчики событий в правилах обмена ПослеЗагрузки), будет запускаться с ограничениями безопасного режима.
Проанализируем ситуацию, когда ошибка возникает при обращении к общим модулям работы с файлами. Типичный текст ошибки указывает на конкретную строку в коде:
{ОбщийМодуль.РаботаСФайламиСлужебныйКлиентСервер.Модуль(158)}: Ошибка при вызове конструктора (Файл): КаталогНаДиске = Новый Файл(ПолныйПодКаталог); по причине: Установлен безопасный режим. Выполнение операции запрещено.
Здесь важно понимать, что конструктор Новый Файл в безопасном режиме разрешен только для временных файлов. При попытке инициализировать объект Файл для пути к сетевому тому (например, \\srv-db10\erp_files\), платформа моментально блокирует операцию, так как это выходит за рамки разрешенного «песочницы» безопасного режима.
Если вы используете внешнюю обработку и у вас есть возможность изменить ее код, самым простым решением будет принудительная установка флага безопасного режима в значение Ложь. Рассмотрим, как это сделать правильно, сохранив возможность возврата к исходному состоянию.
Для этого в обработке или в коде правил обмена (если вы правите правила в КД) необходимо использовать метод УстановитьОтключениеБезопасногоРежима. Это позволит временно игнорировать ограничения платформы для выполнения файловых операций.
Пример реализации алгоритма:
// Сохраняем текущее состояние безопасного режима
ТекущийБезопасныйРежим = БезопасныйРежим();
// Отключаем безопасный режим для выполнения записи на диск
УстановитьОтключениеБезопасногоРежима(Истина);
Попытка
// Здесь выполняется код загрузки файлов, создания каталогов или записи в тома
// Например, вызов типовых процедур БСП по созданию присоединенного файла
РаботаСФайлами.ДобавитьФайл(...);
Исключение
// Обработка ошибок
ЗаписьЖурналаРегистрации("ЗагрузкаФайлов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
// Возвращаем настройки в исходное состояние, если режим был включен
Если ТекущийБезопасныйРежим Тогда
УстановитьБезопасныйРежим(Истина);
КонецЕсли;
Важный нюанс: Метод УстановитьОтключениеБезопасногоРежима(Истина) сработает только в том случае, если у пользователя есть соответствующие права администратора, и код выполняется на стороне сервера.
Вместо того чтобы открывать обработку Универсальный обмен данными XML через меню «Файл — Открыть», мы рекомендуем зарегистрировать ее в справочнике Дополнительные отчеты и обработки. Это штатный механизм БСП, который позволяет управлять безопасностью внешнего кода более гибко.
Разберем шаги настройки:
При таком запуске платформа создаст профиль безопасности (или использует существующий), который разрешит данной конкретной обработке обращаться к ресурсам операционной системы без дополнительных манипуляций с кодом SetSafeMode.
Если ваша информационная база работает в клиент-серверном варианте и в кластере включено использование профилей безопасности, то даже ручная правка кода может не помочь, если путь к сетевому тому не описан в разрешенных ресурсах. Выясним, как правильно настроить профиль.
Рассмотрим алгоритм действий системного администратора 1С:
\\srv-db10\erp_files\).Без этой настройки на уровне кластера, платформа будет блокировать доступ к сетевому ресурсу на уровне операционной системы от имени пользователя, под которым запущена служба rphost, даже если в самом коде 1С вы попытаетесь отключить безопасный режим.
Проанализируем ситуации, когда вышеописанные методы могут не сработать:
Новый Файл.БезопасныйРежим в методе ФоновыеЗадания.Выполнить).rphost, есть права NTFS на папку тома.Подводя итог, можно сказать, что решение проблемы с безопасным режимом требует комплексного подхода: от корректировки внутренней логики обработки до настройки прав на уровне кластера серверов и операционной системы. Использование метода УстановитьОтключениеБезопасногоРежима(Истина) является наиболее эффективным программным способом при работе с правилами конвертации данных, когда нужно обеспечить бесперебойную загрузку больших объемов присоединенных файлов.