В практике разработки на платформе 1С возникают нестандартные задачи, когда стандартная аутентификация пользователя не полностью удовлетворяет бизнес-требованиям. Рассмотрим типичную ситуацию: в компании используется доменная авторизация (OS-аутентификация), при этом один и тот же сотрудник работает на разных серверах под одной учетной записью Windows. Для корректного учета или разграничения прав в самой 1С нам необходимо, чтобы при входе с сервера «А» он определялся как один пользователь справочника, а при входе с сервера «Б» — как другой, при этом не заставляя его вводить пароль вручную.
В данной статье мы разберем, как реализовать механизм «подмены» пользователя на уровне прикладного решения, проанализируем возможности платформы и особенности работы в конфигурациях на базе БСП (например, ЗУП 3.0).
Важно сразу разделить два понятия: Пользователь информационной базы (ИБ) и элемент справочника Пользователи. Пользователь ИБ — это объект платформы, под которым происходит авторизация в базе. Элемент справочника — это объект прикладного решения, который используется в документах, отчетах и бизнес-логике. Прямая подмена «Пользователя ИБ» без перезапуска сеанса невозможна, так как сессия уже установлена. Однако мы можем подменить ссылку в параметрах сеанса, на которую ориентируется вся конфигурация.
Рассмотрим ситуацию, описанную в обсуждении: нам нужно идентифицировать контекст запуска и программно установить нужную ссылку в ПараметрыСеанса.ТекущийПользователь.
Основным местом, где происходит инициализация данных о пользователе, является обработчик УстановкаПараметровСеанса в Модуле сеанса. Именно здесь платформа или логика БСП сопоставляет текущего авторизованного пользователя Windows с записью в справочнике Пользователи.
Разберем алгоритм реализации такой подмены. Для начала нам нужно понять, как отличить один сеанс от другого. Для этого можно использовать имя компьютера или параметры запуска.
Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
// Проверяем, инициализирован ли уже параметр "ТекущийПользователь"
Если ИменаПараметровСеанса = Неопределено Тогда
// Инициализация при первом обращении в сеансе
ИначеЕсли ИменаПараметровСеанса.Найти("ТекущийПользователь") = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем текущего пользователя ИБ (авторизованного через Windows)
ТекущийИБПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
// Определяем контекст (например, по имени сервера или компьютера)
ИмяЭтогоКомпьютера = ИмяКомпьютера();
Если ИмяЭтогоКомпьютера = "SERVER_FINANCE" Тогда
// Логика поиска "финансового" профиля пользователя
НужныйПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию(ТекущийИБПользователь.ПолноеИмя + " (Финансы)");
Иначе
// Стандартный поиск
НужныйПользовательСсылка = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ТекущийИБПользователь.УникальныйИдентификатор);
КонецЕсли;
Если Не НужныйПользовательСсылка.Пустая() Тогда
ПараметрыСеанса.ТекущийПользователь = НужныйПользовательСсылка;
КонецЕсли;
КонецПроцедуры
В этом примере мы проанализировали имя компьютера ИмяКомпьютера() и, исходя из условий, подставили в ПараметрыСеанса.ТекущийПользователь нужную ссылку. Для всей остальной программы (документов, отчетов, подписок на события) автором будет считаться именно этот выбранный нами пользователь.
Иногда ИмяКомпьютера() недостаточно (например, при работе через терминальный сервер). В этом случае удобно использовать ключ запуска /C. В ярлыке запуска 1С для разных серверов можно прописать разные значения, например:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "ПутьКБазе" /C "Profile1"
В коде 1С это значение можно считать с помощью функции ПараметрЗапуска(). Модифицируем нашу логику в модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
Если ПараметрЗапуска = "Profile1" Тогда
// Сообщаем серверу, что нужно использовать другой профиль
// Обычно через вызов серверной функции, которая обновит ПараметрыСеанса
УстановитьНужногоПользователяНаСервере("ПрофильДляСервера1");
КонецЕсли;
КонецПроцедуры
Конфигурация «Зарплата и Управление Персоналом 3.0» построена на Библиотеке стандартных подсистем (БСП). Это накладывает определенные требования. БСП активно кэширует данные пользователя и имеет свои механизмы авторизации.
Проанализируем ситуацию: если мы просто подменим ПараметрыСеанса.ТекущийПользователь, часть механизмов БСП (например, система взаимодействия или персональные настройки) может продолжать работать с данными исходного пользователя ИБ.
Для корректной работы в БСП рекомендуется обратить внимание на следующие моменты:
АвторизованныйПользователь() и ТекущийПользователь(). Убедитесь, что ваша подмена корректно отражается на результатах этих функций.ПользователиИнформационнойБазыСлужебный.Если подмены на уровне справочника недостаточно и вам нужно, чтобы в Журнале регистрации действия фиксировались под другим «Пользователем ИБ», единственным выходом будет программный перезапуск приложения.
Разберем, как это работает по шагам:
/N "НужноеИмя" и /P "Пароль" (или /OSAuthent для другой доменной учетки).ЗапуститьПриложение().ЗавершитьРаботуСистемы(Ложь).
// Пример в модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
Если НужноПерезайтиПодДругимИменем() Тогда
СтрокаЗапуска = "ENTERPRISE /S ""Server\Base"" /N ""TargetUser"" /P ""Password""";
ЗапуститьПриложение(СтрокаЗапуска);
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Важно: Такой метод может вызвать вопросы у службы безопасности, так как пароли в строке запуска могут быть перехвачены, а в Журнале регистрации появится запись о входе под чужими учетными данными.
Выясним причину, почему чаще всего выбирают именно подмену в справочнике, а не перезапуск сеанса. Это позволяет сохранить «прозрачность» входа для пользователя (SSO — Single Sign-On).
Основные выводы:
ПараметрыСеанса.ТекущийПользователь в модуле сеанса.ИмяКомпьютера() или параметр запуска /C в ярлыке.Используя данные методы, вы сможете гибко управлять сеансами пользователей, адаптируя работу системы под сложные инфраструктурные условия вашего предприятия.