В процессе разработки конфигураций на платформе 1С:Предприятие 8 одной из самых востребованных задач является идентификация того, кто именно запустил сеанс работы с базой данных. Это необходимо для реализации ролевой модели доступа, ведения аудита действий сотрудников или персонализации интерфейса под конкретного специалиста.
Однако начинающие программисты часто путают понятия"пользователь информационной базы" и"пользователь операционной системы". В зависимости от поставленной задачи, метод получения данных будет существенно отличаться. В этом материале мы детально разберем глобальные контексты, методы встроенного языка и нюансы работы в режиме толстого и тонкого клиента.
Корректное определение контекста выполнения кода является фундаментом безопасной разработки. Ошибки на этом этапе могут привести к тому, что система будет выдавать права не тому лицу или логи аудита станет невозможным проанализировать. Давайте перейдем к конкретным инструментам платформы.
Глобальный контекст и объект ТекущийПользователь
Начиная с версии платформы 8.3, основным и наиболее надежным способом получения информации о пользователе является использование глобального контекста ТекущийПользователь. Этот объект доступен в любом месте кода: в модулях форм, общих модулях, обработчиках событий и даже в запросах.
Объект представляет собой ссылку на элемент справочника Пользователи. Он содержит уникальные идентификаторы и основные свойства учетной записи, зарегистрированной в информационной базе. Важно понимать, что этот объект всегда ссылается на пользователя ИБ, независимо от того, под каким именем в Windows он вошел в систему.
Для доступа к данным достаточно вызвать метод Получить. Это действие возвращает ссылку на элемент справочника, с которым можно работать дальше: получать имя, проверять наличие в группах или определять основные права доступа.
Рассмотрим пример получения имени пользователя в коде:
ПользовательИБ = ТекущийПользователь.Получить;
ИмяПользователя = ПользовательИБ.Наименование;
Использование данного подхода гарантирует, что вы работаете именно с учетной записью, определенной администратором базы данных. Это критически важно для систем, где один и тот же сотрудник может работать под разными учетками в зависимости от выполняемых функций.
⚠️ Внимание. Объект
ТекущийПользовательможет быть не определен (пустая ссылка), если сеанс запущен фоновым заданием без явного указания пользователя или в некоторых служебных режимах работы платформы. Всегда проверяйте ссылку на пустоту перед обращением к свойствам.
Используйте свойство УникальныйИдентификатор объекта ТекущийПользователь для надежной привязки данных в регистрах сведений, так как наименование пользователя может быть изменено администратором.
Различия между пользователем ИБ и системным пользователем
Частой ошибкой является попытка получить имя пользователя Windows через стандартные свойства пользователя 1С. Платформа четко разграничивает эти сущности. Пользователь информационной базы — это абстракция, созданная внутри конфигурации, тогда как системное имя относится к среде, в которой запущен клиент.
Если ваша задача требует именно идентификации человека по его логину в домене или локальной машине, необходимо использовать свойство СистемноеИмя того же глобального контекста. Это строковое значение, которое возвращает имя пользователя ОС в формате DOMAIN\User или просто User.
Данное свойство особенно востребовано в системах с автоматической авторизацией, где вход в 1С происходит без ввода пароля на основе текущей сессии Windows. В таких случаях сопоставление системного имени и пользователя ИБ происходит автоматически при старте приложения.
- 👤 Пользователь ИБ: определяется в справочнике конфигурации, используется для прав доступа внутри 1С.
- 💻 Системное имя: берется из операционной системы, используется для лицензирования и внешней идентификации.
- 🔗 Связь: один системный пользователь может быть сопоставлен с несколькими пользователями ИБ, но в активном сеансе обычно активен только один.
Для получения системного имени используется следующая конструкция:
СистемныйПользователь = ТекущийПользователь.СистемноеИмя;
Помните, что в веб-клиенте или при запуске через терминальный сервер (RDP) системное имя будет отражать учетную запись, под которой запущен процесс веб-сервера или сессия терминала, что может отличаться от ожидаемого значения.
Получение данных в запросах и СКД
Одним из главных преимуществ платформы 1С является возможность использования текущего пользователя непосредственно в языке запросов. Это позволяет фильтровать данные на уровне СУБД, что значительно повышает производительность по сравнению с отбором данных в коде после выборки.
В тексте запроса существует специальный псевдополе &ТекущийПользователь. При выполнении запроса платформа автоматически подставляет в это место ссылку на текущего пользователя информационной базы. Это работает во всех типах запросов: обычных, построителях запросов и системах компоновки данных (СКД).
Рассмотрим пример запроса, который выбирает документы, созданные тем, кто запустил программу:
ВЫБРАТЬ
Документ.РеализацияТоваровУслуг.Ссылка КАК Ссылка,
Документ.РеализацияТоваровУслуг.Дата КАК Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Автор = &ТекущийПользователь
В СКД (отчетах и обработках) параметр с именем ТекущийПользователь также подставляется автоматически, если тип значения установлен в"Пользователь информационной базы". Это избавляет разработчика от необходимости писать код заполнения параметров перед открытием отчета.
| Контекст использования | Синтаксис | Возвращаемое значение |
|---|---|---|
| Встроенный язык | ТекущийПользователь.Получить |
Ссылка на справочник |
| Язык запросов | &ТекущийПользователь |
Ссылка на справочник |
| СКД (Набор данных) | Параметр ТекущийПользователь |
Ссылка на справочник |
| Право доступа (RLS) | В выражении ограничений | Ссылка на справочник |
Использование механизмов запросов для фильтрации по пользователю является наиболее предпочтительным способом реализации ограничений RLS (Record Level Security). Это обеспечивает безопасность данных еще на этапе их чтения из базы.
Особенности работы в фоновых заданиях и внешних обработках
Ситуация кардинально меняется, когда код выполняется не в интерактивном сеансе пользователя, а в фоновом задании или во внешней обработке, подключенной к базе. В этих случаях понятие"текущий пользователь" может быть размыто или отсутствовать вовсе.
При запуске фонового задания разработчик может явно указать, от имени какого пользователя оно должно выполняться. Если пользователь не указан, задание выполняется от имени специального системного пользователя, который часто не имеет полного набора прав или не отражен в справочнике сотрудников.
Для внешних обработок и расширений конфигурации важно понимать, в каком контексте они подключены. Если обработка запускается пользователем, то ТекущийПользователь будет корректным. Однако при автоматическом запуске через COM-соединение или регламентные задания нужно быть предельно осторожным.
Нюансы COM-соединения
При подключении к базе через COM-объект V83.COMConnector текущий пользователь определяется тем, под кем запущен процесс клиента 1С, создающий соединение, а не тем, чьи учетные данные переданы в метод Connect, если не используется явная авторизация.
⚠️ Внимание. В регламентных заданиях, запускаемых сервером 1С, свойство
СистемноеИмячасто возвращает имя службы сервера (например, usr1cv8), а не имя администратора, настроившего задание. Не используйте системное имя для аудита действий в фоновых процессах.
Если вам необходимо выполнить действие от имени конкретного пользователя в фоне, всегда явно передавайте ссылку на пользователя в параметры фонового задания и используйте её в коде вместо глобального контекста.
Анализ прав доступа и ролей текущего пользователя
Знание того, кто работает в системе, часто требуется для динамического изменения интерфейса или проверки прав на выполнение конкретных действий. Платформа предоставляет мощные инструменты для анализа прав доступа текущего сеанса.
Глобальный контекст ПраваДоступа позволяет проверять наличие прав у текущего пользователя без необходимости знать его имя. Метод Доступен возвращает булево значение, указывающее, может ли пользователь выполнить определенное действие, например, проводить документы или изменять справочники.
Также существует возможность получения списка всех ролей, назначенных текущему пользователю. Это полезно для отладки систем безопасности или для отображения специальных панелей управления только для администраторов.
- 🔒 Проверка права:
ПраваДоступа.Доступен("ПроведениеДокументов")— быстро и эффективно. - 📋 Список ролей: можно получить через запрос к регистру сведений СоставыРолейПользователей.
- 🛡️ Полные права: пользователи с полными правами могут обходить некоторые ограничения RLS, что нужно учитывать при разработке.
Пример проверки права на редактирование справочника:
Если ПраваДоступа.Доступен("РедактированиеСправочников") Тогда
ЭлементыФормы.КнопкаИзменить.Видимость = Истина;
КонецЕсли;
Никогда не полагайтесь только на видимость кнопок для защиты данных. Всегда дублируйте проверку прав на стороне сервера в модуле объекта или общем модуле перед записью данных.
Частые ошибки и лучшие практики безопасности
При работе с идентификацией пользователей разработчики часто допускают типичные ошибки, которые могут привести к уязвимостям или нестабильной работе системы. Одна из самых распространенных — попытка хранить имя пользователя в виде строки в регистрах, вместо использования типа ссылки.
Использование строкового представления имени (Наименование) для связей в базе данных является плохой практикой. Если администратор переименует пользователя в справочнике, все исторические данные, привязанные по строке, потеряют связь с актуальной учетной записью. Всегда используйте тип СправочникСсылка.Пользователи.
Еще одной ошибкой является кэширование данных о пользователе в глобальных переменных при старте приложения. Поскольку в течение сессии права пользователя могут измениться администратором (например, через консоль управления кластером или снятие блокировок), кэшированное значение может стать неактуальным.
Для обеспечения максимальной безопасности рекомендуется:
- Использовать RLS для ограничения видимости данных на уровне записей.
- Регулярно аудировать действия пользователей, записывая
ТекущийПользовательв журналы регистрации. - Избегать жесткой привязки логики к конкретным именам пользователей (хардкод), используя вместо этого роли и группы доступа.
⚠️ Внимание. Конфигурации прав доступа и состав ролей могут изменяться администратором в любой момент без перезапуска клиентских сессий. Логика программы должна быть устойчива к изменению прав в реальном времени.
☑️ Чек-лист безопасной работы с пользователем
FAQ: Вопросы и ответы
Как получить текущего пользователя в мобильном приложении 1С?
В мобильных клиентах 1С механизм работы аналогичен десктопным версиям. Глобальный контекст ТекущийПользователь доступен и возвращает пользователя информационной базы. Однако свойство СистемноеИмя может возвращать специфические значения, зависящие от ОС мобильного устройства (Android/iOS), и не всегда соответствует доменному имени.
Что вернет ТекущийПользователь, если зайти под администратором базы данных?
Администратор базы данных (пользователь с полными правами, создаваемый при:init базы) также является пользователем информационной базы. Для него метод Получить вернет ссылку на элемент справочника"Пользователи", соответствующий этому администратору. Если такой элемент не создан явно в справочнике, ссылка может быть пустой, но это зависит от версии платформы и режима запуска.
Можно ли подменить текущего пользователя программно?
Нет, напрямую изменить контекст ТекущийПользователь в текущем сеансе невозможно. Это защищенная область платформы. Чтобы выполнить действия от имени другого пользователя, необходимо завершить текущий сеанс и авторизоваться заново, либо запустить фоновое задание с указанием нужного пользователя.
Почему в запросе &ТекущийПользователь возвращает пустое значение?
Это возможно, если запрос выполняется в контексте, где сеанс пользователя не инициализирован. Например, при выполнении запроса через консоль запросов на сервере без указания сессии, или в некоторых видах внешних обработок, подключенных без контекста безопасности. Убедитесь, что код выполняется внутри активного сеанса 1С:Предприятие.
Как узнать, является ли текущий пользователь внешним?
В типовой конфигурации"Управление доступом" или в новых версиях платформы у пользователя может быть установлен флаг"Внешний пользователь". Проверить это можно, получив ссылку через ТекущийПользователь.Получить и обратившись к соответствующему реквизиту справочника, если он предусмотрен в вашей конфигурации.