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