В процессе разработки отчетов или механизмов авторизации программисты часто сталкиваются с необходимостью получения данных из списка пользователей информационной базы (ИБ). Однако при работе под ограниченными правами попытка вызвать метод ПользователиИнформационнойБазы.НайтиПоИмени() или аналогичные функции приводит к ошибке нарушения прав доступа. Это происходит потому, что список пользователей ИБ не является обычным объектом метаданных (как справочник или документ), и права на него регулируются особым образом. Разберем подробно, как решить эту проблему, не нарушая безопасность системы.
Часто начинающие разработчики полагают, что если у роли есть полные права на справочник Справочник.Пользователи, то программный доступ к списку пользователей ИБ будет разрешен автоматически. Это заблуждение. Проанализируем ситуацию: справочник — это объект конфигурации, хранящийся в базе данных, а список пользователей информационной базы — это платформенный механизм, управляющий аутентификацией.
Для прямого чтения данных из ПользователиИнформационнойБазы платформа требует наличия права Администрирование или Администрирование данных. Если у обычного пользователя нет этих прав, любой вызов методов этого объекта (кроме получения данных о самом себе) будет блокироваться. Давать рядовому сотруднику административные права ради формирования отчета — крайне небезопасно, так как это позволит ему менять пароли или удалять других пользователей.
Рассмотрим самый эффективный и безопасный способ — программный обход проверки прав с помощью привилегированного режима. Этот механизм позволяет выполнить участок кода с полными правами, игнорируя ограничения текущего пользователя.
Важное условие: метод УстановитьПривилегированныйРежим(Истина) работает только на стороне сервера или в модулях с установленным флагом "Привилегированный". На клиенте этот метод не окажет никакого влияния.
Разберем пример кода, который необходимо разместить в серверном модуле или в серверной функции модуля отчета:
Функция ПолучитьДанныеПользователяИБ(ИмяПользователя) Экспорт
// Включаем привилегированный режим для обхода ограничений прав
УстановитьПривилегированныйРежим(Истина);
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если ПользовательИБ <> Неопределено Тогда
// Возвращаем структуру с нужными данными, так как сам объект
// ПользовательИнформационнойБазы может быть недоступен вне этого режима
Результат = Новый Структура;
Результат.Вставить("ПолноеИмя", ПользовательИБ.ПолноеИмя);
Результат.Вставить("УникальныйИдентификатор", ПользовательИБ.УникальныйИдентификатор);
Возврат Результат;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Посмотрим на этот подход внимательнее: мы инкапсулировали опасную операцию внутри серверного вызова. Пользователь по-прежнему не имеет прав администратора, но программа временно "повышает" свои полномочия для выполнения конкретной задачи поиска.
Если мы работаем в современной конфигурации (УТ 11, ERP, БП 3.0), то прямое обращение к ПользователиИнформационнойБазы считается плохим тоном. В БСП реализована мощная подсистема управления пользователями, которая уже берет на себя все сложности с правами доступа.
Проанализируем преимущества использования программного интерфейса (API) БСП:
Пользователи и связанные регистры сведений.УстановитьПривилегированныйРежим самостоятельно.Пример получения данных через БСП:
// Вместо поиска в пользователях ИБ, ищем ссылку в справочнике
ПользовательСсылка = Пользователи.ПользовательИБ(ИмяПользователя);
// Или получаем описание пользователя целиком
ОписаниеПользователя = Пользователи.ДанныеПользователя(ПользовательСсылка);
Рассмотрим ситуацию, когда имя пользователя может измениться (например, при смене фамилии). Использование НайтиПоИмени в коде может привести к ошибкам в будущем. Проанализируем более надежный способ идентификации — использование УникальныйИдентификатор.
В справочнике Пользователи (в конфигурациях на базе БСП) есть реквизит ИдентификаторПользователяИБ. Рекомендуется использовать именно его для сопоставления объекта справочника и записи в списке пользователей ИБ:
Идентификатор = ПользовательОбъект.ИдентификаторПользователяИБ;
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор);
Этот метод работает быстрее и надежнее, так как идентификатор никогда не меняется в течение "жизни" пользователя в системе.
Если даже при использовании привилегированного режима ошибка доступа сохраняется, нам необходимо выяснить точную причину. Для этого воспользуемся Журналом регистрации.
Посмотрим на типичный алгоритм отладки:
Роли.Важное примечание: Если база работает в режиме разделения данных (например, в облаке 1С:Fresh), прямой доступ к списку пользователей ИБ может быть полностью заблокирован на уровне платформы для всех пользователей, кроме администратора сервиса. В этом случае работа через справочники-дублеры является единственным возможным вариантом.
Для настройки корректного доступа к данным пользователей информационной базы мы рекомендуем придерживаться следующей стратегии:
ПользователиИнформационнойБазы в серверные модули с включенным привилегированным режимом.Пользователи из состава БСП.Применяя эти методы, вы создадите надежную и безопасную систему, которая будет стабильно работать даже при самых строгих настройках прав доступа.