Кто сейчас работает в базе: имя пользователя 1С из интерфейса и программно

· 9 мин

Содержание

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

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

Как посмотреть пользователя 1С без программирования

Если нужно просто понять, под кем вы вошли, код не нужен. Способы для интерфейса «Такси»:

  • 👤 Панель вверху окна. Справа в заголовке программы выводится имя текущего пользователя. Это самый быстрый способ.
  • ℹ️ Окно «О программе». Откройте главное меню (кнопка с тремя полосками) → Справка → О программе. В окне указан пользователь текущего сеанса, а также версии платформы и конфигурации.
  • 👥 Список активных пользователей. В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) это Администрирование → Обслуживание → Активные пользователи. Список показывает все открытые сеансы, а не только ваш. Ваш сеанс помечен отдельно.
  • 🛠 Конфигуратор. Меню Администрирование → Активные пользователи показывает сеансы, а Администрирование → Пользователи выводит весь список пользователей базы.

Если в базе нет ни одного пользователя, 1С пускает без окна авторизации. Имя пользователя в этом случае пустое. В заголовке окна его тоже не будет.

Функции встроенного языка для текущего пользователя

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

Глобальные функции ИмяПользователя() и ПолноеИмяПользователя()

ИмяТекущего = ИмяПользователя();          // "Иванов"
ПолноеИмя   = ПолноеИмяПользователя();    // "Иванов Петр Сергеевич"

Функции работают везде: в тонком клиенте, на сервере, во внешнем соединении. Вызов сервера им не нужен, поэтому они подходят для клиентского кода формы. Если пользователей в базе нет, обе вернут пустую строку.

Объект ПользовательИнформационнойБазы

Когда нужны не только имена, получите сам объект:

&НаСервере
Процедура ПроверитьПользователя()
    ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если ТекущийПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда
        // у пользователя есть роль «Полные права»
    КонецЕсли;
КонецПроцедуры

Менеджер ПользователиИнформационнойБазы недоступен в тонком и веб-клиенте. Поэтому код с ним ставят в процедуру &НаСервере или &НаСервереБезКонтекста и вызывают с клиента.

Для проверки ролей удобнее отдельная функция. РольДоступна("ПолныеПрава") возвращает Истина, если роль есть у текущего пользователя. Перебирать коллекцию ролей для этого не нужно.

Свойства и методы для работы с текущим пользователем

Сводная таблица того, что чаще всего применяют на практике:

Что получитьМетод или свойствоГде доступно
Имя для входаИмяПользователя()клиент, сервер, внешнее соединение
Полное имяПолноеИмяПользователя()клиент, сервер, внешнее соединение
Объект пользователя ИБПользователиИнформационнойБазы.ТекущийПользователь()сервер, толстый клиент, внешнее соединение
Уникальный идентификатор.УникальныйИдентификатору объекта пользователя ИБ
Связанный пользователь ОС.ПользовательОСу объекта пользователя ИБ
Способы входа.АутентификацияСтандартная, .АутентификацияОСу объекта пользователя ИБ
Назначенные роли.Ролиу объекта пользователя ИБ
Проверка одной ролиРольДоступна("ИмяРоли")клиент и сервер
Номер текущего сеансаНомерСеансаИнформационнойБазы()сервер
Сеанс целикомПолучитьТекущийСеансИнформационнойБазы()сервер
Ссылка на элемент справочника «Пользователи» (БСП)Пользователи.ТекущийПользователь()сервер

Имя пользователя может поменяться: администратор переименует учётную запись, и все сохранённые строки станут неактуальными. Уникальный идентификатор остаётся прежним. Если вы что-то сохраняете в базе «на пользователя», ключом берите идентификатор, а не имя.

Пользователь 1С и пользователь Windows — это разные учётные записи

Пользователь информационной базы живёт внутри конкретной базы. Пользователь операционной системы — это учётная запись Windows или домена. Связь между ними появляется, только если в карточке пользователя 1С включена аутентификация операционной системы и заполнено поле пользователя ОС в виде \\ДОМЕН\логин.

