Разработка и Конфигурация · 11 мин
Как программно получить список пользователей в 1С
Как программно получить список пользователей в 1С через ПользователиИнформационнойБазы и справочник Пользователи: примеры кода, фильтры, типичные ошибки.
Получить список пользователей в 1С программно можно двумя принципиально разными способами: через менеджер ПользователиИнформационнойБазы, который обращается к данным аутентификации самой платформы, и через справочник «Пользователи», который существует в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП). Выбор зависит от задачи: для проверки ролей, входа в систему и администрирования нужен первый подход, для подстановки пользователя в документы и отчёты — второй.
Путаница между этими двумя сущностями — самая частая причина ошибок. Пользователь информационной базы существует на уровне платформы и хранит логин, пароль, роли и язык. Элемент справочника «Пользователи» — это прикладной объект конфигурации, который может быть связан с пользователем ИБ, а может существовать отдельно (например, для внешних пользователей или служебных записей). Ниже разобраны оба метода с рабочими примерами кода.
Получение пользователей информационной базы через платформу
Менеджер ПользователиИнформационнойБазы предоставляет метод ПолучитьПользователей(), который возвращает массив объектов типа ПользовательИнформационнойБазы. Метод выполняется только в серверном контексте — в тонком и веб-клиенте вызов недоступен. Кроме того, у текущего сеанса должно быть право «Администрирование», иначе платформа вызовет исключение нарушения прав доступа.
Типовой код перебора всех пользователей выглядит так:
МассивПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого ПользовательИБ Из МассивПользователей Цикл
Сообщить(ПользовательИБ.Имя + " | "
+ ПользовательИБ.ПолноеИмя + " | "
+ Строка(ПользовательИБ.УникальныйИдентификатор));
КонецЦикла;
У каждого объекта доступны ключевые свойства: Имя (логин), ПолноеИмя, УникальныйИдентификатор, АутентификацияСтандартная, АутентификацияОС, ПоказыватьВСпискеВыбора, ЗапрещеноИзменятьПароль, Роли (коллекция ролей) и Язык. Свойство пароля программно прочитать нельзя — платформа хранит только хеш.
Поиск конкретного пользователя и фильтрация списка
Если нужен не весь список, а один пользователь, перебор массива неэффективен. Платформа предоставляет точечные методы поиска: НайтиПоИмени() и НайтиПоУникальномуИдентификатору(). Оба возвращают объект пользователя либо Неопределено, если запись не найдена.
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ПользовательИБ = Неопределено Тогда
Сообщить("Пользователь не найден");
Иначе
Сообщить("Найден: " + ПользовательИБ.ПолноеИмя);
КонецЕсли;
Текущего пользователя сеанса получают через ПользователиИнформационнойБазы.ТекущийПользователь() — этот вызов не требует административных прав и часто используется для персонализации логики. Для фильтрации списка по признаку (например, только пользователи с аутентификацией ОС или только те, кто показывается в списке выбора) применяют перебор с проверкой свойства внутри цикла.
Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если ПользовательИБ.ПоказыватьВСпискеВыбора Тогда
// пользователь виден в окне выбора при входе
КонецЕсли;
КонецЦикла;
Получение пользователей через справочник «Пользователи»
В конфигурациях на базе БСП (Управление торговлей, ERP, Бухгалтерия предприятия, Зарплата и управление персоналом и другие) прикладные пользователи хранятся в справочнике «Пользователи». Именно этот справочник используется в документах, задачах, ответственных лицах и отчётах. Для получения списка применяется обычный запрос.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.Ссылка КАК Ссылка,
| Пользователи.Наименование КАК Наименование,
| Пользователи.Недействителен КАК Недействителен
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| НЕ Пользователи.ПометкаУдаления
| И НЕ Пользователи.Недействителен";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить(Результат.Наименование);
КонецЦикла;
Обратите внимание на фильтры: пометка удаления и признак «Недействителен» позволяют исключить архивные записи. В типовых конфигурациях рекомендуется не писать прямые запросы, а использовать программный интерфейс БСП — модуль Пользователи (например, Пользователи.ТекущийПользователь() или Пользователи.НайтиПоИмени() в зависимости от версии библиотеки). Это устойчивее к обновлениям конфигурации.
Сравнение вариантов
Для административных задач: роли, аутентификация, блокировка. Только сервер, требуется право Администрирование.
Для прикладной логики: подстановка в документы, отборы, отчёты. Работает в обычных правах, но возвращает только данные конфигурации.
Рекомендуемый вариант в типовых: готовые функции, совместимость с обновлениями, но зависит от версии библиотеки.
Связь пользователя ИБ и элемента справочника
Связующим звеном между двумя сущностями служит уникальный идентификатор пользователя информационной базы. В БСП он хранится в реквизите справочника «Пользователи» (в типовых — реквизит с идентификатором пользователя ИБ). Зная элемент справочника, можно получить объект пользователя ИБ через НайтиПоУникальномуИдентификатору(), и наоборот.
// От справочника к пользователю ИБ
Идентификатор = СправочникСсылка.ИдентификаторПользователяИБ;
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор);
// От пользователя ИБ к элементу справочника (через БСП)
ПользовательСсылка = Пользователи.НайтиПоИдентификаторуПользователяИБ(
ПользовательИБ.УникальныйИдентификатор);
Учтите: связь может отсутствовать. Пользователь ИБ без элемента справочника технически войдёт в базу, но прикладная логика (подстановка ответственного, персональные настройки) будет работать некорректно. Обратная ситуация — элемент справочника без пользователя ИБ — нормальна для недействительных сотрудников и служебных записей.
Практические сценарии: активные сеансы и роли
Список пользователей, работающих прямо сейчас
Информацию о текущих сеансах даёт метод ПолучитьСеансыИнформационнойБазы(). Он возвращает массив объектов СеансИнформационнойБазы, у каждого из которых есть свойство Пользователь — ссылка на объект пользователя ИБ. Так можно построить список «кто сейчас в базе» без перебора журнала регистрации.
Сеансы = ПолучитьСеансыИнформационнойБазы();
Для Каждого Сеанс Из Сеансы Цикл
Если Сеанс.Пользователь <> Неопределено Тогда
Сообщить(Сеанс.Пользователь.Имя + " — сеанс " + Сеанс.НомерСеанса);
КонецЕсли;
КонецЦикла;
Фильтрация по роли
Чтобы получить пользователей с конкретной ролью, переберите список и проверьте наличие роли в коллекции Роли через Роли.Содержит(Метаданные.Роли.ИмяРоли). Учтите, что пользователь может получать права и через профили групп доступа в БСП — прямая проверка ролей в этом случае покажет неполную картину.
- 1Определите, какие пользователи нужны: платформенные (ИБ) или прикладные (справочник)
- 2Для пользователей ИБ напишите серверный вызов ПолучитьПользователей() с проверкой прав
- 3Для прикладных данных сформируйте запрос к справочнику с отбором по ПометкаУдаления и Недействителен
- 4Проверьте результат на тестовой базе под учётной записью с ограниченными правами
- 5Убедитесь, что код не падает при пустом результате и отсутствии связи между сущностями
Типичные ошибки и ограничения
Первая группа ошибок связана с контекстом выполнения. Директива &НаКлиенте с вызовом ПользователиИнформационнойБазы не скомпилируется в тонком клиенте — переносите логику в серверную процедуру. Вторая группа — права: код, работающий у разработчика с полными правами, падает у рядового пользователя. Решение — привилегированный режим с минимальной областью действия.
Третья частая проблема — использование свойства Имя как ключа связи с прикладными данными. Имя пользователя ИБ можно переименовать, после чего связи по строковому значению разрушатся. Всегда опирайтесь на УникальныйИдентификатор — он неизменен в течение жизни записи.
Проверка результата
После внедрения кода проверьте три вещи. Во-первых, полноту: сравните количество записей, возвращаемых кодом, со списком в консоли кластера или в разделе «Администрирование — Пользователи». Во-вторых, устойчивость к правам: запустите обработку под учётной записью без административных прав и убедитесь в предсказуемом поведении. В-третьих, корректность фильтров: уволенные и помеченные на удаление записи не должны попадать в прикладные списки.
Как проверить результат
Совпадает со списком в конфигураторе или консоли
Меньше ожидаемого — проверьте права и фильтры
Код выполняется или корректно сообщает об ограничении
Необработанное исключение нарушения прав доступа
Нет помеченных на удаление и недействительных
В выборке присутствуют архивные записи
Что важно запомнить
Платформенный список получают через ПользователиИнформационнойБазы.ПолучитьПользователей() — только на сервере и с правом Администрирование. Для прикладных задач используйте справочник «Пользователи» или функции БСП. Связывайте сущности по УникальныйИдентификатор, фильтруйте недействительные записи и проверяйте код под ограниченными правами.
Частые вопросы
Можно ли получить список пользователей без административных прав?
Частично. Метод ТекущийПользователь() доступен всем. Полный список через ПолучитьПользователей() требует права Администрирование. Обходной путь — запрос к справочнику «Пользователи»: он подчиняется обычным RLS-ограничениям и правам на справочник, которые есть у большинства пользователей.
Как получить пользователя по логину Windows (аутентификация ОС)?
Переберите список ПолучитьПользователей() и сравнивайте свойство ПользовательОС с искомым значением в формате «\\Домен\Имя». Отдельного метода поиска по пользователю ОС в платформе нет.
Почему НайтиПоИмени() возвращает Неопределено, хотя пользователь есть?
Чаще всего причина в регистре или лишних пробелах — сравнение идёт по точному совпадению. Также проверьте, не ищете ли вы полное имя вместо логина: это разные свойства. Выведите список всех имён в цикле и сверьте значение.
Как получить список пользователей внешней обработкой без изменения конфигурации?
Создайте внешнюю обработку с серверной процедурой, которая вызывает ПолучитьПользователей() и заполняет таблицу значений на форме. Для запуска потребуются права администратора и разрешение на открытие внешних обработок. Изменять конфигурацию не нужно.
Чем отличается справочник «Пользователи» от «Внешние пользователи»?
Справочник «Внешние пользователи» в БСП предназначен для контрагентов и партнёров, работающих через внешний доступ (например, веб-портал). Это отдельный механизм со своими ролями. Для сотрудников организации используется справочник «Пользователи».
Можно ли получить список пользователей через COM-соединение из другой базы?
Да. Установите COM-соединение с целевой базой и выполните тот же код через объект соединения: ПользователиИнформационнойБазы.ПолучитьПользователей(). Учётная запись соединения должна иметь право Администрирование в целевой базе.