При разработке собственных отчетов или обработок программисты часто сталкиваются с необходимостью сохранения и извлечения пользовательских настроек (например, основной организации, подразделения или склада). Для этого в платформе «1С:Предприятие 8» предусмотрен механизм ХранилищеОбщихНастроек. Однако нередко при попытке вызвать метод Загрузить система выдает критическую ошибку: «Нарушение прав доступа». Примечательно, что ошибка может возникать у обычного пользователя, хотя при старте системы те же самые настройки считываются корректно. Рассмотрим подробнее, почему это происходит и как правильно настроить программный доступ к хранилищу.
Для начала проанализируем синтаксис метода Загрузить объекта ХранилищеОбщихНастроекМенеджер. Проблема кроется в его четвертом параметре — ИмяПользователя.
Согласно документации платформы, параметры метода выглядят следующим образом:
Строка.Именно здесь скрыта ловушка. Если мы не указываем четвертый параметр, платформа автоматически загружает настройки для текущего сеанса. В этом случае пользователю достаточно иметь базовое право Сохранение данных пользователя. Но как только в коде появляется явное указание имени пользователя (даже если это имя текущего пользователя), система безопасности 1С меняет логику проверки. Платформа считает, что происходит попытка административного доступа к чужим настройкам, и требует наличия права «Администрирование данных».
Часто программисты допускают ошибку, передавая в метод значение из справочника Пользователи. Проанализируем типичный ошибочный код:
// ОШИБОЧНЫЙ ВАРИАНТ
ТекПользователь = Пользователи.ТекущийПользователь(); // Возвращает ссылку на справочник
ИмяДляХранилища = ТекПользователь.Наименование;
Настройка = ХранилищеОбщихНастроек.Загрузить("ОсновнаяОрганизация", , , ИмяДляХранилища);
Проблема заключается в том, что Наименование в справочнике — это лишь представление пользователя (например, «Иванов Иван Петрович»), а хранилищу требуется Имя пользователя информационной базы (например, «ИвановИП»). Если эти строки не совпадают хотя бы в одном символе или регистре, система инициирует проверку прав администратора, которой у рядового бухгалтера нет.
Особенно остро эта проблема проявляется при использовании аутентификации операционной системы (Active Directory). В этом случае внутреннее имя пользователя может содержать префиксы домена, которые не отображаются в экранных формах.
Самый простой и правильный способ работы с настройками текущего пользователя — это полное игнорирование четвертого параметра. Платформа сама определит, чьи данные нужно вернуть. Рассмотрим, как должен выглядеть корректный вызов:
// ПРАВИЛЬНЫЙ ВАРИАНТ (для текущего пользователя)
КлючНастройки = "ОсновнаяОрганизация";
ОснОрганизация = ХранилищеОбщихНастроек.Загрузить(КлючНастройки);
При таком подходе проверка права АдминистрированиеДанных не запускается, и обычный пользователь (бухгалтер, менеджер) сможет беспрепятственно работать с отчетом.
Если логика вашего приложения всё же требует явной передачи имени пользователя (например, при вызове универсальных функций в общих модулях), необходимо получать имя именно из свойств Пользователя Информационной Базы, а не из справочника. Разберем пример кода:
// ПРАВИЛЬНЫЙ ВАРИАНТ с передачей имени
ИмяПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().Name;
Настройка = ХранилищеОбщихНастроек.Загрузить("КлючОбъекта", "", , ИмяПользователяИБ);
Этот метод гарантирует, что переданная строка будет в точности соответствовать ключу в системных таблицах настроек.
В некоторых конфигурациях, особенно самописных, доступ к настройкам зашит глубоко в типовые механизмы, которые трудно переопределить. Если вы столкнулись с ситуацией, когда код невозможно изменить без серьезной ломки архитектуры, можно вынести получение настроек в привилегированный модуль.
Проанализируем шаги реализации:
Сервер и Привилегированный.Пример функции в привилегированном модуле:
Функция ПолучитьНастройкуБезопасно(Ключ, ПользовательИмя) Экспорт
// В привилегированном режиме проверка прав доступа (ACL) игнорируется
Возврат ХранилищеОбщихНастроек.Загрузить(Ключ, , , ПользовательИмя);
КонецФункции
Это «каноничный» способ решения проблем с правами в 1С, когда действие легитимно, но платформа накладывает слишком строгие ограничения.
Важно учитывать ситуацию, описанную пользователями при работе с внешними печатными формами или обработками. Если внешняя форма добавлена в справочник «Дополнительные отчеты и обработки» и запущена в безопасном режиме, любые попытки обращения к системным хранилищам могут блокироваться профилями безопасности.
Посмотрим на ситуацию: при выполнении кода во внешней обработке может возникнуть отказ, даже если вы всё написали правильно. В этом случае проверьте настройки безопасности в справочнике «Дополнительные отчеты и обработки». Если установить флаг Безопасный режим = Ложь (или выбрать соответствующий профиль безопасности), проблема исчезнет.
Резюмируем: для устранения ошибки «Нарушение прав доступа» в ХранилищеОбщихНастроек в 90% случаев достаточно просто перестать передавать четвертый параметр в метод Загрузить. В остальных случаях используйте получение имени через ПользователиИнформационнойБазы или привилегированные серверные модули.