Как исправить ошибку «Действие недоступно в безопасном режиме» при загрузке данных через Универсальный обмен XML?

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

При работе с актуальными релизами 1С:Бухгалтерия предприятия 3.0 (начиная с версии 3.0.160 и выше) многие технические специалисты столкнулись с неприятной ситуацией: при попытке загрузить данные через стандартную обработку УниверсальныйОбменДаннымиXML система выдает критическую ошибку. Текст ошибки гласит: «Действие недоступно в безопасном режиме». Проблема проявляется наиболее остро при попытке записи объектов, связанных с системными настройками или справочником Пользователи.

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

Выясним причину возникновения ошибки

Давайте проанализируем ситуацию с технической стороны. Ошибка возникает в общем модуле СтандартныеПодсистемыСервер. При вызове метода Записать() для объекта (например, справочника Пользователи) срабатывает подписка на событие ПроверитьБезопасныйРежимПередЗаписью. В новых релизах Библиотеки Стандартных Подсистем (БСП) логика работы с безопасным режимом была ужесточена.

Когда вы запускаете типовую обработку УниверсальныйОбменДаннымиXML, встроенную в конфигурацию, в её коде (в процедуре ПриСозданииНаСервере) программно устанавливается признак Объект.БезопасныйРежим = Истина. Платформа 1С, начиная с версии 8.3.24, интерпретирует этот флаг крайне строго: если код выполняется в контексте обработки с включенным безопасным режимом, любая попытка записи «чувствительных» данных, требующих привилегированного режима, блокируется, даже если у текущего пользователя есть «Полные права».

Рассмотрим основные способы решения этой проблемы.

Способ 1: Использование расширения конфигурации (Рекомендуемый)

Этот метод позволяет обойти ограничение, не снимая базу с поддержки и не изменяя типовой код напрямую. Нам необходимо принудительно переключить флаг безопасного режима в Ложь при создании формы обработки. Разберем по шагам, как это реализовать:

  1. Создадим новое расширение в конфигураторе.
  2. Добавим в расширение обработку УниверсальныйОбменДаннымиXML и её форму УправляемаяФорма.
  3. Для процедуры ПриСозданииНаСервере создадим обработчик «После» (или используем «Вместо» с сохранением типовой логики).

Пример кода, который необходимо внедрить в расширение:


&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Отключаем безопасный режим, установленный типовым кодом
    Объект.БезопасныйРежим = Ложь; 
    
    // Дополнительно можно убедиться, что пользователю разрешено администрирование
    Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
        Возврат; // Или вызвать исключение, если доступ критичен
    КонецЕсли;
КонецПроцедуры

Важный нюанс: установите у расширения свойство Безопасный режим в значение Ложь, а Защита от опасных действий также в Ложь, чтобы код расширения имел необходимые права на изменение свойств объекта.

Способ 2: Настройка в правилах обмена (через Конвертацию данных)

Если вы не хотите вносить изменения в конфигурацию или расширения, мы можем повлиять на поведение обработки непосредственно через правила обмена (файл XML). Для этого в конфигурации «Конвертация данных 2.1» выполним следующие действия:

  1. Перейдем в настройки правил обмена.
  2. Найдем обработчик событий «Перед загрузкой данных».
  3. Пропишем в нем программную установку режима.

Пример кода для обработчика в правилах:


// Установка свойства непосредственно в объекте обработки загрузки
Если ТипЗнч(ПеременныеОбмена) = Тип("Структура") Тогда
    // Обращаемся к объекту обработки через контекст выполнения
    Попытка
        ОбработкаОбъект = Параметры.Объект; // В зависимости от контекста
        ОбработкаОбъект.БезопасныйРежим = Ложь;
    Исключение
        // Если контекст иной, можно попробовать через ЭтотОбъект
        Попытка
            ЭтотОбъект.БезопасныйРежим = Ложь;
        Исключение
        КонецПопытки;
    КонецПопытки;
КонецЕсли;

Этот метод хорош тем, что он «привязан» к конкретному файлу обмена и не влияет на общую безопасность системы при работе других пользователей.

Способ 3: Регистрация внешней обработки с особыми правами

Рассмотрим вариант, когда мы используем УниверсальныйОбменДаннымиXML как внешнюю обработку. Если просто открыть её через меню «Файл — Открыть», она все равно может запуститься в безопасном режиме. Чтобы этого избежать, выполним следующие шаги:

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

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

Способ 4: Запуск платформы в привилегированном режиме

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

Проанализируем последствия

Почему 1С внедрила это ограничение? Давайте выясним. Использование обработки «Универсальный обмен» позволяет загружать в базу произвольный код через обработчики событий правил. Если злоумышленник подсунет администратору вредоносный файл правил, код в нем может выполниться с правами администратора. Установка БезопасныйРежим = Истина — это попытка защитить систему от выполнения деструктивных действий внутри таких обработчиков.

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

← На главную