Отсюда три практических вывода:

  • 🔹 ИмяПользователя() всегда возвращает имя пользователя 1С. Логин Windows эта функция не показывает, даже при входе по аутентификации ОС.
  • 🔹 Свойство ПользовательОС — это настройка в карточке, а не факт входа. Человек мог зайти по паролю 1С с чужого компьютера.
  • 🔹 Серверный код в клиент-серверной базе выполняется под учётной записью службы сервера 1С (например, USR1CV8). Попытка получить «пользователя Windows» на сервере вернёт эту служебную учётку, а не сотрудника.

Если нужен именно логин Windows на компьютере, где запущен клиент, получите его на клиенте через COM-объект. Способ работает только в клиенте под Windows:

&НаКлиенте
Функция ЛогинWindows()
    Сеть = Новый COMОбъект("WScript.Network");
    Возврат Сеть.UserName;
КонецФункции

В веб-клиенте и в клиенте под Linux или macOS COM-объекты недоступны. Для таких сценариев логин ОС из кода 1С не получить, используйте связку пользователя ИБ с пользователем ОС в карточке.

Чтобы при запуске принудительно отключить вход по учётной записи Windows, используют ключ командной строки /WA-. Это помогает, когда нужно войти под другим пользователем 1С на том же компьютере.

Параметры сеанса и пользователь в типовых конфигурациях

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

При старте сеанса БСП находит нужный элемент и записывает ссылку в параметр сеанса ТекущийПользователь. Дальше в коде есть три способа получить её:

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

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

// Если в базе работают и внешние пользователи
Авторизованный = Пользователи.АвторизованныйПользователь();

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

Где эта ссылка нужна на практике:

  1. Автозаполнение реквизита «Ответственный» при создании документа.
  2. Отбор списков «только мои документы».
  3. Ограничение доступа на уровне записей (RLS). В тексте ограничения параметр сеанса указывают через амперсанд: &ТекущийПользователь.
  4. Получение физического лица сотрудника. В Бухгалтерии 3.0 и ЗУП 3.1 у элемента справочника «Пользователи» есть реквизит ФизическоеЛицо.

Список пользователей справочника в Бухгалтерии 3.0 открывается так: Администрирование → Настройки пользователей и прав → Пользователи.

Код для внешней обработки: всё о текущем пользователе в одном окне

Внешняя обработка удобна тем, что её не нужно встраивать в конфигурацию. Создайте в конфигураторе новую обработку (Файл → Новый → Внешняя обработка), добавьте форму, на форме команду и кнопку. В модуль формы вставьте код:

&НаКлиенте
Процедура ПоказатьПользователя(Команда)
    Текст = СведенияОПользователе();
    ПоказатьПредупреждение(, Текст);
КонецПроцедуры

&НаСервереБезКонтекста
Функция СведенияОПользователе()

    ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    Сеанс = ПолучитьТекущийСеансИнформационнойБазы();

    Строки = Новый Массив;
    Строки.Добавить("Имя: " + ПользовательИБ.Имя);
    Строки.Добавить("Полное имя: " + ПользовательИБ.ПолноеИмя);
    Строки.Добавить("Идентификатор: " + Строка(ПользовательИБ.УникальныйИдентификатор));
    Строки.Добавить("Пользователь ОС в карточке: " + ПользовательИБ.ПользовательОС);
    Строки.Добавить("Вход по паролю 1С: " + Формат(ПользовательИБ.АутентификацияСтандартная, "БЛ=Нет; БИ=Да"));
    Строки.Добавить("Вход через ОС: " + Формат(ПользовательИБ.АутентификацияОС, "БЛ=Нет; БИ=Да"));
    Строки.Добавить("Компьютер: " + Сеанс.ИмяКомпьютера);
    Строки.Добавить("Приложение: " + ПредставлениеПриложения(Сеанс.ИмяПриложения));
    Строки.Добавить("Номер сеанса: " + Формат(Сеанс.НомерСеанса, "ЧГ=0"));
    Строки.Добавить("Начало сеанса: " + Формат(Сеанс.НачалоСеанса, "ДЛФ=DT"));

    Возврат СтрСоединить(Строки, Символы.ПС);

КонецФункции

Сохраните обработку в файл .epf и откройте её в режиме 1С:Предприятие через главное меню: Файл → Открыть.

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

СтрСоединить и СтрШаблон появились в платформе 8.3.6. На платформах с меньшим номером склеивайте строки обычным +.

