Как поставить текущего пользователя 1С в реквизит, отбор или отчёт

· 9 мин

Содержание

Чтобы поставить текущего пользователя 1С в реквизит документа, в отбор списка или в запрос, в типовых конфигурациях на БСП вызывайте Пользователи.ТекущийПользователь() на сервере. Функция вернёт ссылку на элемент справочника «Пользователи». Если нужна только строка с логином, хватит встроенной ИмяПользователя(): она работает и на клиенте, и на сервере.

Всё ниже относится к платформе 8.3 и общее для БП 3.0, ЗУП 3.1, УТ 11 и других конфигураций на Библиотеке стандартных подсистем. Для самописных баз без БСП есть отдельный вариант через объект ПользователиИнформационнойБазы.

Какие функции возвращают текущего пользователя

В 1С два разных «пользователя». Первый — пользователь информационной базы: логин, пароль, роли. Его хранит платформа, в Конфигураторе он виден в Администрирование → Пользователи. Второй — элемент справочника «Пользователи»: на него ссылаются реквизиты «Ответственный», «Автор», «Менеджер». Связывает их реквизит справочника ИдентификаторПользователяИБ.

От того, что нужно получить, зависит функция:

Что нужноФункцияГде работаетЧто вернёт
Логин (строка)ИмяПользователя()клиент и сервер"Иванова"
Полное имя (строка)ПолноеИмяПользователя()клиент и сервер"Иванова Анна Петровна"
Объект пользователя ИБПользователиИнформационнойБазы.ТекущийПользователь()сервер, толстый клиент, внешнее соединениеПользовательИнформационнойБазы
Ссылка на справочник (БСП)Пользователи.ТекущийПользователь()серверСправочникСсылка.Пользователи
Ссылка на справочник (БСП)ПользователиКлиентСервер.ТекущийПользователь()клиент и серверСправочникСсылка.Пользователи
Ссылка с учётом внешних пользователейПользователи.АвторизованныйПользователь()серверссылка на пользователя или внешнего пользователя

💡 Для реквизитов типа СправочникСсылка.Пользователи строка из ИмяПользователя() не подойдёт. Нужна ссылка — значит, функция из БСП или поиск по идентификатору.

Пользователи.ТекущийПользователь(): подставляем пользователя в коде

Заполнение реквизита при создании документа

Самый частый сценарий — в новом документе поле «Ответственный» должно сразу показывать того, кто его создал. В свойствах реквизита в Конфигураторе нет значения заполнения «текущий пользователь». Поэтому значение ставят в модуле объекта, в обработчике ОбработкаЗаполнения:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

	Если Не ЗначениеЗаполнено(Ответственный) Тогда
		Ответственный = Пользователи.ТекущийПользователь();
	КонецЕсли;

КонецПроцедуры

Обработчик срабатывает при интерактивном создании, при вводе на основании и при вызове метода Заполнить(). Проверка ЗначениеЗаполнено нужна, чтобы не затереть ответственного, пришедшего из документа-основания.

Если нужно ставить пользователя только при открытии новой формы, используйте модуль формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Если Параметры.Ключ.Пустая() Тогда
		Объект.Ответственный = Пользователи.ТекущийПользователь();
	КонецЕсли;

КонецПроцедуры

Параметры.Ключ.Пустая() отличает новый объект от открытого существующего.

Автор при записи

Если поле «Автор» должно фиксировать того, кто первым записал документ, заполняйте его в ПередЗаписью модуля объекта, но только для новых объектов:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

	Если ЭтоНовый() Тогда
		Автор = Пользователи.ТекущийПользователь();
	КонецЕсли;

КонецПроцедуры

Если реквизиты добавляете в типовую конфигурацию, делайте это в расширении, а не снятием с поддержки. Иначе каждое обновление превратится в ручное сравнение и объединение.

Подпись в печатной форме

В печатных формах текущего пользователя ставят в строку «Исполнитель» или «Документ составил». Брать стоит не логин, а наименование из справочника: Строка(Пользователи.ТекущийПользователь()). Логин вроде ivanova_a на бумаге выглядит странно, а наименование обычно хранит ФИО. Если на документе должен стоять не печатающий, а ответственный, выводите реквизит документа, а не текущего пользователя: распечатать бумагу может бухгалтер, а отвечает за неё менеджер.

