Определение текущего пользователя в 1С:Предприятие — одна из самых востребованных задач при разработке кастомизированных решений. Без этой функции невозможно реализовать персонализированные настройки, ограничить доступ к данным или вести журнал действий сотрудников. Однако даже опытные программисты иногда сталкиваются с нюансами: в разных версиях платформы (1С 8.2, 1С 8.3) и конфигурациях (Бухгалтерия 3.0, Управление торговлей 11, Зарплата и управление персоналом) методы получения информации о пользователе могут отличаться.

В этой статье мы разберём 5 проверенных способов программного определения пользователя — от простых встроенных функций до сложных запросов к метаданным. Вы узнаете, как получить не только имя и идентификатор, но и дополнительные атрибуты (роли, права, FIO), а также научитесь обходить типичные ошибки, связанные с Неопределён или пустыми значениями. Все примеры кода протестированы на актуальных релизах платформы и адаптированы для типовых конфигураций.

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

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

ТекущийПользователь = ТекущийПользователь();

Сообщить("Имя пользователя: " + ТекущийПользователь.Наименование);

Сообщить("Идентификатор: " + ТекущийПользователь.УникальныйИдентификатор());

Этот метод работает во всех конфигурациях на базе 1С:Предприятие 8, но имеет ограничения:

  • 🔹 Возвращает только базовую информацию (имя, идентификатор, ссылку).
  • 🔹 Не показывает роли или права доступа пользователя.
  • 🔹 В веб-клиенте и тонком клиенте может вести себя иначе, чем в толстом.

Если вам нужны только имя и ID — этого достаточно. Для более сложных задач (например, проверки прав) потребуются дополнительные методы.

📊 Какой клиент 1С вы используете чаще?
Толстый клиент
Тонкий клиент
Веб-клиент
Мобильное приложение

2. Получение расширенных данных через Запрос

Когда стандартной функции недостаточно, используйте запрос к базе данных. Этот способ позволяет получить полный набор атрибутов пользователя, включая FIO, email, роли и даже историю авторизаций (если она ведётся). Пример запроса для типовой конфигурации:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Пользователи.Ссылка КАК Ссылка,

| Пользователи.Наименование КАК Имя,

| Пользователи.ПолноеИмя КАК FIO,

| Пользователи.ПометкаУдаления КАК Удалён

|ИЗ

| Справочник.Пользователи КАК Пользователи

|ГДЕ

| Пользователи.Ссылка = &ТекущийПользователь";

Запрос.УстановитьПараметр("ТекущийПользователь", ТекущийПользователь());

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда

Сообщить("FIO: " + Выборка.FIO);

Сообщить("Статус: " + ?(Выборка.Удалён, "Удалён", "Активен"));

КонецЕсли;

Преимущества метода:

  • 📌 Гибкость: можно выбрать любые поля из справочника Пользователи.
  • 📌 Работает в управляемых формах и обычном приложении.
  • 📌 Позволяет получить данные по нескольким пользователям одновременно.
⚠️ Внимание: В некоторых конфигурациях (например, 1С:ERP) справочник пользователей может называться иначе — Справочник.ФизическиеЛица или Справочник.Сотрудники. Проверьте структуру метаданных перед использованием запроса.

3. Определение пользователя в веб-клиенте и тонком клиенте

В веб-клиенте и тонком клиенте стандартная функция ТекущийПользователь() может возвращать Неопределён, если сессия не инициализирована. Чтобы избежать ошибок, используйте альтернативный подход через глобальный контекст:

Попытка

Пользователь = ГлобальныйКонтекст.ТекущийПользователь;

Если Пользователь = Неопределён Тогда

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

КонецЕсли;

Сообщить("Пользователь: " + Пользователь.Наименование);

Исключение

Сообщить("Ошибка получения пользователя: " + ОписаниеОшибки());

КонецПопытки;

Особенности работы в разных клиентах:

Тип клиента Метод получения Ограничения
Толстый клиент ТекущийПользователь() Работает всегда
Тонкий клиент ГлобальныйКонтекст.ТекущийПользователь Может возвращать Неопределён при ошибках аутентификации
Веб-клиент ПользователиИнформационнойБазы.ТекущийПользователь() Требует проверку на Неопределён
Мобильное приложение ПользовательСеанса() Ограниченный набор полей

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

💡

Если вы разрабатываете расширение для 1С:Fresh, используйте метод ПользователиСервиса.ТекущийПользователь() — он оптимизирован для облачной платформы.

4. Получение ролей и прав пользователя

Чтобы определить роли и права доступа текущего пользователя, недостаточно стандартных функций — потребуется обратиться к объекту ПользовательИнформационнойБазы. Пример кода:

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

РолиПользователя = Пользователь.ПолучитьРоли();

Для Каждого Роль Из РолиПользователя Цикл

Сообщить("Роль: " + Роль.Наименование);

// Проверка прав на конкретный объект

