При работе с платформой 1С:Предприятие 8.3, особенно в режиме управляемых форм, часто возникает необходимость программно получить информацию о пользователях системы или о текущих активных сеансах. Это может потребоваться для аудита, сбора статистики, реализации сложных механизмов авторизации, массового создания пользователей или управления доступом. В этой статье мы подробно рассмотрим, как выполнить эти задачи, используя различные объекты и методы платформы.
Для того чтобы получить полный список всех пользователей, зарегистрированных в информационной базе 1С, мы будем использовать менеджер объекта Пользователи. Этот подход позволяет получить доступ к объектам типа Пользователь, каждый из которых представляет собой учетную запись пользователя в системе.
Рассмотрим по шагам, как получить этот список и базовые свойства пользователей:
Пользователи: Доступ к списку пользователей осуществляется через глобальный объект Пользователи. У него есть метод ПолучитьПользователей(), который возвращает коллекцию всех пользователей информационной базы.Вот пример кода, который демонстрирует этот процесс:
Функция ПолучитьСписокВсехПользователей() Экспорт
СписокПользователей = Пользователи.ПолучитьПользователей();
Результат = Новый Массив;
Для Каждого Пользователь ИЗ СписокПользователей Цикл
Сообщить("Имя пользователя: " + Пользователь.Имя);
Сообщить("Полное имя: " + Пользователь.ПолноеИмя);
Сообщить("Действителен: " + Строка(Пользователь.Действителен));
Сообщить("Использование аутентификации ОС: " + Строка(Пользователь.АутентификацияОС));
Сообщить("Идентификатор пользователя ИБ: " + Пользователь.УникальныйИдентификатор);
Сообщить("Ссылка на пользователя: " + Пользователь.Ссылка);
// Мы также можем добавить нужные свойства в наш массив для дальнейшей обработки
ДанныеПользователя = Новый Структура;
ДанныеПользователя.Вставить("Имя", Пользователь.Имя);
ДанныеПользователя.Вставить("ПолноеИмя", Пользователь.ПолноеИмя);
ДанныеПользователя.Вставить("Действителен", Пользователь.Действителен);
ДанныеПользователя.Вставить("УникальныйИдентификатор", Пользователь.УникальныйИдентификатор);
Результат.Добавить(ДанныеПользователя);
КонецЦикла;
Возврат Результат;
КонецФункции
В этом примере мы используем метод Пользователи.ПолучитьПользователей(), который возвращает массив объектов типа Пользователь. Каждый объект Пользователь содержит такие свойства, как Имя (краткое имя для входа), ПолноеИмя (отображаемое имя), Действителен (флаг активности пользователя), АутентификацияОС (используется ли аутентификация операционной системы), УникальныйИдентификатор и Ссылка. Эти свойства позволяют нам получить базовую информацию о каждом зарегистрированном пользователе, что может потребоваться, например, если нужно реализовать запуск тонкого клиента от имени пользователя.
Важно отметить, что данный метод работает только на сервере 1С:Предприятия. Поэтому, если вы вызываете его из клиентского кода управляемой формы, необходимо обернуть вызов в серверный метод.
Для того чтобы узнать, какие пользователи в данный момент активны в информационной базе, то есть имеют открытые сеансы работы, мы будем использовать глобальный объект СеансыИнформационнойБазы. Этот объект предоставляет доступ к информации о текущих подключениях к базе данных, что является основой для разработки центра администрирования с функциями управления сеансами.
Разберем процесс получения активных сеансов:
СеансыИнформационнойБазы: Этот объект доступен напрямую на сервере. Он представляет собой коллекцию активных сеансов.Представим пример кода для получения информации об активных сеансах:
Функция ПолучитьСписокАктивныхСеансов() Экспорт
Результат = Новый Массив;
Для Каждого Сеанс ИЗ СеансыИнформационнойБазы Цикл
Если Сеанс.Пользователь <> Неопределено Тогда
Сообщить("-----------------------------------");
Сообщить("Активный пользователь: " + Сеанс.Пользователь.ПолноеИмя);
Сообщить("Приложение: " + Сеанс.Приложение); // Например, ТолстыйКлиент, ТонкийКлиент, ВебКлиент
Сообщить("Компьютер: " + Сеанс.Компьютер);
Сообщить("Начало сеанса: " + Формат(Сеанс.НачалоСеанса, "ДФ=dd.MM.yyyy HH:mm:ss"));
Сообщить("Идентификатор сеанса: " + Сеанс.ИдентификаторСеанса);
Сообщить("Заблокирован: " + Строка(Сеанс.Заблокирован));
// Добавим данные в массив для дальнейшего анализа
ДанныеСеанса = Новый Структура;
ДанныеСеанса.Вставить("Пользователь", Сеанс.Пользователь.ПолноеИмя);
ДанныеСеанса.Вставить("Приложение", Сеанс.Приложение);
ДанныеСеанса.Вставить("Компьютер", Сеанс.Компьютер);
ДанныеСеанса.Вставить("НачалоСеанса", Сеанс.НачалоСеанса);
Результат.Добавить(ДанныеСеанса);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
В этом примере мы перебираем коллекцию СеансыИнформационнойБазы. Для каждого объекта СеансИнформационнойБазы мы можем получить информацию о связанном с ним пользователе (через свойство Пользователь), тип клиентского приложения (Приложение), имя компьютера (Компьютер), время начала сеанса (НачалоСеанса) и уникальный идентификатор сеанса (ИдентификаторСеанса). Мы также можем проверить, заблокирован ли сеанс (Заблокирован).
Важный аспект: Права доступа. Для работы с объектом СеансыИнформационнойБазы и получения детальной информации о сеансах, у пользователя, от имени которого выполняется код, должны быть соответствующие права. Как правило, это права на просмотр данных системного объекта СеансыИнформационнойБазы, которые входят в роли администраторов системы. Если у пользователя нет таких прав, вызов метода может привести к ошибке или возврату неполных данных.
Базовые свойства объекта Пользователь дают общую информацию, но иногда нам требуются более глубокие данные, например, о ролях пользователя, группах доступа, к которым он принадлежит, или специфических пользовательских настройках, таких как основная организация, склад по умолчанию и так далее.
Для получения ролей пользователя напрямую из объекта Пользователь нет прямого свойства. Роли назначаются объекту ПользовательИБ (который можно получить через метод Пользователи.НайтиПоУникальномуИдентификатору() или Пользователи.НайтиПоИмени(), а затем использовать его для получения объекта ПользовательИнформационнойБазы) или через группы доступа. Обычно для получения ролей используется объект ПользовательИнформационнойБазы и его методы, или обход назначенных профилей/групп доступа.
Рассмотрим пример получения списка ролей для пользователя информационной базы:
Функция ПолучитьРолиПользователяИБ(Пользователь) Экспорт
Если Пользователь = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ПользовательИБ = Пользователи.НайтиПоУникальномуИдентификатору(Пользователь.УникальныйИдентификатор);
Если ПользовательИБ = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
СписокРолей = Новый Массив;
Для Каждого Роль ИЗ ПользовательИБ.ПолучитьРоли() Цикл
СписокРолей.Добавить(Роль.Имя);
КонецЦикла;
Возврат СписокРолей;
КонецФункции
// Пример использования:
// СписокВсехПользователей = ПолучитьСписокВсехПользователей();
// Для Каждого ДанныеПользователя Из СписокВсехПользователей Цикл
// ПользовательОбъект = Пользователи.НайтиПоУникальномуИдентификатору(ДанныеПользователя.УникальныйИдентификатор);
// Если ПользовательОбъект <> Неопределено Тогда
// Роли = ПолучитьРолиПользователяИБ(ПользовательОбъект);
// Сообщить("Роли для " + ПользовательОбъект.ПолноеИмя + ": " + СтрСоединить(Роли, ", "));
// КонецЕсли;
// КонецЦикла;
Здесь мы сначала получаем объект ПользовательИБ (Пользователь Информационной Базы), а затем используем его метод ПолучитьРоли(). Этот метод возвращает коллекцию ролей, которые непосредственно назначены данному пользователю или через группы доступа. Мы перебираем эту коллекцию и извлекаем имена ролей.
Для получения пользовательских настроек, которые хранятся в различных регистрах сведений (например, "НастройкиПользователей", "НастройкиПравДоступа"), необходимо работать с соответствующими объектами метаданных и регистрами. Платформа 1С предлагает универсальный метод ПользовательИнформационнойБазы.ПолучитьНастройкиПользователя(), который может быть использован для получения общих настроек, например, связанных с основным интерфейсом или другими системными параметрами, если это реализовано в конкретной конфигурации. Однако для специфичных настроек, таких как основная организация или склад, часто требуется прямой запрос к специализированным регистрам сведений конфигурации, например, в конфигурациях на базе БСП (Библиотека Стандартных Подсистем) это может быть НастройкиПользователей или ДополнительныеНастройкиПользователей.
Пример использования ПолучитьНастройкиПользователя() (на сервере):
Функция ПолучитьОбщиеНастройкиПользователя(Пользователь) Экспорт
Если Пользователь = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ПользовательИБ = Пользователи.НайтиПоУникальномуИдентификатору(Пользователь.УникальныйИдентификатор);
Если ПользовательИБ = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
// Этот метод возвращает объект типа "НастройкиПользователя", если таковые существуют
// или позволяет получить значения настроек по имени
Настройки = ПользовательИБ.ПолучитьНастройкиПользователя();
Если Настройки <> Неопределено Тогда
// Пример получения конкретной настройки, если она определена в конфигурации
// ИмяНастройки = "ОсновнаяОрганизация";
// Если Настройки.Свойство(ИмяНастройки) Тогда
// Сообщить("Основная организация: " + Настройки[ИмяНастройки]);
// КонецЕсли;
Сообщить("Настройки пользователя " + Пользователь.ПолноеИмя + " получены.");
// Дальнейшая работа с объектом Настройки, например, обход всех его свойств
// Для Каждого СвойствоНастройки Из Настройки Цикл
// Сообщить(" " + СвойствоНастройки.Ключ + ": " + СвойствоНастройки.Значение);
// КонецЦикла;
Возврат Настройки;
Иначе
Сообщить("Для пользователя " + Пользователь.ПолноеИмя + " общие настройки не найдены.");
Возврат Неопределено;
КонецЕсли;
КонецФункции
Мы видим, что работа с настройками пользователя может быть достаточно гибкой и сильно зависит от того, как эти настройки реализованы в конкретной конфигурации 1С.
Приведенные выше методы Пользователи.ПолучитьПользователей() и доступ к СеансыИнформационнойБазы являются серверными. Это означает, что их нельзя напрямую вызывать из клиентского кода управляемой формы (например, из обработчика события кнопки на форме). Для их использования необходимо вынести соответствующий код в серверную процедуру или функцию. Например:
// В модуле формы
&НаСервере
Функция ПолучитьИнформациюОПользователяхНаСервере()
// Здесь вызываем ПолучитьСписокВсехПользователей() и ПолучитьСписокАктивныхСеансов()
// и возвращаем результаты на клиент
СписокВсех = ПолучитьСписокВсехПользователей();
СписокАктивных = ПолучитьСписокАктивныхСеансов();
Результат = Новый Структура;
Результат.Вставить("ВсеПользователи", СписокВсех);
Результат.Вставить("АктивныеСеансы", СписокАктивных);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура КомандаВывестиИнформацию(Команда)
Данные = ПолучитьИнформациюОПользователяхНаСервере();
// Обработка данных на клиенте
Для Каждого ПользовательДанные Из Данные.ВсеПользователи Цикл
Сообщить("Клиент: Пользователь - " + ПользовательДанные.ПолноеИмя);
КонецЦикла;
Для Каждого СеансДанные Из Данные.АктивныеСеансы Цикл
Сообщить("Клиент: Активный сеанс - " + СеансДанные.Пользователь + ", Приложение: " + СеансДанные.Приложение);
КонецЦикла;
КонецПроцедуры
Такой подход обеспечивает правильное выполнение кода в нужном контексте и соблюдение архитектурных принципов управляемого приложения. Мы объявляем функцию ПолучитьИнформациюОПользователяхНаСервере() с директивой &НаСервере, что позволяет ей выполняться на сервере 1С:Предприятия. Затем из клиентской процедуры КомандаВывестиИнформацию() мы вызываем этот серверный метод и получаем результаты обратно на клиент для отображения или дальнейшей обработки.
Также стоит помнить о возможности использования фоновых заданий для выполнения долгих операций, связанных с обходом большого количества пользователей или сеансов. Это позволяет не блокировать интерфейс пользователя во время выполнения таких задач.
В целом, работа с системными объектами Пользователи и СеансыИнформационнойБазы предоставляет мощный инструментарий для управления и мониторинга пользователей и их активности в 1С 8.3 Управляемые формы. Мы рассмотрели основные методы и примеры кода, которые помогут вам решить типовые задачи по получению информации о пользователях и активных сеансах.