Поиск пользователей в базе 1С:Предприятие — одна из самых востребованных задач при разработке отчетов, администрировании системы или создании кастомизированных решений. Чаще всего требуется не просто вывести список сотрудников, а найти конкретного пользователя по логину, ФИО, ролям или последней активности — и сделать это программно, без ручного перебора в интерфейсе.

В этой статье разберем 5 рабочих методов, как найти пользователя в 1С 8.3 с помощью встроенного языка, запросов, API и внешних обработок. Каждый способ проиллюстрирован готовыми примерами кода, которые можно адаптировать под свои задачи. Особое внимание уделим нюансам работы с Справочник.Пользователи, таблицей v8users (для SQL-версий) и объектами сеансов.

Материал будет полезен как начинающим разработчикам , так и опытным специалистам, которые ищут оптимальные решения для интеграции с системами контроля доступа или аудита действий пользователей.

1. Поиск пользователя через справочник «Пользователи»

Самый очевидный и универсальный способ — обращение к справочнику Пользователи, который хранит основную информацию о зарегистрированных в системе пользователях. Этот метод работает во всех конфигурациях на базе 1С:Предприятие 8.3, независимо от типа базы данных (файловая или SQL).

Чтобы найти пользователя по логину, используйте следующий код:

Пользователь = Справочники.Пользователи.НайтиПоНаименованию("ИвановИИ");

Если Не Пользователь.Пустая() Тогда

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

Иначе

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

КонецЕсли;

Для поиска по ФИО или части имени подойдет метод НайтиПоРеквизиту:

Пользователи = Справочники.Пользователи.НайтиПоРеквизиту("ПолноеИмя", "Иванов Иван Иванович");

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

Сообщить("ID: " + Пользователь.Ссылка.УникальныйИдентификатор());

КонецЦикла;

  • 🔍 Плюсы метода: простой синтаксис, работает без прав администратора, подходит для файлового и SQL-вариантов.
  • ⚠️ Ограничения: не показывает пользователей, удаленных из справочника, но сохраненных в базе (например, в журналах регистрации).
  • 🛠 Когда использовать: для проверки существования пользователя перед созданием нового, при формировании отчетов по активным сотрудникам.
💡

Если нужно найти пользователя по части имени (например, только по фамилии), комбинируйте метод Выбрать() с фильтром по строковому полю: Пользователи.Выбрать(Новый Структура("ПолноеИмя", "Иванов%"));

2. Использование запросов к базе данных (SQL и встроенный язык)

Для более гибкого поиска, особенно в SQL-версиях 1С, удобно использовать запросы. Они позволяют искать пользователей по любым реквизитам, включая системные поля, и объединять данные из нескольких таблиц.

Пример запроса для поиска пользователя по логину и выводу его ролей:

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

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

"ВЫБРАТЬ

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

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

| Пользователи.ПолноеИмя КАК ФИО,

| ПользователиРоли.Роль КАК Роль

|ИЗ

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

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.Роли КАК ПользователиРоли

| ПО Пользователи.Ссылка = ПользователиРоли.Ссылка

|ГДЕ

| Пользователи.Наименование = &Логин";

Запрос.УстановитьПараметр("Логин", "ПетровАА");

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

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(СтрШаблон("Пользователь: %1, Роль: %2", Выборка.ФИО, Выборка.Роль));

КонецЦикла;

Для SQL-версий 1С можно обращаться напрямую к системной таблице v8users, где хранятся все пользователи, включая удаленных:

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

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

"ВЫБРАТЬ

| v8users.ref КАК Ссылка,

| v8users.name КАК Логин,

| v8users.descr КАК Описание

|ИЗ

| v8users

|ГДЕ

| v8users.name ПОДОБНО &Поиск";

Запрос.УстановитьПараметр("Поиск", "%Иванов%");

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

