Как программно определить текущего пользователя в веб-клиенте 1С и заполнить реквизит «Автор»

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

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

В этой статье мы подробно разберем, почему стандартные методы не работают в веб-клиенте, и проанализируем наиболее эффективные способы решения этой задачи с использованием параметров сеанса и серверных вызовов.

Почему возникают сложности в веб-клиенте?

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

Способ 1. Использование параметров сеанса (Базовый метод)

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

Рассмотрим по шагам, как это реализовать:

  1. Создание параметра: В дереве метаданных (конфигураторе) найдите ветку «Общие» -> «Параметры сеанса». Создайте новый параметр с именем ТекущийПользователь. В качестве типа укажите СправочникСсылка.Пользователи.
  2. Инициализация в Модуле сеанса: Параметры сеанса должны заполняться при старте системы. Для этого используется специальный Модуль сеанса.

Проанализируем код, который необходимо разместить в обработчике УстановкаПараметровСеанса. Этот обработчик выполняется на сервере в момент первого обращения к любому параметру сеанса.


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    // Проверяем, нужно ли устанавливать именно наш параметр
    Если ТребуемыеПараметры = Неопределено Или ТребуемыеПараметры.Найти("ТекущийПользователь") <> Неопределено Тогда
        
        // Получаем краткое имя (логин), под которым зашел пользователь
        ИмяВхода = ИмяПользователя();
        
        // Ищем соответствующий элемент в справочнике Пользователи
        СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию(ИмяВхода);
        
        // Устанавливаем значение параметра сеанса
        ПараметрыСеанса.ТекущийПользователь = СсылкаНаПользователя;
        
    КонецЕсли;
    
КонецПроцедуры

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

Способ 2. Автоматическое заполнение в документе

Теперь, когда у нас есть глобальный параметр ТекущийПользователь, мы можем использовать его в логике документа. Лучше всего это делать в модуле объекта документа в процедуре ПередЗаписью или ОбработкаЗаполнения.

Выясним, как заполнить реквизит «Автор» при создании нового документа. Рассмотрим пример кода в модуле документа:


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

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

Способ 3. Использование Библиотеки стандартных подсистем (БСП)

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

В этом случае получить текущего пользователя еще проще. Вместо прямого обращения к параметрам сеанса, мы используем программный интерфейс библиотеки. Разберем пример получения пользователя:


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

Функция Пользователи.ТекущийПользователь() сама проверит наличие параметров сеанса, корректность прав доступа и вернет ссылку на элемент справочника. Это «золотой стандарт» разработки на платформе 1С 8.3.

Различие между ИмяПользователя() и ПолноеИмяПользователя()

Часто возникает вопрос: какую функцию использовать? Проанализируем разницу:

В веб-клиенте обе функции доступны, но для связи со справочником «Пользователи» надежнее использовать логин (краткое имя) или, что еще лучше, Уникальный идентификатор пользователя информационной базы.

Продвинутый подход: поиск по Уникальному Идентификатору (UUID)

Поиск по наименованию может быть ненадежным (например, если два пользователя имеют похожие имена). Рассмотрим более надежный способ, который можно применить в модуле сеанса:


ИдентификаторПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдентификаторПользователя);

Этот метод работает на сервере и позволяет однозначно сопоставить текущий сеанс веб-клиента с элементом справочника, даже если наименование было изменено.

Важные нюансы безопасности

Никогда не передавайте имя пользователя с клиента на сервер для установки «Автора». Опытный пользователь может попытаться подменить данные в отладчике браузера. Всегда определяйте текущего пользователя на стороне сервера, обращаясь к защищенным параметрам сеанса или системным функциям. Это гарантирует достоверность данных в вашем учете.

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

← На главную