Как поставить текущего пользователя 1С в реквизит, отбор или отчёт
Содержание
Чтобы поставить текущего пользователя 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, где можно сослаться на параметр сеанса.Как узнать, кто сейчас работает в базе, а не только себя?
ПолучитьСеансыИнформационнойБазы(). Функция вернёт массив сеансов, у каждого есть свойство Пользователь, имя компьютера и приложение. Тот же список виден в Конфигураторе и в консоли кластера.Почему после переименования логина пропали настройки отчётов?
Что вернёт Пользователи.ТекущийПользователь() для внешнего пользователя?
Пользователи.АвторизованныйПользователь() — она вернёт ссылку на нужный справочник в зависимости от того, кто вошёл.