⚠️ Внимание: При работе с таблицей v8users учитывайте, что ее структура может отличаться в зависимости от версии платформы. В некоторых конфигурациях (например, 1С:ERP) логины пользователей хранятся в зашифрованном виде.
Метод поиска Подходит для Особенности
Справочник Пользователи Файловые и SQL-базы Простой, но не показывает удаленных пользователей
Запрос к v8users Только SQL-базы Показывает всех пользователей, включая удаленных
Объект ПользователиИнформационнойБазы Файловые и SQL-базы Дает доступ к системным свойствам (например, АутентификацияWindows)

3. Поиск по активным сеансам (текущие подключения)

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

Пример кода для вывода списка активных сеансов:

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

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

Сообщить(СтрШаблон(

"Пользователь: %1 | Host: %2 | Активен с %3",

Сеанс.ИмяПользователя,

Сеанс.Host,

Сеанс.ВремяНачалаСеанса

));

КонецЦикла;

Для принудительного отключения пользователя по имени:

ПользователиИнформационнойБазы.ЗавершитьСеансыПользователя("ИвановИИ");
  • 🔄 Когда пригодится: при блокировке пользователя за долгую неактивность, для освобождения лицензий.
  • 🚫 Ограничение: требуются права администратора.
  • 💡 Совет: перед отключением сохраните данные сеанса (например, в журнал регистрации), чтобы пользователь не потерял несохраненные изменения.
📊 Какой метод поиска пользователей вы используете чаще?
Через справочник Пользователи
Запросы к базе данных
По активным сеансам
Другие способы

4. Поиск по журналам регистрации (история действий)

Когда нужно найти пользователя по его действиям в системе (например, кто создал документ или изменил справочник), поможет журнал регистрации. Этот метод полезен для аудита или восстановления истории изменений.

Пример запроса к журналу регистрации для поиска действий пользователя за последний день:

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

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

"ВЫБРАТЬ

| ЖурналРегистрации.Пользователь КАК Пользователь,

| ЖурналРегистрации.ДатаВремя КАК Когда,

| ЖурналРегистрации.Событие КАК Действие,

| ЖурналРегистрации.Метод КАК Метод

|ИЗ

| РегистрСведений.ЖурналРегистрации КАК ЖурналРегистрации

|ГДЕ

| ЖурналРегистрации.Пользователь = &Пользователь

| И ЖурналРегистрации.ДатаВремя > НачалоДня(ТекущаяДата())";

Запрос.УстановитьПараметр("Пользователь", Справочники.Пользователи.НайтиПоНаименованию("СидоровСС"));

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

Для поиска по типу действия (например, кто удалял документы):

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

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| ЖурналРегистрации.Пользователь КАК Пользователь

|ИЗ

| РегистрСведений.ЖурналРегистрации КАК ЖурналРегистрации

|ГДЕ

| ЖурналРегистрации.Событие = ""Удаление""

| И ЖурналРегистрации.ДатаВремя > НачалоДня(ТекущаяДата() - 7)";

⚠️ Внимание: Журнал регистрации может занимать значительный объем данных. Для ускорения запросов всегда ограничивайте период поиска (например, последняя неделя) и используйте индексируемые поля.
Как очистить журнал регистрации от старых записей?

Для очистки журнала регистрации используйте метод ОчиститьЖурналРегистрации() с указанием даты, до которой нужно удалить записи. Пример: ЖурналыРегистрации.ОчиститьЖурналРегистрации(НачалоДня(ТекущаяДата() - 365)); — удалит записи старше года. Операция требует монопольного доступа к базе!

5. Программный поиск через API и внешние обработки

Для интеграции с внешними системами (например, Active Directory или LDAP) или создания сложных алгоритмов поиска удобно использовать API 1С и внешние обработки. Это актуально, если пользователи синхронизируются с другими сервисами.

Пример кода для поиска пользователя по email (если он хранится в дополнительном реквизите):

Функция НайтиПользователяПоEmail(Email)

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Пользователи.Email = &Email";

Запрос.УстановитьПараметр("Email", Email);

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

Если Результат.Пустой() Тогда

Возврат Неопределено;

Иначе

Возврат Результат.Выбрать().Пользователь;

КонецЕсли;

