Поиск пользователей в базе 1С:Предприятие — одна из самых востребованных задач при разработке отчетов, администрировании системы или создании кастомизированных решений. Чаще всего требуется не просто вывести список сотрудников, а найти конкретного пользователя по логину, ФИО, ролям или последней активности — и сделать это программно, без ручного перебора в интерфейсе.
В этой статье разберем 5 рабочих методов, как найти пользователя в 1С 8.3 с помощью встроенного языка, запросов, API и внешних обработок. Каждый способ проиллюстрирован готовыми примерами кода, которые можно адаптировать под свои задачи. Особое внимание уделим нюансам работы с Справочник.Пользователи, таблицей v8users (для SQL-версий) и объектами сеансов.
Материал будет полезен как начинающим разработчикам 1С, так и опытным специалистам, которые ищут оптимальные решения для интеграции с системами контроля доступа или аудита действий пользователей.
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
Пользователь, ДатаВремя
ИЗ РегистрСведений.ЖурналРегистрации
ГДЕ Метод ПОДОБНО "%Справочник.Номенклатура%"
И Событие = "Изменение"
УПОРЯДОЧИТЬ ПО ДатаВремя УБЫВ;
Можно ли найти пользователей, которые не заходили в систему более месяца?
Да, для этого используйте журнал регистрации или таблицу сеансов. Пример запроса:
ВЫБРАТЬ РАЗЛИЧНЫЕ Пользователь
ИЗ РегистрСведений.ЖурналРегистрации
ГДЕ ДатаВремя > НачалоДня(ТекущаяДата() - 30)
ИНДЕКСИРОВАТЬ ПО Пользователь
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Пользователи.Ссылка КАК Пользователь
ИЗ Справочник.Пользователи КАК Пользователи
ГДЕ НЕ Пользователи.Ссылка В (&СписокАктивных);
Где &СписокАктивных — список пользователей, которые заходили за последние 30 дней.