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

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

В практике разработки на платформе 1С возникают нестандартные задачи, когда стандартная аутентификация пользователя не полностью удовлетворяет бизнес-требованиям. Рассмотрим типичную ситуацию: в компании используется доменная авторизация (OS-аутентификация), при этом один и тот же сотрудник работает на разных серверах под одной учетной записью Windows. Для корректного учета или разграничения прав в самой 1С нам необходимо, чтобы при входе с сервера «А» он определялся как один пользователь справочника, а при входе с сервера «Б» — как другой, при этом не заставляя его вводить пароль вручную.

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

Постановка задачи и анализ ограничений

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

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

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

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

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


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

    // Получаем текущего пользователя ИБ (авторизованного через Windows)
    ТекущийИБПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    
    // Определяем контекст (например, по имени сервера или компьютера)
    ИмяЭтогоКомпьютера = ИмяКомпьютера();
    
    Если ИмяЭтогоКомпьютера = "SERVER_FINANCE" Тогда
        // Логика поиска "финансового" профиля пользователя
        НужныйПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию(ТекущийИБПользователь.ПолноеИмя + " (Финансы)");
    Иначе
        // Стандартный поиск
        НужныйПользовательСсылка = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ТекущийИБПользователь.УникальныйИдентификатор);
    КонецЕсли;

    Если Не НужныйПользовательСсылка.Пустая() Тогда
        ПараметрыСеанса.ТекущийПользователь = НужныйПользовательСсылка;
    КонецЕсли;

КонецПроцедуры

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

Идентификация через параметры запуска (/C)

Иногда ИмяКомпьютера() недостаточно (например, при работе через терминальный сервер). В этом случае удобно использовать ключ запуска /C. В ярлыке запуска 1С для разных серверов можно прописать разные значения, например:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "ПутьКБазе" /C "Profile1"

В коде 1С это значение можно считать с помощью функции ПараметрЗапуска(). Модифицируем нашу логику в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    
    Если ПараметрЗапуска = "Profile1" Тогда
        // Сообщаем серверу, что нужно использовать другой профиль
        // Обычно через вызов серверной функции, которая обновит ПараметрыСеанса
        УстановитьНужногоПользователяНаСервере("ПрофильДляСервера1");
    КонецЕсли;
    
КонецПроцедуры

Особенности работы в ЗУП 3.0 и конфигурациях на БСП

Конфигурация «Зарплата и Управление Персоналом 3.0» построена на Библиотеке стандартных подсистем (БСП). Это накладывает определенные требования. БСП активно кэширует данные пользователя и имеет свои механизмы авторизации.

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

Для корректной работы в БСП рекомендуется обратить внимание на следующие моменты:

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

Радикальный метод: Программный перезапуск сеанса

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

Разберем, как это работает по шагам:

  1. При запуске система определяет, что зашел «не тот» пользователь.
  2. Программа формирует строку запуска для нового процесса с ключами /N "НужноеИмя" и /P "Пароль" (или /OSAuthent для другой доменной учетки).
  3. Выполняется команда ЗапуститьПриложение().
  4. Текущий сеанс немедленно завершается командой ЗавершитьРаботуСистемы(Ложь).

// Пример в модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
    
    Если НужноПерезайтиПодДругимИменем() Тогда
        СтрокаЗапуска = "ENTERPRISE /S ""Server\Base"" /N ""TargetUser"" /P ""Password""";
        ЗапуститьПриложение(СтрокаЗапуска);
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
    
КонецПроцедуры

Важно: Такой метод может вызвать вопросы у службы безопасности, так как пароли в строке запуска могут быть перехвачены, а в Журнале регистрации появится запись о входе под чужими учетными данными.

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

Выясним причину, почему чаще всего выбирают именно подмену в справочнике, а не перезапуск сеанса. Это позволяет сохранить «прозрачность» входа для пользователя (SSO — Single Sign-On).

Основные выводы:

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

← На главную