Конфигурация без БСП

В самописной базе общего модуля Пользователи нет. Ссылку находят по уникальному идентификатору пользователя ИБ, если в справочнике хранится такой реквизит:

&НаСервереБезКонтекста
Функция ТекущийПользовательСсылка()

	ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
	Возврат Справочники.Пользователи.НайтиПоРеквизиту(
		"ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);

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

Если реквизит в справочнике имеет тип «Строка», а не «УникальныйИдентификатор», передайте Строка(ПользовательИБ.УникальныйИдентификатор). Искать по наименованию ненадёжно: два сотрудника могут быть однофамильцами, а логин могут переименовать.

Сеанс, параметры сеанса и настройки пользователя

Параметр сеанса ТекущийПользователь

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

Параметры сеанса доступны только на сервере. Для чтения роли нужно право «Получение» на параметр. В типовых ролях оно есть, в самописных ролях его часто забывают.

Текущий сеанс информационной базы

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

&НаСервереБезКонтекста
Функция ОписаниеСеанса()

	Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
	Возврат СтрШаблон("%1, компьютер %2, приложение %3, сеанс № %4 с %5",
		Сеанс.Пользователь.Имя,
		Сеанс.ИмяКомпьютера,
		Сеанс.ИмяПриложения,
		Формат(Сеанс.НомерСеанса, "ЧГ=0"),
		Формат(Сеанс.НачалоСеанса, "ДФ='дд.ММ.гггг ЧЧ:мм'"));

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

ИмяПриложения покажет, чем подключился пользователь: тонкий клиент, веб-клиент, фоновое задание, COM-соединение. Удобно для журналов и диагностики.

Роли и проверка прав

Чаще всего текущего пользователя получают, чтобы решить, что ему показать. Для этого не нужно перебирать роли вручную: РольДоступна("ПолныеПрава") вернёт Истина или Ложь и работает на клиенте. В БСП для проверки полных прав есть Пользователи.ЭтоПолноправныйПользователь().

Хранилища настроек

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

Журнал регистрации: кто что сделал

Записывать текущего пользователя в собственные регистры ради истории изменений часто не нужно. Платформа сама пишет логин в каждую запись журнала регистрации. Свои события туда добавляет ЗаписьЖурналаРегистрации():

ЗаписьЖурналаРегистрации("Заказы.СменаОтветственного",
	УровеньЖурналаРегистрации.Информация,
	Метаданные.Документы.ЗаказКлиента,
	Ссылка,
	"Ответственный изменён вручную");

Пользователя, компьютер и время платформа подставит сама. Посмотреть записи можно в Конфигураторе или в режиме «Предприятие» через функции для технического специалиста, отобрав по имени события.

Пользователь 1С и пользователь Windows — не одно и то же

Пользователь 1С — это учётная запись в информационной базе. Пользователь операционной системы — учётная запись Windows или Linux, под которой запущен клиент. Связь между ними есть только при включённой аутентификации операционной системы.

Её настраивают в карточке пользователя ИБ: флажок «Аутентификация операционной системы» и поле с именем вида \\DOMAIN\ivanova. В коде это поле читается так:

ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ИмяВWindows = ПользовательИБ.ПользовательОС; // "\\DOMAIN\ivanova" или ""

Если аутентификация ОС не настроена, строка будет пустой, даже если человек работает в домене.

Когда нужен именно логин Windows на клиентской машине, а связи нет, используют COM-объект. Работает только в тонком или толстом клиенте под Windows:

&НаКлиенте
Функция ЛогинWindows()

	Сеть = Новый COMОбъект("WScript.Network");
	Возврат Сеть.UserName;

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

Имя компьютера, на котором выполняется код, вернёт встроенная функция ИмяКомпьютера(). На клиенте — имя машины пользователя, на сервере — имя сервера 1С.

СценарийПользователь 1СПользователь ОС
Вход по логину и паролю 1Сесть1С о нём не знает
Аутентификация ОС настроенаестьв свойстве ПользовательОС
Код на сервере 1Сестьсервер работает под служебной учётной записью
Веб-клиентестьиз браузера недоступен

Текущий пользователь в запросе и отчёте

Параметр запроса

В языке запросов 1С нет функции «текущий пользователь». Значение всегда передают параметром:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Заказ.Ссылка,
|	Заказ.Дата,
|	Заказ.СуммаДокумента
|ИЗ
|	Документ.ЗаказКлиента КАК Заказ
|ГДЕ
|	Заказ.Ответственный = &ТекущийПользователь
|	И НЕ Заказ.ПометкаУдаления";
Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.ТекущийПользователь());
Выборка = Запрос.Выполнить().Выбрать();

