Как получить текущего пользователя как элемент справочника в 1С:Предприятие 8.3

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке в среде 1С программисты часто сталкиваются с задачей автоматического заполнения реквизитов, таких как Ответственный или Автор. Казалось бы, задача тривиальна, однако начинающие разработчики часто попадают в ловушку архитектуры платформы, путая пользователя информационной базы (объект платформы) с пользователем из справочника (объект метаданных). В этой статье мы подробно разберем, как правильно получить ссылку на текущего пользователя в современных конфигурациях, таких как «Бухгалтерия предприятия 3.0», «Зарплата и управление персоналом 3.1» или «Управление торговлей 11».

В чем заключается основная проблема?

Разберем ситуацию: вы пытаетесь присвоить реквизиту значение, используя метод ПользователиИнформационнойБазы.ТекущийПользователь(). Программа не выдает ошибку, но поле в документе остается пустым или очищается. Почему так происходит? Проанализируем типы данных. Метод ПользователиИнформационнойБазы.ТекущийПользователь() возвращает объект типа ПользовательИнформационнойБазы. В то же время реквизит Ответственный в 99% конфигураций имеет тип СправочникСсылка.Пользователи. Это принципиально разные сущности в системе 1С, и прямое присвоение между ними невозможно.

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

Способ 1: Использование функций Библиотеки стандартных подсистем (БСП)

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

Вариант для серверного кода:

Если вам нужно заполнить реквизит в модуле объекта или в серверной процедуре формы, используйте общий модуль Пользователи. Проанализируем код:


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

Этот метод возвращает ссылку на справочник Пользователи (или ВнешниеПользователи, если вход выполнен внешним лицом). Рассмотрим подробнее преимущества этого метода: он выполняется в привилегированном режиме, что позволяет избежать проблем, если у пользователя ограничены права (RLS) на чтение собственного элемента справочника.

Вариант для клиентского кода:

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


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

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

Способ 2: Использование параметров сеанса

В типовых решениях (особенно в «1С:Бухгалтерия») при запуске системы инициализируется специальный параметр сеанса — ТекущийПользователь. Это значение хранится в памяти сервера на протяжении всей работы пользователя с базой.

Выясним, как это применить на практике:


// Прямое обращение к параметру сеанса
Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;

Важный нюанс: Обращение к ПараметрыСеанса напрямую возможно только на сервере. Если вы попытаетесь сделать это в клиентской процедуре &НаКлиенте, система выдаст ошибку. Поэтому предварительно создайте серверную функцию-обертку.

Способ 3: Поиск пользователя по уникальному идентификатору (UUID)

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

Разберем по шагам, как реализовать такую функцию поиска на сервере:


&НаСервере
Функция ПолучитьСсылкуНаТекущегоПользователя() Экспорт
    
    // 1. Получаем ID текущего пользователя ИБ
    ИдПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
    
    // 2. Ищем элемент справочника по этому идентификатору
    СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдПользователяИБ);
    
    // 3. Проверяем, найден ли пользователь
    Если СсылкаНаПользователя.Пустая() Тогда
        Возврат Неопределено;
    Иначе
        Возврат СсылкаНаПользователя;
    КонецЕсли;
    
КонецФункции

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

Особенности работы в фоновых заданиях и облаках

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

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

Резюме и рекомендации

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

  1. Всегда разделяйте понятия «Пользователь ИБ» и «Элемент справочника Пользователи».
  2. Для типовых конфигураций (БП 3.0, УТ 11, ЗУП 3.1) используйте Пользователи.ТекущийПользователь(). Это самый безопасный и производительный способ.
  3. Если работа идет на клиенте в управляемых формах, проверьте доступность ПользователиКлиент.ТекущийПользователь().
  4. В старых конфигурациях (на обычных формах, например УПП) часто используется глобальная переменная глТекущийПользователь.
  5. При ручном поиске всегда используйте УникальныйИдентификатор, а не имя или наименование.

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

← На главную