Кто сейчас работает в базе: получаем имя пользователя и данные сеанса в 1С 8.3

· 9 мин

Содержание

Чтобы вывести текущего пользователя 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 отражают начало, завершение сеанса и аутентификацию. Чтение журнала тоже требует административных прав. На большой базе всегда задавайте ДатаНачала: без отбора выгрузка за годы займёт минуты и много памяти.

Без кода журнал открывается в Конфигураторе через Администрирование → Журнал регистрации — там есть отбор по пользователю и по событию.

Что вам нужно получить?

Особенности платформы, о которые спотыкаются

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

Фоновые и регламентные задания. Фоновое задание, запущенное из кода, выполняется от имени пользователя, который его запустил. Регламентное задание — от имени пользователя, указанного в его настройках. Поэтому ИмяПользователя() внутри регламентного задания часто возвращает служебную учётную запись, а не того, кто «нажал кнопку».

Внешнее соединение и HTTP-сервисы. При COM-подключении пользователь берётся из строки соединения (Usr=). В HTTP-сервисе — тот, под кем прошла аутентификация на веб-сервере публикации. Если в публикации зашит один логин, все запросы придут от одного пользователя.

Привилегированный режим не меняет пользователя. УстановитьПривилегированныйРежим(Истина) снимает проверку прав, но ИмяПользователя() по-прежнему вернёт того же человека. Подменить текущего пользователя изнутри сеанса нельзя.

Переименование. Логин можно поменять, а УникальныйИдентификатор — нет. Храните в своих регистрах и настройках идентификатор или ссылку на справочник, а не строку с именем.

Аутентификация ОС. При входе через Windows ИмяПользователя() вернёт имя пользователя 1С, а не доменное. Доменное лежит в свойстве ПользовательОС вида \\ДОМЕН\логин.

Применение в доработках и при отладке

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

  1. Автозаполнение «Ответственного». В обработчике ПриСозданииНаСервере формы нового документа: Если Объект.Ссылка.Пустая() Тогда Объект.Ответственный = Пользователи.ТекущийПользователь(); КонецЕсли;. В типовых это обычно уже сделано — проверьте, прежде чем дублировать.
  2. Свой лог действий. Пишите в регистр сведений ссылку на пользователя, номер сеанса и ТекущаяДатаСеанса(). Номер сеанса помогает связать запись лога с событиями журнала регистрации.
  3. Ветвление логики по ролям. Вместо проверки логина (Если ИмяПользователя() = "Иванов") проверяйте роль через РольДоступна(). Логин поменяется, роль останется.
  4. Подпись в печатной форме. Полное имя берите из справочника «Пользователи» или из связанного физического лица, а не из ПолноеИмяПользователя(): в учётной записи часто записано сокращение.

Отладка под другим пользователем

Ошибки прав воспроизводятся только под нужной учётной записью. Чтобы запустить отладку под ней:

  1. В Конфигураторе откройте Сервис → Параметры → Запуск 1С:Предприятия.
  2. На вкладке «Основные» укажите пользователя и пароль, под которыми запускать.
  3. Запустите отладку (F5) и поставьте точку останова в проверяемом месте.
  4. В табло или через Shift+F9 вычислите ИмяПользователя() и РольДоступна("ИмяРоли") — так видно, что сеанс открыт именно под ним.

Альтернатива — ярлык с параметрами командной строки:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Test" /N"Кладовщик" /P"пароль"

Не храните ярлык с паролем рабочего пользователя на общих машинах. Для отладки заведите отдельную тестовую учётную запись с теми же ролями.

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

Чем ИмяПользователя() отличается от ПолноеИмяПользователя()?
Первая возвращает логин из поля «Имя» учётной записи, вторая — поле «Полное имя», которое показывается в списке выбора при входе.
Почему ПользователиИнформационнойБазы недоступен в модуле формы?
Менеджер работает только на сервере. Вынесите вызов в процедуру с директивой &НаСервере или &НаСервереБезКонтекста.
Можно ли узнать IP-адрес пользователя?
Из встроенного языка — только имя компьютера через свойство ИмяКомпьютера сеанса. Адреса подключений видны в консоли кластера и в технологическом журнале.
Как узнать, что код выполняется в фоновом задании?
Получите текущий сеанс и проверьте, заполнено ли его свойство ФоновоеЗадание, или сравните ИмяПриложения со значением BackgroundJob.
Почему в списке активных пользователей висит человек, который давно вышел?
Сеанс не закрылся корректно: обрыв сети, зависший клиент. В клиент-серверной базе его завершают в консоли кластера; в файловой он пропадёт после перезапуска процессов, которые держат базу.