Кто сейчас работает в базе: получаем имя пользователя и данные сеанса в 1С 8.3
Содержание
Чтобы вывести текущего пользователя 1С, вызовите глобальную функцию ИмяПользователя() — она возвращает имя (логин), под которым открыт сеанс, и работает и на клиенте, и на сервере. Полное имя даёт ПолноеИмяПользователя(), а сам объект пользователя информационной базы — ПользователиИнформационнойБазы.ТекущийПользователь() на сервере.
Дальше всё зависит от задачи. Нужна ссылка на элемент справочника «Пользователи» — берите методы БСП. Нужно понять, с какого компьютера и через какой клиент зашёл человек, — смотрите свойства сеанса. Нужно узнать, кто сидит в базе прямо сейчас, — открывайте список сеансов или консоль кластера. Всё это касается платформы 8.3 в целом, а не одной конфигурации.
Три уровня «пользователя» в 1С
В разговорах про «текущего пользователя» смешивают три разных объекта. От того, какой из них нужен, зависит код.
| Что это | Где живёт | Как получить | Тип значения |
|---|---|---|---|
| Пользователь информационной базы | Список пользователей в Конфигураторе | ПользователиИнформационнойБазы.ТекущийПользователь() | ПользовательИнформационнойБазы |
| Элемент справочника «Пользователи» | Данные конфигурации (БСП) | Пользователи.ТекущийПользователь() | СправочникСсылка.Пользователи |
| Сеанс | Кластер или файловая база | ПолучитьТекущийСеансИнформационнойБазы() | СеансИнформационнойБазы |
Пользователь информационной базы — это учётная запись платформы: логин, пароль, роли, способ входа. Элемент справочника — запись конфигурации, на которую ссылаются документы в реквизитах «Автор» или «Ответственный». БСП связывает их по уникальному идентификатору.
Сеанс — одно конкретное подключение. Один и тот же пользователь может держать сразу несколько сеансов: тонкий клиент, Конфигуратор, фоновые задания.
Свойства объекта ПользовательИнформационнойБазы
Объект, который возвращает ТекущийПользователь(), содержит всё, что видно в карточке пользователя в Конфигураторе:
- 🔑
Имя— логин, то же значение, что уИмяПользователя(); - 👤
ПолноеИмя— представление для списка выбора при входе; - 🆔
УникальныйИдентификатор— постоянный ключ, не меняется при переименовании; - 🛡
Роли— коллекция ролей, назначенных пользователю; - 🖥
АутентификацияОСиПользовательОС— вход через учётную запись Windows; - 🔐
АутентификацияСтандартнаяиПарольУстановлен— вход по логину и паролю.
Сам пароль прочитать нельзя: свойство Пароль доступно только для записи. Это поведение платформы, а не ограничение прав.
Функции для получения имени на клиенте и на сервере
Выбор функции упирается в контекст выполнения. Тонкий клиент и веб-клиент не видят менеджер ПользователиИнформационнойБазы — к нему обращаются только на сервере.
| Функция | Клиент | Сервер | Что возвращает |
|---|---|---|---|
ИмяПользователя() | да | да | Строка с логином |
ПолноеИмяПользователя() | да | да | Строка с полным именем |
ПользователиИнформационнойБазы.ТекущийПользователь() | нет | да | Объект пользователя ИБ |
ПолучитьТекущийСеансИнформационнойБазы() | нет | да | Объект сеанса |
Пользователи.ТекущийПользователь() (БСП) | нет | да | Ссылка на справочник |
ПользователиКлиент.ТекущийПользователь() (БСП) | да | нет | Ссылка на справочник |
Вывести имя в сообщение на клиенте
Самый короткий вариант — прямо в обработчике команды формы:
&НаКлиенте
Процедура ПоказатьПользователя(Команда)
Сообщить("Вы вошли как: " + ИмяПользователя()
+ " (" + ПолноеИмяПользователя() + ")");
КонецПроцедуры
Серверного вызова здесь нет, поэтому код подходит и для веб-клиента.
Получить объект пользователя и его роли на сервере
Если нужны роли или идентификатор, переходите на сервер:
&НаСервереБезКонтекста
Функция ОписаниеТекущегоПользователя()
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
СписокРолей = Новый Массив;
Для Каждого Роль Из ПользовательИБ.Роли Цикл
СписокРолей.Добавить(Роль.Имя);
КонецЦикла;
Возврат СтрШаблон("%1, ИД %2, ролей: %3 (%4)",
ПользовательИБ.Имя,
Строка(ПользовательИБ.УникальныйИдентификатор),
Формат(СписокРолей.Количество(), "ЧН=0; ЧГ=0"),
СтрСоединить(СписокРолей, ", "));
КонецФункции
Проверить конкретную роль проще функцией РольДоступна("ИмяРоли") — она есть и на клиенте, и на сервере.
Ссылка на справочник «Пользователи» в типовых конфигурациях
В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на БСП ссылку берут так:
// на сервере
ТекущийПользователь = Пользователи.ТекущийПользователь();
// на клиенте
ТекущийПользователь = ПользователиКлиент.ТекущийПользователь();
Если в базе работают внешние пользователи (личные кабинеты контрагентов), используйте Пользователи.АвторизованныйПользователь(). Он возвращает ссылку либо на «Пользователи», либо на «Внешние пользователи» — ТекущийПользователь() для внешнего вызовет исключение.
В БСП есть параметр сеанса ТекущийПользователь, но обращаться к ПараметрыСеанса напрямую не стоит. Программный интерфейс модуля Пользователи стабилен между версиями, а внутренняя кухня параметров сеанса — нет.
Данные сеанса: компьютер, клиент, время входа
Логин отвечает на вопрос «кто». Сеанс отвечает на вопросы «откуда, через что и с какого времени». Объект СеансИнформационнойБазы содержит:
- 🔢
НомерСеанса— номер, который видно в списке активных пользователей и в консоли кластера; - 🖥
ИмяКомпьютера— имя машины клиента; - 📱
ИмяПриложения— тип клиента:1CV8C(тонкий),1CV8(толстый),WebClient,Designer(Конфигуратор),BackgroundJob,COMConnectionи другие; - 🕐
НачалоСеанса— дата и время входа; - 👤
Пользователь— объект пользователя ИБ этого сеанса; - ⚙️
ФоновоеЗадание— заполнено, если сеанс открыт фоновым заданием.
Пример — собрать строку для служебного сообщения или лога:
&НаСервереБезКонтекста
Функция ОписаниеСеанса()
Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
Возврат СтрШаблон("Сеанс №%1, %2, компьютер %3, вход %4",
Формат(Сеанс.НомерСеанса, "ЧГ=0"),
ПредставлениеПриложения(Сеанс.ИмяПриложения),
Сеанс.ИмяКомпьютера,
Формат(Сеанс.НачалоСеанса, "ДФ='дд.ММ.гггг ЧЧ:мм'"));
КонецФункции
ПредставлениеПриложения() превращает техническое имя 1CV8C в понятное «Тонкий клиент». Если нужен только номер, есть короткая функция НомерСеансаИнформационнойБазы().
Все сеансы базы из кода
Функция ПолучитьСеансыИнформационнойБазы() возвращает массив всех сеансов. Это основа собственного «монитора пользователей»:
&НаСервере
Процедура ЗаполнитьСписокСеансов()
Сеансы.Очистить();
Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
Строка = Сеансы.Добавить();
Строка.Пользователь = Сеанс.Пользователь.Имя;
Строка.Компьютер = Сеанс.ИмяКомпьютера;
Строка.Приложение = ПредставлениеПриложения(Сеанс.ИмяПриложения);
Строка.Начало = Сеанс.НачалоСеанса;
Строка.НомерСеанса = Сеанс.НомерСеанса;
КонецЦикла;
КонецПроцедуры
Здесь Сеансы — реквизит формы типа «Таблица значений» с колонками тех же имён. Метод требует административных прав, поэтому для рядового пользователя вызов обычно оборачивают в УстановитьПривилегированныйРежим(Истина) в серверном модуле.
Привилегированный режим отключает проверку прав для всего кода после вызова. Включайте его в узкой серверной функции и не давайте клиенту передавать туда произвольные параметры.
Кто сейчас в базе: интерфейс и консоль кластера
Иногда код писать не нужно — надо просто посмотреть, кто держит базу перед обновлением.
В пользовательском режиме. Откройте Главное меню → Все функции → Стандартные → Активные пользователи. Если пункта «Все функции» нет, включите его: Главное меню → Сервис → Параметры, флажок «Отображать команду “Все функции”». В типовых конфигурациях на БСП та же обработка доступна и из раздела «Администрирование».
В Конфигураторе. Пункт Администрирование → Активные пользователи показывает тот же список: пользователь, приложение, компьютер, время начала сеанса.
В консоли кластера (клиент-серверная база ). Откройте оснастку «Администрирование серверов 1С:Предприятия», раскройте кластер → «Информационные базы» → нужная база → «Сеансы». Здесь видно больше, чем изнутри базы:
- 🧩 рабочий процесс, на котором обслуживается сеанс;
- ⏱ время последней активности — по нему вычисляют «зависшие» сеансы;
- 🔒 захваченные блокировки и потреблённую лицензию.
Если консоль не открывается после обновления платформы, обычно помогает перерегистрация библиотеки radmin.dll нужной версии командой regsvr32 из каталога bin платформы от имени администратора.
Из командной строки. На сервере с запущенным ras то же самое даёт утилита rac:
rac cluster list
rac infobase summary list --cluster=<ид_кластера>
rac session list --cluster=<ид_кластера> --infobase=<ид_базы>
rac session list --cluster=<ид_кластера> --licenses
Первая команда возвращает идентификатор кластера, вторая — идентификаторы баз. Остальные ключи смотрите в rac help session.
Завершение сеанса из консоли или командой rac session terminate обрывает работу пользователя без сохранения. Несохранённые документы пропадут. Предупредите людей и делайте это вне рабочих часов.
Пользователь в запросах и журнале регистрации
Отбор документов текущего пользователя в запросе
В языке запросов нет встроенной функции «текущий пользователь». Значение передают параметром:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка,
| Док.Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Ответственный = &ТекущийПользователь
| И Док.Дата >= &НачалоПериода";
Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.ТекущийПользователь());
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();
Имя реквизита (Ответственный, Автор) смотрите в конкретном документе: в разных объектах оно разное. В реквизит пишется ссылка на справочник, поэтому сравнивать с ИмяПользователя()-строкой нельзя.
История входов из журнала регистрации
Журнал регистрации хранит, кто, когда и откуда входил. Выгрузить события можно методом ВыгрузитьЖурналРегистрации:
&НаСервереБезКонтекста
Функция ВходыЗаСегодня()
Таблица = Новый ТаблицаЗначений;
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()));
Отбор.Вставить("Событие", "_$Session$_.Start");
ВыгрузитьЖурналРегистрации(Таблица, Отбор);
Итог = Новый Массив;
Для Каждого Стр Из Таблица Цикл
Итог.Добавить(СтрШаблон("%1 — %2 (%3)",
Формат(Стр.Дата, "ДФ=ЧЧ:мм"), Стр.ИмяПользователя, Стр.Компьютер));
КонецЦикла;
Возврат СтрСоединить(Итог, Символы.ПС);
КонецФункции
События _$Session$_.Start, _$Session$_.Finish и _$Session$_.Authentication отражают начало, завершение сеанса и аутентификацию. Чтение журнала тоже требует административных прав. На большой базе всегда задавайте ДатаНачала: без отбора выгрузка за годы займёт минуты и много памяти.
Без кода журнал открывается в Конфигураторе через Администрирование → Журнал регистрации — там есть отбор по пользователю и по событию.
ИмяПользователя() на клиенте, без серверного вызова.Пользователи.ТекущийПользователь() на сервере или ПользователиКлиент.ТекущийПользователь() на клиенте (конфигурации на БСП).ПользователиИнформационнойБазы.ТекущийПользователь() на сервере, коллекция Роли или РольДоступна().ПолучитьТекущийСеансИнформационнойБазы() на сервере.ПолучитьСеансыИнформационнойБазы() из кода, «Активные пользователи» в интерфейсе или «Сеансы» в консоли кластера._$Session$_.Start.Особенности платформы, о которые спотыкаются
Пустой список пользователей. Если в Конфигураторе не заведено ни одного пользователя, ИмяПользователя() вернёт пустую строку. Код, который строит что-то на логине, должен это учитывать. В типовых конфигурациях на БСП для такой базы служебно используется неуказанный пользователь — не ориентируйтесь на него в отборах.
Фоновые и регламентные задания. Фоновое задание, запущенное из кода, выполняется от имени пользователя, который его запустил. Регламентное задание — от имени пользователя, указанного в его настройках. Поэтому ИмяПользователя() внутри регламентного задания часто возвращает служебную учётную запись, а не того, кто «нажал кнопку».
Внешнее соединение и HTTP-сервисы. При COM-подключении пользователь берётся из строки соединения (Usr=). В HTTP-сервисе — тот, под кем прошла аутентификация на веб-сервере публикации. Если в публикации зашит один логин, все запросы придут от одного пользователя.
Привилегированный режим не меняет пользователя. УстановитьПривилегированныйРежим(Истина) снимает проверку прав, но ИмяПользователя() по-прежнему вернёт того же человека. Подменить текущего пользователя изнутри сеанса нельзя.
Переименование. Логин можно поменять, а УникальныйИдентификатор — нет. Храните в своих регистрах и настройках идентификатор или ссылку на справочник, а не строку с именем.
Аутентификация ОС. При входе через Windows ИмяПользователя() вернёт имя пользователя 1С, а не доменное. Доменное лежит в свойстве ПользовательОС вида \\ДОМЕН\логин.
Применение в доработках и при отладке
Где на практике пригождается текущий пользователь:
- Автозаполнение «Ответственного». В обработчике
ПриСозданииНаСервереформы нового документа:Если Объект.Ссылка.Пустая() Тогда Объект.Ответственный = Пользователи.ТекущийПользователь(); КонецЕсли;. В типовых это обычно уже сделано — проверьте, прежде чем дублировать. - Свой лог действий. Пишите в регистр сведений ссылку на пользователя, номер сеанса и
ТекущаяДатаСеанса(). Номер сеанса помогает связать запись лога с событиями журнала регистрации. - Ветвление логики по ролям. Вместо проверки логина (
Если ИмяПользователя() = "Иванов") проверяйте роль черезРольДоступна(). Логин поменяется, роль останется. - Подпись в печатной форме. Полное имя берите из справочника «Пользователи» или из связанного физического лица, а не из
ПолноеИмяПользователя(): в учётной записи часто записано сокращение.
Отладка под другим пользователем
Ошибки прав воспроизводятся только под нужной учётной записью. Чтобы запустить отладку под ней:
- В Конфигураторе откройте
Сервис → Параметры → Запуск 1С:Предприятия. - На вкладке «Основные» укажите пользователя и пароль, под которыми запускать.
- Запустите отладку (F5) и поставьте точку останова в проверяемом месте.
- В табло или через Shift+F9 вычислите
ИмяПользователя()иРольДоступна("ИмяРоли")— так видно, что сеанс открыт именно под ним.
Альтернатива — ярлык с параметрами командной строки:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Test" /N"Кладовщик" /P"пароль"
Не храните ярлык с паролем рабочего пользователя на общих машинах. Для отладки заведите отдельную тестовую учётную запись с теми же ролями.
Частые вопросы
Чем ИмяПользователя() отличается от ПолноеИмяПользователя()?
Почему ПользователиИнформационнойБазы недоступен в модуле формы?
&НаСервере или &НаСервереБезКонтекста.Можно ли узнать IP-адрес пользователя?
ИмяКомпьютера сеанса. Адреса подключений видны в консоли кластера и в технологическом журнале.Как узнать, что код выполняется в фоновом задании?
ФоновоеЗадание, или сравните ИмяПриложения со значением BackgroundJob.