К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как узнать текущего пользователя 1С программно

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

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

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

Получение системного пользователя через ПользователиИнформационнойБазы

Метод ПользователиИнформационнойБазы.ТекущийПользователь() доступен на сервере, в толстом клиенте и в веб-клиенте. Он возвращает объект типа «ПользовательИнформационнойБазы» — описание учётной записи, под которой выполнен вход в сеанс. Из этого объекта чаще всего читают три свойства: Имя (краткое имя аутентификации), ПолноеИмя (отображаемое ФИО) и УникальныйИдентификатор (GUID, по которому однозначно идентифицируется учётная запись).

Пример кода:

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

ИмяПользователя = ТекущийПользовательИБ.Имя;

ПолноеИмя = ТекущийПользовательИБ.ПолноеИмя;

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

Важное ограничение: для чтения объекта пользователя не требуются административные права, но для его изменения или сохранения (метод Записать()) нужно право «Администрирование». Если код должен работать у рядового пользователя, не пытайтесь в нём модифицировать учётную запись — используйте объект только для чтения свойств.

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

Текущий пользователь в типовых конфигурациях на БСП

В конфигурациях, построенных на Библиотеке стандартных подсистем («Управление торговлей», «Бухгалтерия предприятия», «Зарплата и управление персоналом» и других), прикладной код работает не с системным объектом, а со ссылкой на справочник «Пользователи». Для этого предназначен общий модуль «Пользователи» и его функции.

Основные варианты вызова:

СсылкаНаПользователя = Пользователи.ТекущийПользователь();

Авторизованный = Пользователи.АвторизованныйПользователь();

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

Результат этих функций — ссылка, которую можно сразу присваивать реквизитам документов и справочников типа «СправочникСсылка.Пользователи». Через точку от ссылки доступны поля элемента, но каждое такое обращение в цикле порождает запрос к базе — для массовых операций заранее получайте нужные реквизиты одним запросом.

Сравнение вариантов

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

Возвращает системный объект с логином и GUID. Подходит для журналирования, технических проверок и любых конфигураций, включая самописные без БСП.

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

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

Пользователи.АвторизованныйПользователь()

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

Альтернативные способы: параметры сеанса и ТекущийПользовательОС

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

Отдельная задача — узнать учётную запись операционной системы, под которой запущен клиентский процесс. Для этого в тонком и толстом клиенте используется COM-объект WScript.Network:

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

ПользовательОС = Сеть.UserName;

Этот приём работает только на клиенте под Windows и требует права на создание COM-объектов. В веб-клиенте и на сервере он недоступен. Использовать имя ОС для разграничения прав внутри 1С не следует — оно легко подменяется и не связано с учётными записями информационной базы.

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

Наиболее частый сценарий — автоматическое заполнение поля «Ответственный» при создании документа. В обработчике ОбработкаЗаполнения модуля объекта пишется код вида:

Если Не ЗначениеЗаполнено(Ответственный) Тогда

Ответственный = Пользователи.ТекущийПользователь();

КонецЕсли;

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

В фоновых заданиях текущим пользователем считается тот, кто указан при создании задания (метод ФоновыеЗадания.Выполнить с параметром пользователя), либо пользователь, от имени которого работает регламентное задание. Если пользователь не задан, сеанс фонового задания выполняется без аутентификации — учитывайте это в общем коде, который вызывается и интерактивно, и фоново.

Порядок действий для подстановки ответственного
  1. 1
    Определите, есть ли в конфигурации БСП: проверьте наличие общего модуля «Пользователи»
  2. 2
    Если БСП есть — используйте Пользователи.ТекущийПользователь(), если нет — ПользователиИнформационнойБазы.ТекущийПользователь().Имя
  3. 3
    Вставьте вызов в обработчик ОбработкаЗаполнения нужного объекта с проверкой на пустое значение
  4. 4
    Протестируйте под обычным пользователем и в фоновом задании
  5. 5
    Убедитесь, что при отсутствии аутентификации код не падает с ошибкой

Типичные ошибки и их последствия

Первая ошибка — смешение уровней: попытка присвоить объект «ПользовательИнформационнойБазы» реквизиту типа «СправочникСсылка.Пользователи». Такой код вызовет ошибку несоответствия типов. Если под рукой только системный объект, ссылку на справочник ищут по свойству «ИдентификаторПользователяИБ» через запрос или функцию БСП Пользователи.НайтиПоИдентификатору.

Вторая ошибка — сравнение пользователей по строковому имени. Имена могут совпадать частично, меняться при переименовании и не гарантируют уникальности отображения. Сравнивать нужно ссылки или уникальные идентификаторы. Третья ошибка — вызов серверного метода получения пользователя в цикле на клиенте, что порождает десятки серверных вызовов и заметно тормозит форму. Значение следует получить один раз и передать в структуру параметров.

Типичные ошибки
01
Присвоение объекта ПользовательИнформационнойБазы реквизиту типа СправочникСсылка.Пользователи — ошибка несоответствия типов
02
Сравнение пользователей по строке имени вместо ссылки или GUID — ложные совпадения и промахи
03
Отсутствие обработки сеанса без аутентификации — падение кода в фоновых заданиях
04
Многократные серверные вызовы получения пользователя в цикле — деградация производительности формы

Как проверить, что код работает правильно

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

Для полноценной проверки пройдите три контрольных сценария: интерактивный сеанс обычного пользователя, фоновое задание с явно указанным пользователем и фоновое задание без пользователя. Во всех трёх случаях код не должен падать, а результат должен соответствовать ожиданиям: реальный пользователь, указанный пользователь, пустое значение соответственно.

Контрольные точки

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

Тип возвращаемого значения
Норма

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

Тревожный признак

Строка или Неопределено там, где ожидается ссылка

Поведение в фоновом задании
Норма

Возвращается пользователь, указанный при запуске задания

Тревожный признак

Ошибка или неожиданный пользователь

Заполнение реквизита «Ответственный»
Норма

Подставляется пользователь, создавший документ

Тревожный признак

Поле пустое или заполнено чужим именем

Итог

Что важно запомнить

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

Часто задаваемые вопросы

Чем отличается Имя от ПолноеИмя у пользователя информационной базы?

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

Как получить текущего пользователя в запросе?

В тексте запроса функции встроенного языка недоступны. Правильный подход — получить ссылку до выполнения запроса и передать её параметром: Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.ТекущийПользователь()). В СКД для этого используется параметр «ТекущийПользователь», который типовые конфигурации заполняют автоматически.

Почему в фоновом задании текущий пользователь пустой?

Фоновое задание, запущенное без указания пользователя, выполняется в сеансе без аутентификации. Чтобы задание работало от имени конкретного пользователя, передайте его имя в параметрах метода ФоновыеЗадания.Выполнить, а для регламентных заданий укажите пользователя в свойствах регламентного задания в конфигураторе.

Как найти элемент справочника «Пользователи» по системному пользователю?

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

Можно ли узнать, кто изменил конкретный документ?

Штатно в типовых конфигурациях это решается через историю изменений (версионирование объектов) или журнал регистрации с отбором по событию изменения данных. Реквизит «Ответственный» показывает автора создания или последнего назначенного ответственного, но не является гарантией того, кто именно внёс последнюю правку.

Работает ли получение текущего пользователя в веб-клиенте?

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