При разработке веб-ориентированных решений на платформе 1С программисты часто сталкиваются с ограничением: многие привычные методы работы с метаданными и сеансами, доступные в тонком или толстом клиенте, оказываются недоступными на веб-клиенте. Одной из таких задач является определение текущего пользователя (например, Иванова или Петрова), который зашел в базу через браузер, чтобы автоматически подставить его в поле «Автор» нового документа.
В этой статье мы подробно разберем, почему стандартные методы не работают в веб-клиенте, и проанализируем наиболее эффективные способы решения этой задачи с использованием параметров сеанса и серверных вызовов.
Разберем причину проблемы. При работе через браузер клиентская часть приложения имеет крайне ограниченные права и доступ к системным ресурсам. Методы типа ПолучитьТекущийСеансИнформационнойБазы или использование менеджера ПользователиИнформационнойБазы требуют прямого обращения к серверным ресурсам или административным функциям, которые на стороне веб-клиента заблокированы в целях безопасности и производительности. Чтобы получить данные о пользователе, нам необходимо «пробросить» эту информацию с сервера на клиент или использовать серверный контекст при записи документа.
Наиболее правильным и архитектурно верным решением в 1С является использование Параметров сеанса. Это глобальные переменные, которые живут на сервере в течение всего времени работы пользователя с базой.
Рассмотрим по шагам, как это реализовать:
ТекущийПользователь. В качестве типа укажите СправочникСсылка.Пользователи.Модуль сеанса.Проанализируем код, который необходимо разместить в обработчике УстановкаПараметровСеанса. Этот обработчик выполняется на сервере в момент первого обращения к любому параметру сеанса.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// Проверяем, нужно ли устанавливать именно наш параметр
Если ТребуемыеПараметры = Неопределено Или ТребуемыеПараметры.Найти("ТекущийПользователь") <> Неопределено Тогда
// Получаем краткое имя (логин), под которым зашел пользователь
ИмяВхода = ИмяПользователя();
// Ищем соответствующий элемент в справочнике Пользователи
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию(ИмяВхода);
// Устанавливаем значение параметра сеанса
ПараметрыСеанса.ТекущийПользователь = СсылкаНаПользователя;
КонецЕсли;
КонецПроцедуры
Важно отметить: функция ИмяПользователя() возвращает логин, указанный при авторизации. Если в вашем справочнике «Пользователи» наименования элементов совпадают с логинами, поиск НайтиПоНаименованию сработает корректно.
Теперь, когда у нас есть глобальный параметр ТекущийПользователь, мы можем использовать его в логике документа. Лучше всего это делать в модуле объекта документа в процедуре ПередЗаписью или ОбработкаЗаполнения.
Выясним, как заполнить реквизит «Автор» при создании нового документа. Рассмотрим пример кода в модуле документа:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Заполняем автора только для новых документов
Если ЭтоНовый() Тогда
ЭтотОбъект.Автор = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
КонецПроцедуры
Преимущество этого метода в том, что обращение к ПараметрыСеанса происходит на сервере, что идеально подходит для веб-клиента. Клиентская часть документа просто получит уже готовый результат после серверного вызова.
Если вы работаете в современной конфигурации (например, БП 3.0, УТ 11, ERP), то вручную создавать параметры сеанса не нужно. Разработчики 1С уже реализовали этот механизм в рамках БСП.
В этом случае получить текущего пользователя еще проще. Вместо прямого обращения к параметрам сеанса, мы используем программный интерфейс библиотеки. Разберем пример получения пользователя:
// На сервере
ТекущийАвтор = Пользователи.ТекущийПользователь();
Функция Пользователи.ТекущийПользователь() сама проверит наличие параметров сеанса, корректность прав доступа и вернет ссылку на элемент справочника. Это «золотой стандарт» разработки на платформе 1С 8.3.
Часто возникает вопрос: какую функцию использовать? Проанализируем разницу:
ИмяПользователя() — возвращает краткое имя (логин), например, "ivanov". Именно оно обычно используется для программного поиска.ПолноеИмяПользователя() — возвращает строку из поля «Полное имя» (например, "Иванов Иван Иванович").В веб-клиенте обе функции доступны, но для связи со справочником «Пользователи» надежнее использовать логин (краткое имя) или, что еще лучше, Уникальный идентификатор пользователя информационной базы.
Поиск по наименованию может быть ненадежным (например, если два пользователя имеют похожие имена). Рассмотрим более надежный способ, который можно применить в модуле сеанса:
ИдентификаторПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдентификаторПользователя);
Этот метод работает на сервере и позволяет однозначно сопоставить текущий сеанс веб-клиента с элементом справочника, даже если наименование было изменено.
Никогда не передавайте имя пользователя с клиента на сервер для установки «Автора». Опытный пользователь может попытаться подменить данные в отладчике браузера. Всегда определяйте текущего пользователя на стороне сервера, обращаясь к защищенным параметрам сеанса или системным функциям. Это гарантирует достоверность данных в вашем учете.
Подведем итог: для веб-клиента оптимальным решением является использование Параметров сеанса, инициализируемых в Модуле сеанса при помощи поиска по ИмяПользователя() или UUID. Это обеспечивает быстродействие, безопасность и стабильную работу приложения в любом браузере.