Кто сейчас работает в базе: имя, объект и ссылка пользователя из кода 1С

· 9 мин

Содержание

Текущего пользователя в 1С 8.3 получают одной строкой. Имя для вывода на экран: ИмяПользователя() или ПолноеИмяПользователя(). Объект пользователя информационной базы: ПользователиИнформационнойБазы.ТекущийПользователь(). Ссылку на элемент справочника «Пользователи» в типовых конфигурациях: Пользователи.ТекущийПользователь() на сервере или ПользователиКлиент.ТекущийПользователь() на клиенте.

Ошибаются обычно не в самой функции, а в контексте. Код на клиенте не видит менеджер ПользователиИнформационнойБазы, фоновое задание работает от имени того, кто его запустил, а регламентное — от пользователя из своих настроек. Разберём каждый способ программно, с примерами для управляемых форм, сервера и фона.

Три уровня «пользователя» в 1С 8.3

Слово «пользователь» в 1С обозначает три разные вещи. От того, какая нужна вам, зависит способ.

Что нужноТип значенияЧем получитьГде работает
Имя для отображенияСтрокаИмяПользователя(), ПолноеИмяПользователя()клиент и сервер
Учётная запись платформыПользовательИнформационнойБазыПользователиИнформационнойБазы.ТекущийПользователь()сервер, толстый клиент, внешнее соединение
Элемент справочникаСправочникСсылка.ПользователиПользователи.ТекущийПользователь() (БСП)сервер
Человек и сотрудникСправочникСсылка.ФизическиеЛица, Сотрудникиреквизит пользователя + запроссервер
  • 🔹 Учётная запись — то, что администратор видит в Конфигураторе: Администрирование → Пользователи. У неё есть имя, пароль, роли, признак аутентификации ОС.
  • 🔹 Элемент справочника — прикладной объект. На него ссылаются документы в реквизите «Ответственный», «Автор», его используют в отборах и настройках.
  • 🔹 Физлицо и сотрудник — данные кадрового учёта. Связь с учётной записью идёт через справочник.

В документ записывают ссылку на справочник, а не строку с именем. Имя учётной записи можно переименовать, и тогда поиск по строке сломается.

Глобальный контекст и сеанс: имя, номер сеанса, компьютер

Самый короткий путь — функции глобального контекста. Они доступны в любом модуле, в том числе в тонком и веб-клиенте.

Имя = ИмяПользователя();          // логин, например "Иванова"
ФИО = ПолноеИмяПользователя();    // "Иванова Мария Петровна"
Сообщить(СтрШаблон("Вы вошли как %1 (%2)", ФИО, Имя));

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

Информация о сеансе

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

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

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

	Результат = Новый Структура;
	Результат.Вставить("Пользователь", Сеанс.Пользователь.Имя);
	Результат.Вставить("НомерСеанса", Сеанс.НомерСеанса);
	Результат.Вставить("Компьютер", Сеанс.ИмяКомпьютера);
	Результат.Вставить("Приложение", Сеанс.ИмяПриложения);
	Результат.Вставить("Начало", Сеанс.НачалоСеанса);

	Возврат Результат;

КонецФункции
  • 💻 ИмяПриложения подсказывает тип клиента: 1CV8C — тонкий клиент, 1CV8 — толстый, WebClient — веб-клиент, BackgroundJob — фоновое задание, COMConnection — внешнее соединение.
  • 🔢 Номер сеанса проще взять функцией НомерСеансаИнформационнойБазы() — она доступна и на клиенте.
  • 🕒 НачалоСеанса полезно для журналов: видно, сколько человек уже работает в базе.

Объект ПользовательИнформационнойБазы: роли, вход через ОС, идентификатор

Если нужно проверить роли, способ входа или получить уникальный идентификатор, берите объект учётной записи. Он живёт только на сервере, поэтому в форме понадобится серверный вызов.

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

	ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();

	Сведения = Новый Структура;
	Сведения.Вставить("Имя", ПользовательИБ.Имя);
	Сведения.Вставить("ПолноеИмя", ПользовательИБ.ПолноеИмя);
	Сведения.Вставить("Идентификатор", ПользовательИБ.УникальныйИдентификатор);
	Сведения.Вставить("ВходЧерезОС", ПользовательИБ.АутентификацияОС);
	Сведения.Вставить("ПользовательОС", ПользовательИБ.ПользовательОС);

	Возврат Сведения;

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