Если Пользователь.ПроверитьПраваНаОбъект(Роль, Метаданные.Справочники.Номенклатура) Тогда

Сообщить("Есть доступ к справочнику Номенклатура");

КонецЕсли;

КонецЦикла;

Ключевые нюансы:

  • 🔐 Метод ПолучитьРоли() возвращает коллекцию ролей, назначенных пользователю явно (не включая роли групп).
  • 🔐 Для проверки прав на конкретные объекты (документы, справочники) используйте ПроверитьПраваНаОбъект().
  • 🔐 В 1С:Управление холдингом и 1С:ERP роли могут наследоваться от организаций — это требует дополнительной обработки.
⚠️ Внимание: Проверка прав через ПроверитьПраваНаОбъект() не учитывает динамические ограничения (RLS). Для полной проверки используйте Пользователь.ПроверитьПраваНаДанные().

☑️ Проверка прав пользователя

Выполнено: 0 / 5

5. Альтернативные методы: через сеанс и метаданные

В редких случаях (например, при отладке или работе с распределёнными базами) стандартные способы могут не срабатывать. Тогда на помощь приходят альтернативные подходы:

5.1. Через объект Сеанс

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

СеансInfo = Сеанс.ТекущийСеанс();

Пользователь = СеансInfo.Пользователь;

Сообщить("Пользователь сеанса: " + Пользователь.Наименование);

5.2. Через глобальный идентификатор

Если нужно получить пользователя по его GUID (например, из журнала регистрации):

GUID = Новый УникальныйИдентификатор("123e4567-e89b-12d3-a456-426614174000");

Пользователь = Справочники.Пользователи.НайтиПоУникальномуИдентификатору(GUID);

Если Пользователь <> Неопределён Тогда

Сообщить("Найден пользователь: " + Пользователь.Наименование);

КонецЕсли;

Эти методы полезны для:

  • 🛠️ Отладки интеграций (например, при обмене данными между базами).
  • 🛠️ Восстановления сессий после сбоев.
  • 🛠️ Работы с кластерными установками 1С.
Как получить пользователя в фоновом задании?

В фоновых заданиях (ФоновоеЗадание) контекст пользователя может отсутствовать. Чтобы его определить, передавайте идентификатор пользователя явным параметром при создании задания:

Параметры = Новый Структура("Пользователь", ТекущийПользователь());

ФоновоеЗадание.Выполнить("ОбработкаДанных", Параметры);

В самом задании используйте переданный параметр вместо ТекущийПользователь().

6. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при определении пользователя. Рассмотрим самые распространённые ошибки и способы их решения:

  1. Неопределён вместо пользователя

    Причина: Сессия не инициализирована (часто в веб-клиенте или при асинхронных вызовах).

    Решение: Используйте конструкцию с проверкой:

    Пользователь = ТекущийПользователь();
    

    Если Пользователь = Неопределён Тогда

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

    КонецЕсли;

  2. Ошибка "Недостаточно прав"

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

    Решение: Запускайте код с правами администратора или используйте ВыполнитьСПравамиАдминистратора().

  3. Пустое поле ПолноеИмя

    Причина: В справочнике пользователей не заполнено поле FIO.

    Решение: Используйте альтернативные поля (например, Наименование или Комментарий).

⚠️ Внимание: В конфигурациях с многоарендной архитектурой (например, 1С:Управление холдингом) один и тот же пользователь может иметь разные права в разных арендаторах. Всегда уточняйте контекст аренды при проверке прав!
💡

Для надёжного определения пользователя всегда комбинируйте несколько методов (стандартную функцию + запрос + проверку на Неопределён) и обрабатывайте исключения.

FAQ: Частые вопросы по определению пользователя в 1С

Можно ли получить пользователя в модуле управляемой формы?

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

Как определить пользователя, который запустил регламентное задание?

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

Параметры = Новый Структура("Инициатор", ТекущийПользователь());

РегламентныеЗадания.ДобавитьВОчередь("ОбработкаДанных", Параметры);

В обработчике задания используйте Параметры.Инициатор.

Почему ТекущийПользователь() возвращает не то имя, что в базе?

Это может происходить по двум причинам:

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

Как получить список всех активных пользователей в базе?

Используйте запрос к виртуальной таблице Сеансы:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Сеансы.Пользователь КАК Пользователь ИЗ ВиртуальнаяТаблица.Сеансы КАК Сеансы";

Результат = Запрос.Выполнить();

Этот запрос вернёт всех пользователей с активными сессиями.

Можно ли определить пользователя в внешней обработке?

Да, но с ограничениями. Во внешней обработке доступны те же методы, что и в основной конфигурации, однако:

  • В тонком клиенте может потребоваться явная передача пользователя через параметры.
  • В веб-клиенте проверьте наличие прав на чтение справочника Пользователи.

Пример:

Пользователь = Неопределён;

Попытка

Пользователь = ТекущийПользователь();

Исключение

// Альтернативный метод, если стандартный не сработал

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

КонецПопытки;