КонецФункции

Для работы с Active Directory можно использовать COM-объекты (только для Windows-версий 1С):

Попытка

ADs = Новый COMОбъект("ADsDSOObject");

Исключение

Сообщить("Ошибка подключения к Active Directory: " + ОписаниеОшибки());

Возврат;

КонецПопытки;

  • 🌐 Где применяется: синхронизация пользователей между 1С и корпоративными системами, автоматизация создания учетных записей.
  • 🔌 Требования: права на доступ к внешним сервисам, установленные компоненты (например, LDAP-клиент).
  • Преимущество: позволяет искать пользователей по данным, которых нет в стандартных реквизитах 1С (например, табельный номер).

Установить компоненты для работы с COM-объектами|Проверить права доступа к Active Directory|Создать тестового пользователя для проверки|Настроить синхронизацию реквизитов (ФИО, email, отдел)|Проверить логирование ошибок-->

6. Поиск пользователей с использованием расширений и БСП

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

Пример использования БСП для поиска пользователя по дополнительным реквизитам:

Пользователи = Справочники.Пользователи;

Отбор = Новый Структура("Должность", "Менеджер");

Выборка = Пользователи.Выбрать(,, Отбор);

Пока Выборка.Следующий() Цикл

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

КонецЦикла;

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

⚠️ Внимание: При работе с БСП учитывайте версию библиотеки — в старых редакциях (до 2.4) некоторые методы могут отсутствовать или работать иначе. Проверяйте актуальность документации для вашей конфигурации.
💡

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

FAQ: Частые вопросы по поиску пользователей в 1С

Как найти пользователя, если он был удален из справочника, но его действия остались в базе?

Для поиска удаленных пользователей используйте системную таблицу v8users (для SQL-баз) или журнал регистрации. В таблице v8users поле deleted указывает на удаленных пользователей. Пример запроса:

ВЫБРАТЬ ref, name ИЗ v8users ГДЕ deleted = 1;

В журнале регистрации пользователи хранятся по ссылке, даже если они удалены из справочника.

Можно ли найти пользователя по IP-адресу, с которого он заходил?

Да, но только если ведется журнал регистрации с записью IP-адресов. Используйте запрос к регистру ЖурналРегистрации с фильтром по полю Host:

ВЫБРАТЬ Пользователь, ДатаВремя, Host ИЗ РегистрСведений.ЖурналРегистрации ГДЕ Host = &IP;

Учтите, что в файловом варианте 1С IP-адреса могут не сохраняться.

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

Для этого нужно анализировать роли пользователей и права доступа. Примерный алгоритм:

  1. Получить список ролей, имеющих право на документ (через конфигуратор или запрос к метаданным).
  2. Найти пользователей, которым назначены эти роли.

Код для поиска пользователей по роли:

Роль = Справочники.Роли.НайтиПоНаименованию("Продажи");

Пользователи = Роль.Пользователи;

Как найти пользователя, который последний раз изменял конкретный справочник?

Используйте журнал регистрации с фильтром по типу объекта и действию ("Изменение"). Пример:

ВЫБРАТЬ ПЕРВЫЕ 1

Пользователь, ДатаВремя

ИЗ РегистрСведений.ЖурналРегистрации

ГДЕ Метод ПОДОБНО "%Справочник.Номенклатура%"

И Событие = "Изменение"

УПОРЯДОЧИТЬ ПО ДатаВремя УБЫВ;

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

Да, для этого используйте журнал регистрации или таблицу сеансов. Пример запроса:

ВЫБРАТЬ РАЗЛИЧНЫЕ Пользователь

ИЗ РегистрСведений.ЖурналРегистрации

ГДЕ ДатаВремя > НачалоДня(ТекущаяДата() - 30)

ИНДЕКСИРОВАТЬ ПО Пользователь

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ Пользователи.Ссылка КАК Пользователь

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

ГДЕ НЕ Пользователи.Ссылка В (&СписокАктивных);

Где &СписокАктивных — список пользователей, которые заходили за последние 30 дней.