К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно получить список пользователей в 1С

Как программно получить список пользователей в 1С через ПользователиИнформационнойБазы и справочник Пользователи: примеры кода, фильтры, типичные ошибки.

Получить список пользователей в 1С программно можно двумя принципиально разными способами: через менеджер ПользователиИнформационнойБазы, который обращается к данным аутентификации самой платформы, и через справочник «Пользователи», который существует в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП). Выбор зависит от задачи: для проверки ролей, входа в систему и администрирования нужен первый подход, для подстановки пользователя в документы и отчёты — второй.

Путаница между этими двумя сущностями — самая частая причина ошибок. Пользователь информационной базы существует на уровне платформы и хранит логин, пароль, роли и язык. Элемент справочника «Пользователи» — это прикладной объект конфигурации, который может быть связан с пользователем ИБ, а может существовать отдельно (например, для внешних пользователей или служебных записей). Ниже разобраны оба метода с рабочими примерами кода.

Получение пользователей информационной базы через платформу

Менеджер ПользователиИнформационнойБазы предоставляет метод ПолучитьПользователей(), который возвращает массив объектов типа ПользовательИнформационнойБазы. Метод выполняется только в серверном контексте — в тонком и веб-клиенте вызов недоступен. Кроме того, у текущего сеанса должно быть право «Администрирование», иначе платформа вызовет исключение нарушения прав доступа.

Типовой код перебора всех пользователей выглядит так:

МассивПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();

Для Каждого ПользовательИБ Из МассивПользователей Цикл

Сообщить(ПользовательИБ.Имя + " | "

+ ПользовательИБ.ПолноеИмя + " | "

+ Строка(ПользовательИБ.УникальныйИдентификатор));

КонецЦикла;

У каждого объекта доступны ключевые свойства: Имя (логин), ПолноеИмя, УникальныйИдентификатор, АутентификацияСтандартная, АутентификацияОС, ПоказыватьВСпискеВыбора, ЗапрещеноИзменятьПароль, Роли (коллекция ролей) и Язык. Свойство пароля программно прочитать нельзя — платформа хранит только хеш.

Поиск конкретного пользователя и фильтрация списка

Если нужен не весь список, а один пользователь, перебор массива неэффективен. Платформа предоставляет точечные методы поиска: НайтиПоИмени() и НайтиПоУникальномуИдентификатору(). Оба возвращают объект пользователя либо Неопределено, если запись не найдена.

ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");

Если ПользовательИБ = Неопределено Тогда

Сообщить("Пользователь не найден");

Иначе

Сообщить("Найден: " + ПользовательИБ.ПолноеИмя);

КонецЕсли;

Текущего пользователя сеанса получают через ПользователиИнформационнойБазы.ТекущийПользователь() — этот вызов не требует административных прав и часто используется для персонализации логики. Для фильтрации списка по признаку (например, только пользователи с аутентификацией ОС или только те, кто показывается в списке выбора) применяют перебор с проверкой свойства внутри цикла.

Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл

Если ПользовательИБ.ПоказыватьВСпискеВыбора Тогда

// пользователь виден в окне выбора при входе

КонецЕсли;

КонецЦикла;

Получение пользователей через справочник «Пользователи»

В конфигурациях на базе БСП (Управление торговлей, ERP, Бухгалтерия предприятия, Зарплата и управление персоналом и другие) прикладные пользователи хранятся в справочнике «Пользователи». Именно этот справочник используется в документах, задачах, ответственных лицах и отчётах. Для получения списка применяется обычный запрос.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Пользователи.Ссылка КАК Ссылка,

| Пользователи.Наименование КАК Наименование,

| Пользователи.Недействителен КАК Недействителен

|ИЗ

| Справочник.Пользователи КАК Пользователи

|ГДЕ

| НЕ Пользователи.ПометкаУдаления

| И НЕ Пользователи.Недействителен";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл

Сообщить(Результат.Наименование);

КонецЦикла;

