При переносе нормативно-справочной информации, констант и регистров сведений в новую или чистую базу с помощью типовой обработки с ИТС «Выгрузка и загрузка данных XML» администраторы и разработчики часто сталкиваются с ошибкой «Нарушение прав доступа!». Ошибка возникает даже при запуске процесса под учетной записью с полными правами и включенными всеми административными ролями.
Разберем детально, почему платформа блокирует запись объектов, как с помощью журнала регистрации найти конкретный проблемный элемент и какими способами можно успешно завершить перенос данных.
Посмотрим на фрагмент кода обработки, в котором генерируется исключение:
Если ПриЗагрузкеИспользоватьРежимОбменаДанными Тогда
Попытка // Планы обмена свойства ОбменДанными не имеют
ЗаписанноеЗначение.ОбменДанными.Загрузка = Истина;
Исключение
КонецПопытки;
КонецЕсли;
Попытка
ЗаписанноеЗначение.Записать();
Исключение
// Ошибка: Нарушение прав доступа!
Проанализируем, почему установка свойства ОбменДанными.Загрузка = Истина не помогает избежать этой ошибки:
Загрузка = Истина отключает прикладные проверки в модулях объектов (например, в процедурах ПередЗаписью и ПриЗаписи), но не отменяет платформенную проверку прав доступа. Если в правах пользователя отсутствует базовое право на изменение или запись таблицы метаданных, платформа прерывает операцию системным исключением.КлючОбластиДанных, ПровайдерSMS, служебные параметры разделения данных и версионирования подсистем). Права на их прямое изменение или запись в ролях конфигурации сняты даже у роли «Полные права». Запись таких объектов в штатном режиме выполняется платформой исключительно через привилегированные модули.Выясним, на каком конкретно объекте метаданных происходит отказ в доступе. Для этого выполним следующие действия:
Константа.Ключ области данных. Отказ права: Изменение).Рассмотрим основной и наиболее корректный способ решения проблемы при переносе нормативно-справочной информации в чистую базу:
КлючОбластиДанных, ПровайдерSMS, параметры работы программы).Если файл выгрузки уже сформирован и имеет большой объем, перезагружать его заново необязательно:
При загрузке некоторых служебных параметров конфигурация может потребовать инициализации служебных механизмов. Разберем, как корректно выполнить первичное обновление:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8c.exe" ENTERPRISE /IBName "ИмяБазы" /C ЗапуститьОбновлениеИнформационнойБазы
Если необходимо принудительно перенести все константы без модификации состава выгрузки, переведем процедуру записи в привилегированный контекст в коде обработки:
Сериализатор.ПрочитатьXML() или перед вызовом метода Записать() добавим программное включение привилегированного режима:
УстановитьПривилегированныйРежим(Истина);
ЗаписанноеЗначение.Записать();
УстановитьПривилегированныйРежим(Ложь);
Посмотрим на общие правила безопасного использования обработки «Выгрузка и загрузка данных XML»: