Как программно получить текущего пользователя в 1С и избежать ошибки инициализации параметров сеанса

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей
← На главную

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

Выясним причину: почему ПараметрыСеанса.ТекущийПользователь выдает ошибку

Проанализируем ситуацию, описанную в начале обсуждения. Разработчик пытается напрямую обратиться к ПараметрыСеанса.ТекущийПользователь, но система блокирует это действие. Причина кроется в особенностях Библиотеки стандартных подсистем (БСП), на которой базируются практически все современные конфигурации (УТ 11, ERP, КА 2, Бухгалтерия 3.0).

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

Разберем разницу между Пользователем ИБ и Пользователем из справочника

Перед тем как переходить к коду, важно четко разграничить два понятия, которые часто путают:

  1. Пользователь информационной базы (Platform level): Это системный объект. Он нужен для аутентификации (проверки логина и пароля). Мы можем получить его через ПользователиИнформационнойБазы.ТекущийПользователь(). Однако этот объект нельзя записать в реквизит документа, так как тип реквизита обычно СправочникСсылка.Пользователи.
  2. Пользователь из справочника (Application level): Это элемент справочника Справочники.Пользователи. Именно ссылка на этот элемент хранится в документах. В типовых конфигурациях каждый «Пользователь ИБ» сопоставлен с элементом этого справочника — для анализа прав на просмотр элементов справочника есть инструмент для анализа прав доступа и ограничений RLS.

Решение для современных конфигураций (УТ 11, ERP, КА 2, БП 3.0)

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

На сервере:

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


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

Универсальный метод для сотрудников и внешних пользователей:

В некоторых базах (например, в CRM или кабинетах клиентов) могут работать внешние пользователи. В этом случае лучше использовать функцию АвторизованныйПользователь(), которая корректно определит тип вошедшего субъекта.


// Более универсальный способ для систем с внешними пользователями
Автор = Пользователи.АвторизованныйПользователь();

На клиенте:

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


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

Решение для устаревших конфигураций (УТ 10.3, КА 1.1, УПП)

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

Для 1С:Управление торговлей 10.3 стандартным способом получения является вызов глобальной функции:


// Способ для старых редакций УТ 10.3
ТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");

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

Проанализируем, где именно лучше всего разместить код заполнения реквизита. Чтобы пользователь сразу видел себя в поле «Автор» при создании нового документа, код следует разместить в модуле объекта документа в обработчике ОбработкаЗаполнения.

Рассмотрим пример правильной реализации:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    // Проверяем, что это именно новый объект
    Если ЭтоНовый() Тогда
        // Заполняем реквизит "Заявитель" или "Автор"
        // Используем стандартный механизм БСП
        ЭтотОбъект.Заявитель = Пользователи.ТекущийПользователь();
    КонецЕсли;
    
КонецПроцедуры

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

Посмотрим на нюансы: Web-клиент и права доступа (RLS)

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

Подведем итог:

  1. Избегайте прямого обращения к ПараметрыСеанса в конфигурациях с БСП.
  2. Для современных баз (УТ 11, ERP) используйте Пользователи.ТекущийПользователь().
  3. Для старых баз (УТ 10.3) используйте глЗначениеПеременной("глТекущийПользователь").
  4. Всегда заполняйте автора в процедуре ОбработкаЗаполнения для корректного отображения в интерфейсе.
← На главную