Кто сейчас работает в базе: имя, объект и ссылка пользователя из кода 1С
Содержание
Текущего пользователя в 1С 8.3 получают одной строкой. Имя для вывода на экран: ИмяПользователя() или ПолноеИмяПользователя(). Объект пользователя информационной базы: ПользователиИнформационнойБазы.ТекущийПользователь(). Ссылку на элемент справочника «Пользователи» в типовых конфигурациях: Пользователи.ТекущийПользователь() на сервере или ПользователиКлиент.ТекущийПользователь() на клиенте.
Ошибаются обычно не в самой функции, а в контексте. Код на клиенте не видит менеджер ПользователиИнформационнойБазы, фоновое задание работает от имени того, кто его запустил, а регламентное — от пользователя из своих настроек. Разберём каждый способ программно, с примерами для управляемых форм, сервера и фона.
Три уровня «пользователя» в 1С 8.3
Слово «пользователь» в 1С обозначает три разные вещи. От того, какая нужна вам, зависит способ.
| Что нужно | Тип значения | Чем получить | Где работает |
|---|---|---|---|
| Имя для отображения | Строка | ИмяПользователя(), ПолноеИмяПользователя() | клиент и сервер |
| Учётная запись платформы | ПользовательИнформационнойБазы | ПользователиИнформационнойБазы.ТекущийПользователь() | сервер, толстый клиент, внешнее соединение |
| Элемент справочника | СправочникСсылка.Пользователи | Пользователи.ТекущийПользователь() (БСП) | сервер |
| Человек и сотрудник | СправочникСсылка.ФизическиеЛица, Сотрудники | реквизит пользователя + запрос | сервер |
- 🔹 Учётная запись — то, что администратор видит в Конфигураторе:
Администрирование → Пользователи. У неё есть имя, пароль, роли, признак аутентификации ОС. - 🔹 Элемент справочника — прикладной объект. На него ссылаются документы в реквизите «Ответственный», «Автор», его используют в отборах и настройках.
- 🔹 Физлицо и сотрудник — данные кадрового учёта. Связь с учётной записью идёт через справочник.
В документ записывают ссылку на справочник, а не строку с именем. Имя учётной записи можно переименовать, и тогда поиск по строке сломается.
Глобальный контекст и сеанс: имя, номер сеанса, компьютер
Самый короткий путь — функции глобального контекста. Они доступны в любом модуле, в том числе в тонком и веб-клиенте.
Имя = ИмяПользователя(); // логин, например "Иванова"
ФИО = ПолноеИмяПользователя(); // "Иванова Мария Петровна"
Сообщить(СтрШаблон("Вы вошли как %1 (%2)", ФИО, Имя));
Если в базе нет ни одного пользователя, обе функции вернут пустую строку. Учитывайте это в проверках: пустое имя — не ошибка, а режим работы без списка пользователей.
Информация о сеансе
Иногда нужен не только человек, но и сеанс: с какого компьютера он зашёл, через какой клиент, когда начал работу. Для этого на сервере вызывают ПолучитьТекущийСеансИнформационнойБазы().
&НаСервереБезКонтекста
Функция ДанныеСеанса()
Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
Результат = Новый Структура;
Результат.Вставить("Пользователь", Сеанс.Пользователь.Имя);
Результат.Вставить("НомерСеанса", Сеанс.НомерСеанса);
Результат.Вставить("Компьютер", Сеанс.ИмяКомпьютера);
Результат.Вставить("Приложение", Сеанс.ИмяПриложения);
Результат.Вставить("Начало", Сеанс.НачалоСеанса);
Возврат Результат;
КонецФункции
- 💻
ИмяПриложенияподсказывает тип клиента:1CV8C— тонкий клиент,1CV8— толстый,WebClient— веб-клиент,BackgroundJob— фоновое задание,COMConnection— внешнее соединение. - 🔢 Номер сеанса проще взять функцией
НомерСеансаИнформационнойБазы()— она доступна и на клиенте. - 🕒
НачалоСеансаполезно для журналов: видно, сколько человек уже работает в базе.
Объект ПользовательИнформационнойБазы: роли, вход через ОС, идентификатор
Если нужно проверить роли, способ входа или получить уникальный идентификатор, берите объект учётной записи. Он живёт только на сервере, поэтому в форме понадобится серверный вызов.
&НаСервереБезКонтекста
Функция СведенияОПользователеИБ()
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Сведения = Новый Структура;
Сведения.Вставить("Имя", ПользовательИБ.Имя);
Сведения.Вставить("ПолноеИмя", ПользовательИБ.ПолноеИмя);
Сведения.Вставить("Идентификатор", ПользовательИБ.УникальныйИдентификатор);
Сведения.Вставить("ВходЧерезОС", ПользовательИБ.АутентификацияОС);
Сведения.Вставить("ПользовательОС", ПользовательИБ.ПользовательОС);
Возврат Сведения;
КонецФункции
Проверка роли
Для проверки ролей не перебирайте ПользовательИБ.Роли вручную. Есть готовая функция глобального контекста:
Если РольДоступна("ПолныеПрава") Тогда
// показать служебные команды
КонецЕсли;
РольДоступна() учитывает роли текущего сеанса и работает быстрее перебора. Для проверки конкретного действия надёжнее ПравоДоступа("Изменение", Метаданные.Документы.РеализацияТоваровУслуг) — так код не привязан к названию роли.
УникальныйИдентификатор не меняется при переименовании. Именно его хранят типовые конфигурации в справочнике «Пользователи», в реквизите ИдентификаторПользователяИБ. Используйте его для связи, а не имя.
Ссылка на справочник Пользователи: БСП и самописные базы
В типовых конфигурациях на БСП
Бухгалтерия 3.0, ЗУП 3.1, УТ 11, ERP и большинство отраслевых решений построены на Библиотеке стандартных подсистем. В ней уже есть функции, которые возвращают ссылку на справочник «Пользователи».
// Сервер: общий модуль Пользователи
ТекущийПользователь = Пользователи.ТекущийПользователь();
// Клиент: общий модуль ПользователиКлиент
ТекущийПользователь = ПользователиКлиент.ТекущийПользователь();
Разница между двумя похожими функциями:
- 👤
ТекущийПользователь()— элемент справочника «Пользователи». Если в базу вошёл внешний пользователь (например, через портал контрагентов), будет исключение. - 🌐
АвторизованныйПользователь()— вернёт либо пользователя, либо внешнего пользователя. Берите её в коде, который может выполнить внешний пользователь.
БСП определяет пользователя при старте сеанса и хранит ссылку в параметре сеанса. Поэтому вызов дешёвый: запроса к базе при каждом обращении нет. Читать параметр сеанса напрямую не нужно — функции модуля делают это корректно.
Типичное заполнение реквизита при создании документа:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если НЕ ЗначениеЗаполнено(Ответственный) Тогда
Ответственный = Пользователи.ТекущийПользователь();
КонецЕсли;
КонецПроцедуры
В конфигурации без БСП
Если в вашей базе нет общего модуля Пользователи, ссылку находят запросом по идентификатору учётной записи. Пример рассчитан на справочник с реквизитом ИдентификаторПользователяИБ типа УникальныйИдентификатор.
Функция ТекущийПользовательСправочника() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка КАК Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ = &Идентификатор";
Запрос.УстановитьПараметр("Идентификатор",
ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Справочники.Пользователи.ПустаяСсылка();
КонецФункции
Поиск по наименованию (НайтиПоНаименованию(ИмяПользователя())) работает, пока совпадают имя учётной записи и наименование элемента. Стоит администратору переименовать одно из них — функция начнёт возвращать пустую ссылку.
От пользователя к физлицу и сотруднику
Часто задача звучит так: «подставить в документ текущего сотрудника» или «показать должность того, кто вошёл». Цепочка всегда одна: пользователь → физическое лицо → сотрудник.
В типовых конфигурациях у справочника «Пользователи» есть реквизит ФизическоеЛицо. Его заполняют в карточке пользователя, в разделе Администрирование → Настройки пользователей и прав → Пользователи. Если реквизит пуст, программно связь не найти — сначала заполните карточку.
&НаСервере
Функция ФизлицоТекущегоПользователя()
Пользователь = Пользователи.ТекущийПользователь();
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ФизическоеЛицо");
КонецФункции
ОбщегоНазначения.ЗначениеРеквизитаОбъекта — функция БСП. Она читает одно поле запросом, без загрузки всего объекта, как это происходит при обращении через точку.
Поиск сотрудника
Одно физлицо может быть несколькими сотрудниками: основное место работы, внутреннее совместительство, работа в разных организациях. Поэтому сотрудника ищут запросом и решают, какого взять.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.ГоловнаяОрганизация КАК Организация
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.ФизическоеЛицо = &ФизическоеЛицо
| И НЕ Сотрудники.ПометкаУдаления";
Запрос.УстановитьПараметр("ФизическоеЛицо", ФизлицоТекущегоПользователя());
- 🏢 Если организаций несколько, добавьте отбор по организации документа.
- 📅 Уволенные сотрудники в справочнике остаются. Актуальность приёма и увольнения в ЗУП проверяют по кадровым данным, а не по самому справочнику.
- ⚠️ Реквизиты справочника «Сотрудники» различаются между ЗУП, БП и ERP. Перед запросом откройте справочник в Конфигураторе и проверьте имена полей.
Управляемая форма, тонкий и веб-клиент
В тонком и веб-клиенте модуль формы делится на клиентскую и серверную части. На клиенте доступны ИмяПользователя(), ПолноеИмяПользователя(), РольДоступна(), НомерСеансаИнформационнойБазы(). Менеджер ПользователиИнформационнойБазы и запросы — только на сервере.
Если написать на клиенте ПользователиИнформационнойБазы.ТекущийПользователь(), модуль не скомпилируется: платформа сообщит, что переменная не определена.
Как не делать лишних серверных вызовов:
- Нужно значение при открытии формы — получите его в
ПриСозданииНаСервереи положите в реквизит формы. - Нужно значение в клиентском обработчике — берите из реквизита формы, а не вызывайте сервер повторно.
- Нужна ссылка на клиенте в типовой —
ПользователиКлиент.ТекущийПользователь(). Значение передано на клиент при старте сеанса, серверного вызова нет.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекущийПользователь = Пользователи.ТекущийПользователь();
Элементы.ДекорацияАвтор.Заголовок = ПолноеИмяПользователя();
КонецПроцедуры
Отбор списка «только мои документы»
Частая доработка — показать в динамическом списке только документы текущего ответственного. Ссылку получают на сервере при создании формы и ставят отбор:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список, "Ответственный", Пользователи.ТекущийПользователь(),
ВидСравненияКомпоновкиДанных.Равно, , Истина);
КонецПроцедуры
Процедура УстановитьЭлементОтбораДинамическогоСписка входит в БСП. Без неё отбор добавляют через Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")) и заполняют поля ЛевоеЗначение, ВидСравнения, ПравоеЗначение, Использование.
Такой отбор — удобство, а не защита. Пользователь может снять его в настройках списка. Если чужие документы видеть нельзя, нужны ограничения доступа на уровне записей.
Вход через ОС и веб-клиент
При аутентификации ОС ИмяПользователя() возвращает имя учётной записи 1С, а не логин Windows. Логин домена хранится в свойстве ПользовательОС в виде \\ДОМЕН\логин.
В веб-клиенте пользователь определяется так же, как в тонком. Отличие — в способе входа: при публикации на веб-сервере можно включить сквозную аутентификацию ОС, и тогда окно ввода пароля не появится.
Фоновые и регламентные задания, внешнее соединение
Здесь чаще всего получают «не того» пользователя. Правила такие:
| Контекст | От чьего имени выполняется код | Что вернёт ИмяПользователя() |
|---|---|---|
Фоновое задание через ФоновыеЗадания.Выполнить | пользователь, запустивший задание | его имя |
Длительная операция БСП (ДлительныеОперации) | пользователь, запустивший операцию | его имя |
| Регламентное задание | пользователь из свойства ИмяПользователя задания | указанное имя или пустая строка |
| Внешнее соединение, COM | пользователь из строки соединения Usr= | это имя |
| HTTP- и веб-сервисы | пользователь, под которым прошла аутентификация публикации | его имя |
Регламентные задания
Пользователя регламентного задания задают в его свойствах. В типовых конфигурациях это делается в разделе Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания, программно — через свойство ИмяПользователя объекта РегламентноеЗадание.
Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОбменДанными);
Задание.ИмяПользователя = "Обмен";
Задание.Записать();
Если пользователь не указан, ИмяПользователя() внутри задания вернёт пустую строку. Код, который ищет ответственного по имени, получит пустую ссылку. Решения два:
- ✅ указать в задании служебного пользователя с нужными ролями;
- ✅ передавать ответственного явно через параметры задания или брать из настроек, а не из сеанса.
Кто запустил фоновое задание
Внутри фонового задания текущий пользователь — это инициатор. Если нужно знать, что код выполняется в фоне, проверьте сеанс:
ФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
ЭтоФон = (ФоновоеЗадание <> Неопределено);
Ошибки при получении пользователя и как их отладить
Как проверить код под другим пользователем
- В Конфигураторе откройте
Сервис → Параметры → Запуск 1С:Предприятияи укажите пользователя и пароль для отладки. Запуск из Конфигуратора пойдёт под ним. - Или запустите клиент из командной строки с параметрами
/Nи/P:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Test" /N"Иванова" /P"пароль"
- В отладчике вычислите выражение
ИмяПользователя()илиПолучитьТекущийСеансИнформационнойБазы().ИмяПриложенияв точке останова. Так видно, под кем и в каком контексте выполняется код. - Для фона и регламентов смотрите журнал регистрации: в нём для каждого события записаны пользователь, приложение и номер сеанса.
Не проверяйте права и не отлаживайте код под пользователем с полными правами. Роль ПолныеПрава скрывает ошибки доступа, которые увидит обычный бухгалтер.