Где выполняется ваш код?

Текущий сеанс и журнал регистрации: кто и откуда работал

Журнал регистрации отвечает на вопрос не «кто я», а «кто это сделал». Каждая запись в нём содержит имя пользователя, компьютер, приложение, номер сеанса и событие.

Просмотр журнала из интерфейса

  • В типовых конфигурациях на БСП: Администрирование → Обслуживание → Журнал регистрации.
  • В конфигураторе: Администрирование → Журнал регистрации.

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

Выгрузка журнала из кода

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

&НаСервере
Функция СобытияТекущегоСеанса()

    Отбор = Новый Структура;
    Отбор.Вставить("ДатаНачала", НачалоДня(ТекущаяДатаСеанса()));
    Отбор.Вставить("Сеанс", НомерСеансаИнформационнойБазы());

    События = Новый ТаблицаЗначений;
    ВыгрузитьЖурналРегистрации(События, Отбор, "Дата, ИмяПользователя, Компьютер, Событие");

    Возврат События;

КонецФункции

Для ВыгрузитьЖурналРегистрации нужно право «Администрирование». У обычного пользователя вызов завершится ошибкой. Если чтение журнала нужно ограниченной роли, выполните его в привилегированном режиме: УстановитьПривилегированныйРежим(Истина).

Номера сеансов повторно используются после перезапуска сервера. Для разбора за длинный период отбирайте не только по номеру сеанса, но и по дате.

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

Внешнее соединение, фоновые и регламентные задания

Во всех трёх случаях «текущий пользователь» определяется не тем, кто сидит за компьютером. Его задаёт способ запуска.

Внешнее соединение (COM)

Пользователь задаётся в строке подключения параметрами Usr и Pwd:

Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("File=""D:\Base"";Usr=""Обмен"";Pwd=""пароль""");
ИмяВнешнего = Соединение.ИмяПользователя();   // "Обмен"

Глобальные функции базы-приёмника вызываются через объект соединения. Если Usr не указан, платформа пробует аутентификацию ОС под учётной записью процесса, который открыл соединение. Для службы или планировщика это служебная учётка, и вход часто не проходит.

Не храните пароль пользователя для обмена в открытом виде в коде. Заведите для интеграции отдельного пользователя с минимальным набором ролей.

Фоновые задания

Фоновое задание, запущенное через ФоновыеЗадания.Выполнить(), работает под тем же пользователем, который его запустил. ИмяПользователя() внутри задания вернёт его имя.

Регламентные задания

Регламентное задание выполняется под пользователем, указанным в его свойствах. Если пользователь не указан, задание работает без пользователя, и ИмяПользователя() вернёт пустую строку. Код, который заполняет «Ответственного» по текущему пользователю, в таком задании оставит реквизит пустым. Это частая причина документов «без автора» после ночных загрузок.

Привилегированный режим пользователя не меняет. УстановитьПривилегированныйРежим(Истина) снимает проверку прав, но имя и роли остаются прежними.

Частые вопросы

Почему ИмяПользователя() возвращает пустую строку?
В базе не заведено ни одного пользователя, или код выполняется в регламентном задании без указанного пользователя. Заведите пользователей или задайте пользователя в свойствах задания.
Можно ли узнать текущего пользователя в запросе?
Нет такой функции языка запросов. Передайте ссылку параметром: Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь()). В ограничениях доступа (RLS) используют параметр сеанса &ТекущийПользователь.
Чем ТекущийПользователь() платформы отличается от одноимённой функции БСП?
Метод платформы возвращает объект пользователя информационной базы. Функция Пользователи.ТекущийПользователь() возвращает ссылку на элемент справочника «Пользователи», которую можно записать в реквизит документа.
Как узнать, под кем открыт конфигуратор?
Выполните ИмяПользователя() в отладчике или посмотрите список в меню Администрирование → Активные пользователи: там виден и сеанс конфигуратора.
Нужно ли право «Администрирование», чтобы прочитать свойства своего пользователя?
Нет. Своего пользователя через ТекущийПользователь() читает любой, кому разрешён вызов серверного кода. Права администратора нужны для чтения списка всех пользователей и журнала регистрации.