При работе в конфигурациях на платформе «1С:Предприятие 8.3» разработчики часто сталкиваются с неприятной ошибкой: при открытии или создании документа у пользователя с ограниченными правами внезапно возникает системное сообщение «Нарушение прав доступа!». При этом детальный анализ стека ошибки указывает на безобидную, на первый взгляд, строчку получения настроек по умолчанию.
В этой статье мы подробно разберем, почему возникает данная проблема, как устроена система безопасности платформы при работе с хранилищами настроек, и рассмотрим четыре практических способа устранения этой ошибки.
Проанализируем типичный стек вызова ошибки, который часто встречается в подобных ситуациях:
{Справочник.Организации.МодульМенеджера(37)}: ОсновнаяОрганизация = ХранилищеОбщихНастроек.Загрузить("ОсновнаяОрганизация",,, ИмяПользователяИБ);
{Документ.КСГР_Претензия.Форма.ФормаДокумента.Форма(11)}: Объект.Организация = Справочники.Организации.ОрганизацияПоУмолчанию(Объект.Ответственный);
по причине: Нарушение прав доступа!
Давайте разберем логику работы этой цепочки. При открытии или заполнении документа (в нашем примере это нетиповой документ КСГР_Претензия) система пытается определить организацию по умолчанию для пользователя, указанного в реквизите Ответственный. Для этого вызывается метод ХранилищеОбщихНастроек.Загрузить(), в который четвертым параметром передается имя конкретного пользователя (ИмяПользователяИБ).
Именно здесь кроется главная причина ошибки. На уровне платформы «1С:Предприятие» действует жесткое правило безопасности: чтение и запись настроек другого пользователя разрешены только сеансам, обладающим административными правами. В терминах метаданных конфигурации для выполнения этого действия у пользователя должна быть активна роль, содержащая право «Администрирование данных» (Data Administration).
Если текущий пользователь системы (например, обычный менеджер или бухгалтер) пытается открыть документ, автором которого является другой сотрудник, код пытается прочитать настройки автора. У текущего пользователя нет административных прав, и платформа мгновенно генерирует исключение Нарушение прав доступа!.
Рассмотрим детально четыре способа решения этой проблемы, начиная от самых правильных (с точки зрения архитектуры) и заканчивая быстрыми административными мерами.
В большинстве случаев заполнение реквизитов по умолчанию (таких как основная организация, склад или подразделение) требуется только в момент создания нового документа. Когда документ уже записан и открывается повторно, перезаписывать его реквизиты дефолтными значениями не нужно — данные должны просто считываться из базы данных.
Если мы заполняем настройки только для нового документа, то текущим ответственным гарантированно является тот пользователь, который этот документ создает. А для чтения собственных настроек административные права не требуются. Достаточно стандартного права «Сохранение данных пользователя», которое по умолчанию есть у всех базовых ролей.
Для исправления кода нам необходимо:
ОбработкаЗаполнения на сервере).Загрузить. Если этот параметр опущен, платформа автоматически прочитает настройки текущего активного сеанса.Посмотрим на пример безопасного кода в модуле менеджера справочника или общем модуле:
// Небезопасный код, вызывающий ошибку у не-администраторов:
// ОсновнаяОрганизация = ХранилищеОбщихНастроек.Загрузить("ОсновнаяОрганизация",,, ИмяПользователяИБ);
// Безопасный код для работы в контексте текущего пользователя:
ОсновнаяОрганизация = ХранилищеОбщихНастроек.Загрузить("ОсновнаяОрганизация");
Такой подход полностью исключает появление ошибок прав и является наиболее красивым и архитектурно правильным решением.
Что делать, если бизнес-логика вашей задачи действительно требует, чтобы один пользователь мог программно увидеть настройки другого (например, руководитель контролирует параметры работы своих подчиненных)? В этом случае нам на помощь приходит механизм привилегированного режима.
Привилегированный режим позволяет временно отключить проверку прав доступа (включая ограничения RLS и права на администрирование данных) для выполнения конкретных технологических операций.
Важное ограничение: метод УстановитьПривилегированныйРежим(Истина) работает исключительно в серверном контексте. Попытка вызвать его на клиенте не принесет никакого результата.
Рассмотрим по шагам, как правильно реализовать это решение:
// Функция расположена в привилегированном общем модуле "ксгр_РаботаСНастройками"
Функция ПолучитьОсновнуюОрганизациюПользователя(ИмяПользователяИБ) Экспорт
// В привилегированном модуле проверка прав отключена,
// чтение настроек любого пользователя выполнится без ошибок
Возврат ХранилищеОбщихНастроек.Загрузить("ОсновнаяОрганизация",,, ИмяПользователяИБ);
КонецФункции
// Вместо прямого обращения к ХранилищеОбщихНастроек:
Объект.Организация = ксгр_РаботаСНастройками.ПолучитьОсновнуюОрганизациюПользователя(ИмяПользователяИБ);
Благодаря этому система безопасно получит нужные данные из СУБД в обход ограничений прав текущего сеанса.
Если ваша конфигурация разработана на основе «Библиотеки стандартных подсистем» (БСП), что справедливо для большинства современных решений, включая «1С:Бухгалтерия предприятия 8.3», «1С:ERP» и «1С:Управление торговлей», в вашем распоряжении уже есть готовые инструменты.
Разработчики БСП предусмотрели возможные проблемы с правами доступа и создали специальные безопасные «обертки» для платформенных методов. Вместо прямого вызова ХранилищеОбщихНастроек.Загрузить рекомендуется использовать стандартизированную функцию БСП:
// Использование стандартного метода БСП
ЗначениеНастройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ОсновнаяОрганизация", , , ИмяПользователяИБ);
Эта функция «под капотом» проверяет контекст вызова, права текущего пользователя и, в случае невозможности прямого чтения, пытается выполнить операцию безопасно. В крайнем случае она не вызовет аварийное завершение работы программы с ошибкой Нарушение прав доступа!, а корректно вернет пустое значение (Неопределено), которое код сможет обработать стандартным образом.
Если у вас нет возможности или желания вносить изменения в программный код (конфигурация находится на поддержке без возможности изменения, либо код закрыт), проблему можно решить чисто административным путем в Конфигураторе.
Для этого пользователю, у которого возникает ошибка, необходимо назначить роль, содержащую право «Администрирование данных».
Проанализируем этот процесс подробнее:
Роли.ксгр_ЧтениеНастроекПользователей).Важное предупреждение: данный способ является наименее рекомендуемым с точки зрения информационной безопасности. Предоставление права «Администрирование данных» открывает пользователю доступ к ряду критических административных функций платформы. Используйте этот метод только в доверенной локальной среде и в случаях, когда другие варианты решения недоступны.
Подводя итог, отметим, что лучшим решением всегда является сочетание Способа 1 (исправление логики заполнения только для новых документов) и Способа 2 (вынос специфических операций чтения в привилегированный серверный контекст). Это гарантирует стабильную, быструю и безопасную работу вашей информационной системы на платформе «1С:Предприятие 8.3».