Как программно установить и получить текущего пользователя в 1С 8.3 Управляемые формы?

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

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

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

Основные способы получения текущего пользователя

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

  1. Функция Пользователи.ТекущийПользователь()

    Это, пожалуй, самый распространенный и прямой способ получения объекта справочника "Пользователи", который соответствует текущему пользователю информационной базы. Данная функция возвращает ссылку на элемент справочника Пользователи. Если пользователь не найден или сеанс еще не авторизован, функция может вернуть неопределенное значение или пустую ссылку, в зависимости от контекста и версии платформы.

    Мы рассмотрим пример использования этой функции:

    
    // Пример получения текущего пользователя
    ТекущийПользователь = Пользователи.ТекущийПользователь();
    
    Если ТекущийПользователь <> Неопределено И Не ТекущийПользователь.Пустая() Тогда
        Сообщить("Текущий пользователь: " + ТекущийПользователь.Наименование);
        // Дополнительные действия с объектом пользователя, например, получение его ролей
        Для Каждого Роль Из ТекущийПользователь.Роли.Выгрузить() Цикл
            Сообщить("  - Роль: " + Роль.Роль.Наименование);
        КонецЦикла;
    Иначе
        Сообщить("Не удалось определить текущего пользователя или пользователь не авторизован.");
    КонецЕсли;
    

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

  2. Чтение из ПараметрыСеанса.ТекущийПользователь

    Объект ПараметрыСеанса хранит различные параметры, специфичные для текущего сеанса работы пользователя. Одним из таких параметров является ТекущийПользователь. Он также содержит ссылку на элемент справочника "Пользователи". Однако, есть важное отличие: ПараметрыСеанса.ТекущийПользователь устанавливается в начале сеанса и не меняется динамически, если только вы не измените его явно в серверном коде, что не является стандартной практикой для изменения "активного" пользователя.

    Мы посмотрим на пример получения пользователя из параметров сеанса:

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

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

Программная установка текущего пользователя

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

Сценарий 1: Установка пользователя для серверных и фоновых операций (УстановитьТекущегоПользователя())

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

Важно: Эта функция доступна только в серверном контексте и меняет текущего пользователя только для того сеанса, в котором она была вызвана. Она не влияет на интерактивного пользователя, работающего в клиентском приложении, и не авторизует нового пользователя в интерфейсе.

Мы разберем шаги по использованию этой функции:

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

    
    // Пример получения пользователя по коду
    // Предположим, у нас есть код пользователя, под которым нужно выполнить действия.
    // Это может быть служебный пользователь или пользователь с определенными правами.
    КодПользователя = "СлужебныйПользователь"; // или "000000001"
    НужныйПользователь = Справочники.Пользователи.НайтиПоКоду(КодПользователя);
    
    Если НужныйПользователь.Пустая() Тогда
        Сообщить("Пользователь с кодом '" + КодПользователя + "' не найден!");
        Возврат; // Выходим, так как не можем установить пользователя
    КонецЕсли;
    
  2. Вызов функции УстановитьТекущегоПользователя(). После получения объекта пользователя, мы можем передать его в функцию.

    
    // Проверяем, что код выполняется на сервере
    #Если Сервер Тогда
        УстановитьТекущегоПользователя(НужныйПользователь);
        Сообщить("Текущий пользователь программно установлен на сервере: " + Пользователи.ТекущийПользователь().Наименование);
        // Теперь все последующие операции в этом серверном сеансе будут выполняться
        // от имени НужныйПользователь с его правами доступа.
    
        // Пример выполнения каких-либо действий от имени установленного пользователя
        // Например, запись документа, который требует определенных прав
        // ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
        // ... заполнение реквизитов ...
        // ДокументОбъект.Записать();
    
        // После выполнения необходимых действий, часто рекомендуется вернуть
        // предыдущего пользователя, если это необходимо.
        // Для этого нужно сохранить Пользователи.ТекущийПользователь() до вызова УстановитьТекущегоПользователя
        // и затем восстановить.
    
    #Иначе
        Сообщить("Функция УстановитьТекущегоПользователя() доступна только на сервере.");
    #КонецЕсли;
    

Когда это полезно:

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


#Если Сервер Тогда
    // Сохраняем текущего пользователя до изменения
    ПредыдущийПользователь = Пользователи.ТекущийПользователь();

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

        // ... Ваш код, который должен выполняться от имени ПользовательДляРаботы ...
        // Например, выполнение привилегированной операции, которая требует особых прав

        // Возвращаем предыдущего пользователя
        УстановитьТекущегоПользователя(ПредыдущийПользователь);
        Сообщить("Текущий пользователь восстановлен: " + Пользователи.ТекущийПользователь().Наименование);
    Иначе
        Сообщить("Пользователь 'Иванов И.И.' не найден.");
    КонецЕсли;
#КонецЕсли;

Такой подход обеспечивает изоляцию операций и предотвращает непреднамеренное изменение контекста для других частей системы.

Сценарий 2: Установка параметров соединения для внешних подключений (УстановитьПараметрыСоединенияИнформационнойБазы())

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

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

Мы рассмотрим пример использования УстановитьПараметрыСоединенияИнформационнойБазы():


// Пример использования для COM-соединения или HTTP-сервиса
// Предполагаем, что мы находимся в контексте, где можем установить параметры для внешнего соединения
ИмяПользователя = "Администратор";
ПарольПользователя = "123";

ПараметрыСоединения = Новый Структура("Пользователь, Пароль");
ПараметрыСоединения.Вставить("Пользователь", ИмяПользователя);
ПараметрыСоединения.Вставить("Пароль", ПарольПользователя);

// Устанавливаем параметры соединения.
// Эти параметры будут использованы при следующем подключении к ИБ
// или при выполнении операций, требующих авторизации в текущем соединении.
УстановитьПараметрыСоединенияИнформационнойБазы(ПараметрыСоединения);

Сообщить("Параметры соединения для информационной базы установлены для пользователя: " + ИмяПользователя);

// Теперь, при последующем создании нового COM-объекта 1С:Предприятия или вызове
// методов веб-сервиса, авторизация будет происходить с указанными данными.

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

Когда это полезно:

Отличия и особенности использования

Чтобы избежать путаницы, давайте еще раз подчеркнем ключевые различия между рассмотренными методами:

  1. Пользователи.ТекущийПользователь(): Используется для получения ссылки на объект текущего пользователя.

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

  3. УстановитьТекущегоПользователя(Пользователь): Используется для изменения текущего пользователя в серверном контексте текущего сеанса. Не влияет на интерактивного пользователя.

  4. УстановитьПараметрыСоединенияИнформационнойБазы(): Используется для установки учетных данных для внешних соединений (COM, веб-сервисы).

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

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

← На главную