Обратите внимание на фильтры: пометка удаления и признак «Недействителен» позволяют исключить архивные записи. В типовых конфигурациях рекомендуется не писать прямые запросы, а использовать программный интерфейс БСП — модуль Пользователи (например, Пользователи.ТекущийПользователь() или Пользователи.НайтиПоИмени() в зависимости от версии библиотеки). Это устойчивее к обновлениям конфигурации.

Сравнение вариантов

ПользователиИнформационнойБазы

Для административных задач: роли, аутентификация, блокировка. Только сервер, требуется право Администрирование.

Справочник Пользователи (запрос)

Для прикладной логики: подстановка в документы, отборы, отчёты. Работает в обычных правах, но возвращает только данные конфигурации.

Модуль Пользователи (БСП)

Рекомендуемый вариант в типовых: готовые функции, совместимость с обновлениями, но зависит от версии библиотеки.

Связь пользователя ИБ и элемента справочника

Связующим звеном между двумя сущностями служит уникальный идентификатор пользователя информационной базы. В БСП он хранится в реквизите справочника «Пользователи» (в типовых — реквизит с идентификатором пользователя ИБ). Зная элемент справочника, можно получить объект пользователя ИБ через НайтиПоУникальномуИдентификатору(), и наоборот.

// От справочника к пользователю ИБ

Идентификатор = СправочникСсылка.ИдентификаторПользователяИБ;

ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор);

// От пользователя ИБ к элементу справочника (через БСП)

ПользовательСсылка = Пользователи.НайтиПоИдентификаторуПользователяИБ(

ПользовательИБ.УникальныйИдентификатор);

Учтите: связь может отсутствовать. Пользователь ИБ без элемента справочника технически войдёт в базу, но прикладная логика (подстановка ответственного, персональные настройки) будет работать некорректно. Обратная ситуация — элемент справочника без пользователя ИБ — нормальна для недействительных сотрудников и служебных записей.

Практические сценарии: активные сеансы и роли

Список пользователей, работающих прямо сейчас

Информацию о текущих сеансах даёт метод ПолучитьСеансыИнформационнойБазы(). Он возвращает массив объектов СеансИнформационнойБазы, у каждого из которых есть свойство Пользователь — ссылка на объект пользователя ИБ. Так можно построить список «кто сейчас в базе» без перебора журнала регистрации.

Сеансы = ПолучитьСеансыИнформационнойБазы();

Для Каждого Сеанс Из Сеансы Цикл

Если Сеанс.Пользователь <> Неопределено Тогда

Сообщить(Сеанс.Пользователь.Имя + " — сеанс " + Сеанс.НомерСеанса);

КонецЕсли;

КонецЦикла;

Фильтрация по роли

Чтобы получить пользователей с конкретной ролью, переберите список и проверьте наличие роли в коллекции Роли через Роли.Содержит(Метаданные.Роли.ИмяРоли). Учтите, что пользователь может получать права и через профили групп доступа в БСП — прямая проверка ролей в этом случае покажет неполную картину.

Порядок действий для типовой задачи
  1. 1
    Определите, какие пользователи нужны: платформенные (ИБ) или прикладные (справочник)
  2. 2
    Для пользователей ИБ напишите серверный вызов ПолучитьПользователей() с проверкой прав
  3. 3
    Для прикладных данных сформируйте запрос к справочнику с отбором по ПометкаУдаления и Недействителен
  4. 4
    Проверьте результат на тестовой базе под учётной записью с ограниченными правами
  5. 5
    Убедитесь, что код не падает при пустом результате и отсутствии связи между сущностями

Типичные ошибки и ограничения

Первая группа ошибок связана с контекстом выполнения. Директива &НаКлиенте с вызовом ПользователиИнформационнойБазы не скомпилируется в тонком клиенте — переносите логику в серверную процедуру. Вторая группа — права: код, работающий у разработчика с полными правами, падает у рядового пользователя. Решение — привилегированный режим с минимальной областью действия.