Проверка роли

Для проверки ролей не перебирайте ПользовательИБ.Роли вручную. Есть готовая функция глобального контекста:

Если РольДоступна("ПолныеПрава") Тогда
	// показать служебные команды
КонецЕсли;

РольДоступна() учитывает роли текущего сеанса и работает быстрее перебора. Для проверки конкретного действия надёжнее ПравоДоступа("Изменение", Метаданные.Документы.РеализацияТоваровУслуг) — так код не привязан к названию роли.

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

Ссылка на справочник Пользователи: БСП и самописные базы

В типовых конфигурациях на БСП

Бухгалтерия 3.0, ЗУП 3.1, УТ 11, ERP и большинство отраслевых решений построены на Библиотеке стандартных подсистем. В ней уже есть функции, которые возвращают ссылку на справочник «Пользователи».

// Сервер: общий модуль Пользователи
ТекущийПользователь = Пользователи.ТекущийПользователь();

// Клиент: общий модуль ПользователиКлиент
ТекущийПользователь = ПользователиКлиент.ТекущийПользователь();

Разница между двумя похожими функциями:

  • 👤 ТекущийПользователь() — элемент справочника «Пользователи». Если в базу вошёл внешний пользователь (например, через портал контрагентов), будет исключение.
  • 🌐 АвторизованныйПользователь() — вернёт либо пользователя, либо внешнего пользователя. Берите её в коде, который может выполнить внешний пользователь.

БСП определяет пользователя при старте сеанса и хранит ссылку в параметре сеанса. Поэтому вызов дешёвый: запроса к базе при каждом обращении нет. Читать параметр сеанса напрямую не нужно — функции модуля делают это корректно.

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

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

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

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

В конфигурации без БСП

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

Функция ТекущийПользовательСправочника() Экспорт

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

	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;

	Возврат Справочники.Пользователи.ПустаяСсылка();

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

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

От пользователя к физлицу и сотруднику

Часто задача звучит так: «подставить в документ текущего сотрудника» или «показать должность того, кто вошёл». Цепочка всегда одна: пользователь → физическое лицо → сотрудник.

В типовых конфигурациях у справочника «Пользователи» есть реквизит ФизическоеЛицо. Его заполняют в карточке пользователя, в разделе Администрирование → Настройки пользователей и прав → Пользователи. Если реквизит пуст, программно связь не найти — сначала заполните карточку.

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

	Пользователь = Пользователи.ТекущийПользователь();
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ФизическоеЛицо");

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

ОбщегоНазначения.ЗначениеРеквизитаОбъекта — функция БСП. Она читает одно поле запросом, без загрузки всего объекта, как это происходит при обращении через точку.

Поиск сотрудника

Одно физлицо может быть несколькими сотрудниками: основное место работы, внутреннее совместительство, работа в разных организациях. Поэтому сотрудника ищут запросом и решают, какого взять.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Сотрудники.Ссылка КАК Сотрудник,
|	Сотрудники.ГоловнаяОрганизация КАК Организация
|ИЗ
|	Справочник.Сотрудники КАК Сотрудники
|ГДЕ
|	Сотрудники.ФизическоеЛицо = &ФизическоеЛицо
|	И НЕ Сотрудники.ПометкаУдаления";
Запрос.УстановитьПараметр("ФизическоеЛицо", ФизлицоТекущегоПользователя());
  • 🏢 Если организаций несколько, добавьте отбор по организации документа.
  • 📅 Уволенные сотрудники в справочнике остаются. Актуальность приёма и увольнения в ЗУП проверяют по кадровым данным, а не по самому справочнику.
  • ⚠️ Реквизиты справочника «Сотрудники» различаются между ЗУП, БП и ERP. Перед запросом откройте справочник в Конфигураторе и проверьте имена полей.

