При работе с актуальными релизами 1С:Бухгалтерия предприятия 3.0 (начиная с версии 3.0.160 и выше) многие технические специалисты столкнулись с неприятной ситуацией: при попытке загрузить данные через стандартную обработку УниверсальныйОбменДаннымиXML система выдает критическую ошибку. Текст ошибки гласит: «Действие недоступно в безопасном режиме». Проблема проявляется наиболее остро при попытке записи объектов, связанных с системными настройками или справочником Пользователи.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем механизмы безопасности современной платформы и рассмотрим несколько эффективных способов решения проблемы.
Давайте проанализируем ситуацию с технической стороны. Ошибка возникает в общем модуле СтандартныеПодсистемыСервер. При вызове метода Записать() для объекта (например, справочника Пользователи) срабатывает подписка на событие ПроверитьБезопасныйРежимПередЗаписью. В новых релизах Библиотеки Стандартных Подсистем (БСП) логика работы с безопасным режимом была ужесточена.
Когда вы запускаете типовую обработку УниверсальныйОбменДаннымиXML, встроенную в конфигурацию, в её коде (в процедуре ПриСозданииНаСервере) программно устанавливается признак Объект.БезопасныйРежим = Истина. Платформа 1С, начиная с версии 8.3.24, интерпретирует этот флаг крайне строго: если код выполняется в контексте обработки с включенным безопасным режимом, любая попытка записи «чувствительных» данных, требующих привилегированного режима, блокируется, даже если у текущего пользователя есть «Полные права».
Рассмотрим основные способы решения этой проблемы.
Этот метод позволяет обойти ограничение, не снимая базу с поддержки и не изменяя типовой код напрямую. Нам необходимо принудительно переключить флаг безопасного режима в Ложь при создании формы обработки. Разберем по шагам, как это реализовать:
УниверсальныйОбменДаннымиXML и её форму УправляемаяФорма.ПриСозданииНаСервере создадим обработчик «После» (или используем «Вместо» с сохранением типовой логики).Пример кода, который необходимо внедрить в расширение:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Отключаем безопасный режим, установленный типовым кодом
Объект.БезопасныйРежим = Ложь;
// Дополнительно можно убедиться, что пользователю разрешено администрирование
Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
Возврат; // Или вызвать исключение, если доступ критичен
КонецЕсли;
КонецПроцедуры
Важный нюанс: установите у расширения свойство Безопасный режим в значение Ложь, а Защита от опасных действий также в Ложь, чтобы код расширения имел необходимые права на изменение свойств объекта.
Если вы не хотите вносить изменения в конфигурацию или расширения, мы можем повлиять на поведение обработки непосредственно через правила обмена (файл XML). Для этого в конфигурации «Конвертация данных 2.1» выполним следующие действия:
Пример кода для обработчика в правилах:
// Установка свойства непосредственно в объекте обработки загрузки
Если ТипЗнч(ПеременныеОбмена) = Тип("Структура") Тогда
// Обращаемся к объекту обработки через контекст выполнения
Попытка
ОбработкаОбъект = Параметры.Объект; // В зависимости от контекста
ОбработкаОбъект.БезопасныйРежим = Ложь;
Исключение
// Если контекст иной, можно попробовать через ЭтотОбъект
Попытка
ЭтотОбъект.БезопасныйРежим = Ложь;
Исключение
КонецПопытки;
КонецПопытки;
КонецЕсли;
Этот метод хорош тем, что он «привязан» к конкретному файлу обмена и не влияет на общую безопасность системы при работе других пользователей.
Рассмотрим вариант, когда мы используем УниверсальныйОбменДаннымиXML как внешнюю обработку. Если просто открыть её через меню «Файл — Открыть», она все равно может запуститься в безопасном режиме. Чтобы этого избежать, выполним следующие шаги:
.epf.При запуске из интерфейса дополнительных обработок БСП предоставит ей полный контекст выполнения, и ошибка записи Пользователя исчезнет.
Как временное решение для администратора базы данных, можно воспользоваться параметром запуска платформы. Если запустить клиентское приложение с ключом /UsePrivilegedMode, система будет игнорировать многие проверки безопасности. Однако мы не рекомендуем использовать этот способ на постоянной основе, так как это снижает общую защищенность информационной базы.
Почему 1С внедрила это ограничение? Давайте выясним. Использование обработки «Универсальный обмен» позволяет загружать в базу произвольный код через обработчики событий правил. Если злоумышленник подсунет администратору вредоносный файл правил, код в нем может выполниться с правами администратора. Установка БезопасныйРежим = Истина — это попытка защитить систему от выполнения деструктивных действий внутри таких обработчиков.
Резюме: Если вы уверены в источнике данных и правилах обмена, самым стабильным и правильным решением будет Способ №1 (Создание расширения). Это позволит вам продолжать пользоваться привычным инструментом без необходимости каждый раз править внешние файлы или менять параметры запуска всей системы.