Третья частая проблема — использование свойства Имя как ключа связи с прикладными данными. Имя пользователя ИБ можно переименовать, после чего связи по строковому значению разрушатся. Всегда опирайтесь на УникальныйИдентификатор — он неизменен в течение жизни записи.

Типичные ошибки
01
Вызов ПолучитьПользователей() на клиенте — ошибка компиляции или выполнения в тонком клиенте
02
Отсутствие проверки на Неопределено после НайтиПоИмени() — падение при обращении к свойствам
03
Связь данных по имени пользователя вместо УникальныйИдентификатор — потеря связей при переименовании
04
Вывод полного списка без фильтра Недействителен — в отчётах появляются уволенные сотрудники
05
УстановитьПривилегированныйРежим на весь модуль вместо точечного участка — лишние риски безопасности

Проверка результата

После внедрения кода проверьте три вещи. Во-первых, полноту: сравните количество записей, возвращаемых кодом, со списком в консоли кластера или в разделе «Администрирование — Пользователи». Во-вторых, устойчивость к правам: запустите обработку под учётной записью без административных прав и убедитесь в предсказуемом поведении. В-третьих, корректность фильтров: уволенные и помеченные на удаление записи не должны попадать в прикладные списки.

Контрольные точки

Как проверить результат

Количество записей
Норма

Совпадает со списком в конфигураторе или консоли

Тревожный признак

Меньше ожидаемого — проверьте права и фильтры

Работа под ограниченными правами
Норма

Код выполняется или корректно сообщает об ограничении

Тревожный признак

Необработанное исключение нарушения прав доступа

Состав списка
Норма

Нет помеченных на удаление и недействительных

Тревожный признак

В выборке присутствуют архивные записи

Итог

Что важно запомнить

Платформенный список получают через ПользователиИнформационнойБазы.ПолучитьПользователей() — только на сервере и с правом Администрирование. Для прикладных задач используйте справочник «Пользователи» или функции БСП. Связывайте сущности по УникальныйИдентификатор, фильтруйте недействительные записи и проверяйте код под ограниченными правами.

Частые вопросы

Можно ли получить список пользователей без административных прав?

Частично. Метод ТекущийПользователь() доступен всем. Полный список через ПолучитьПользователей() требует права Администрирование. Обходной путь — запрос к справочнику «Пользователи»: он подчиняется обычным RLS-ограничениям и правам на справочник, которые есть у большинства пользователей.

Как получить пользователя по логину Windows (аутентификация ОС)?

Переберите список ПолучитьПользователей() и сравнивайте свойство ПользовательОС с искомым значением в формате «\\Домен\Имя». Отдельного метода поиска по пользователю ОС в платформе нет.

Почему НайтиПоИмени() возвращает Неопределено, хотя пользователь есть?

Чаще всего причина в регистре или лишних пробелах — сравнение идёт по точному совпадению. Также проверьте, не ищете ли вы полное имя вместо логина: это разные свойства. Выведите список всех имён в цикле и сверьте значение.

Как получить список пользователей внешней обработкой без изменения конфигурации?

Создайте внешнюю обработку с серверной процедурой, которая вызывает ПолучитьПользователей() и заполняет таблицу значений на форме. Для запуска потребуются права администратора и разрешение на открытие внешних обработок. Изменять конфигурацию не нужно.

Чем отличается справочник «Пользователи» от «Внешние пользователи»?

Справочник «Внешние пользователи» в БСП предназначен для контрагентов и партнёров, работающих через внешний доступ (например, веб-портал). Это отдельный механизм со своими ролями. Для сотрудников организации используется справочник «Пользователи».

Можно ли получить список пользователей через COM-соединение из другой базы?

Да. Установите COM-соединение с целевой базой и выполните тот же код через объект соединения: ПользователиИнформационнойБазы.ПолучитьПользователей(). Учётная запись соединения должна иметь право Администрирование в целевой базе.