Имя таблицы и реквизитов здесь условное. Подставьте те, что есть в вашей конфигурации.

Если в запросе нужно ФИО, а не ссылка, возьмите поле Наименование справочника «Пользователи» через точку: Заказ.Ответственный.Наименование.

Динамический список «Мои документы»

Чтобы список показывал только документы текущего пользователя, в запрос динамического списка добавьте условие ГДЕ Ответственный = &ТекущийПользователь, а параметр установите при создании формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Список.Параметры.УстановитьЗначениеПараметра(
		"ТекущийПользователь", Пользователи.ТекущийПользователь());

КонецПроцедуры

Без установки параметра список выдаст ошибку о неустановленном параметре или пустой результат.

Отчёт на СКД

В схеме компоновки параметр ТекущийПользователь создаётся автоматически, когда он есть в тексте запроса. Чтобы пользователь не выбирал себя вручную, заполните параметр в модуле отчёта:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
		"ТекущийПользователь", Пользователи.ТекущийПользователь());

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

	Процессор = Новый ПроцессорКомпоновкиДанных;
	Процессор.Инициализировать(Макет, , ДанныеРасшифровки, Истина);

	ДокументРезультат.Очистить();
	Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	Вывод.УстановитьДокумент(ДокументРезультат);
	Вывод.Вывести(Процессор);

КонецПроцедуры

В свойствах параметра на вкладке «Параметры» схемы снимите флажок доступности для пользователя, если менять его не нужно.

Ограничение доступа на уровне записей

В тексте ограничения RLS параметр сеанса можно указать напрямую, через &: ГДЕ Ответственный = &ТекущийПользователь. Так менеджер видит только свои заказы. В типовых конфигурациях RLS строится через шаблоны и группы доступа БСП, поэтому свои условия добавляйте аккуратно и только в расширении.

Тонкий клиент и веб-клиент: что доступно на клиенте

Управляемые формы делят код на клиентский и серверный. Тонкий и веб-клиент не видят серверных объектов, поэтому часть функций на клиенте просто не существует.

На клиенте доступны:

  • ✅ ИмяПользователя() и ПолноеИмяПользователя();
  • ✅ РольДоступна();
  • ✅ ИмяКомпьютера();
  • ✅ ПользователиКлиентСервер.ТекущийПользователь() в конфигурациях на БСП.

Только на сервере:

  • ⛔ ПараметрыСеанса;
  • ⛔ ПользователиИнформационнойБазы (кроме толстого клиента);
  • ⛔ ПолучитьТекущийСеансИнформационнойБазы();
  • ⛔ Пользователи.ТекущийПользователь().

Если ссылка на пользователя нужна в клиентской процедуре, а БСП нет, получите её серверным вызовом без контекста формы:

&НаКлиенте
Процедура ПоказатьПользователя(Команда)

	Пользователь = ПолучитьПользователяНаСервере();
	ПоказатьЗначение(, Пользователь);

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьПользователяНаСервере()

	Возврат Пользователи.ТекущийПользователь();

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

&НаСервереБезКонтекста не тащит данные формы на сервер и выполняется быстрее, чем &НаСервере. Если ссылка нужна часто, получите её один раз в ПриСозданииНаСервере и сохраните в реквизит формы.

💡 В веб-клиенте COM-объекты не работают. Логин Windows из браузера получить нельзя — только через аутентификацию ОС на стороне веб-сервера.

Почему пользователь пустой или «не тот»

Диагностика: выберите симптом

Отдельно про фоновые задания. Задание, запущенное из кода пользователя, работает под его учётной записью, и Пользователи.ТекущийПользователь() там вернёт того же человека. А вот внешнее соединение или веб-сервис работают под тем логином, который указан в строке подключения или в настройках публикации.

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

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