Управляемая форма, тонкий и веб-клиент

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

Если написать на клиенте ПользователиИнформационнойБазы.ТекущийПользователь(), модуль не скомпилируется: платформа сообщит, что переменная не определена.

Как не делать лишних серверных вызовов:

  1. Нужно значение при открытии формы — получите его в ПриСозданииНаСервере и положите в реквизит формы.
  2. Нужно значение в клиентском обработчике — берите из реквизита формы, а не вызывайте сервер повторно.
  3. Нужна ссылка на клиенте в типовой — ПользователиКлиент.ТекущийПользователь(). Значение передано на клиент при старте сеанса, серверного вызова нет.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ТекущийПользователь = Пользователи.ТекущийПользователь();
	Элементы.ДекорацияАвтор.Заголовок = ПолноеИмяПользователя();

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

Отбор списка «только мои документы»

Частая доработка — показать в динамическом списке только документы текущего ответственного. Ссылку получают на сервере при создании формы и ставят отбор:

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

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

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

Процедура УстановитьЭлементОтбораДинамическогоСписка входит в БСП. Без неё отбор добавляют через Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")) и заполняют поля ЛевоеЗначение, ВидСравнения, ПравоеЗначение, Использование.

Такой отбор — удобство, а не защита. Пользователь может снять его в настройках списка. Если чужие документы видеть нельзя, нужны ограничения доступа на уровне записей.

Вход через ОС и веб-клиент

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

В веб-клиенте пользователь определяется так же, как в тонком. Отличие — в способе входа: при публикации на веб-сервере можно включить сквозную аутентификацию ОС, и тогда окно ввода пароля не появится.

Фоновые и регламентные задания, внешнее соединение

Здесь чаще всего получают «не того» пользователя. Правила такие:

КонтекстОт чьего имени выполняется кодЧто вернёт ИмяПользователя()
Фоновое задание через ФоновыеЗадания.Выполнитьпользователь, запустивший заданиеего имя
Длительная операция БСП (ДлительныеОперации)пользователь, запустивший операциюего имя
Регламентное заданиепользователь из свойства ИмяПользователя заданияуказанное имя или пустая строка
Внешнее соединение, COMпользователь из строки соединения Usr=это имя
HTTP- и веб-сервисыпользователь, под которым прошла аутентификация публикацииего имя

Регламентные задания

Пользователя регламентного задания задают в его свойствах. В типовых конфигурациях это делается в разделе Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания, программно — через свойство ИмяПользователя объекта РегламентноеЗадание.

Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОбменДанными);
Задание.ИмяПользователя = "Обмен";
Задание.Записать();

Если пользователь не указан, ИмяПользователя() внутри задания вернёт пустую строку. Код, который ищет ответственного по имени, получит пустую ссылку. Решения два:

  • ✅ указать в задании служебного пользователя с нужными ролями;
  • ✅ передавать ответственного явно через параметры задания или брать из настроек, а не из сеанса.

Кто запустил фоновое задание

Внутри фонового задания текущий пользователь — это инициатор. Если нужно знать, что код выполняется в фоне, проверьте сеанс:

ФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание();
ЭтоФон = (ФоновоеЗадание <> Неопределено);

Ошибки при получении пользователя и как их отладить

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

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

  1. В Конфигураторе откройте Сервис → Параметры → Запуск 1С:Предприятия и укажите пользователя и пароль для отладки. Запуск из Конфигуратора пойдёт под ним.
  2. Или запустите клиент из командной строки с параметрами /N и /P:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Test" /N"Иванова" /P"пароль"
  1. В отладчике вычислите выражение ИмяПользователя() или ПолучитьТекущийСеансИнформационнойБазы().ИмяПриложения в точке останова. Так видно, под кем и в каком контексте выполняется код.
  2. Для фона и регламентов смотрите журнал регистрации: в нём для каждого события записаны пользователь, приложение и номер сеанса.

Не проверяйте права и не отлаживайте код под пользователем с полными правами. Роль ПолныеПрава скрывает ошибки доступа, которые увидит обычный бухгалтер.

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

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