1с как запросом получить роли пользователей

Узнайте, как одним запросом достать роли пользователей в 1С. Простой код, никаких сложностей — копируйте и применяйте прямо сейчас!

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Вопрос получения списка ролей пользователя является распространенной задачей при администрировании, аудите прав доступа или разработке собственных механизмов безопасности в системах «1С:Предприятие 8»․ Важно сразу сделать ключевое уточнение: на уровне технологической платформы 1С (пользователи ИБ) не существует прямого SQL-запроса (языка запросов 1С) к системной таблице пользователей и ролей․ Метаданные системных пользователей не выставлены в объектную модель запросов․

Однако, существуют эффективные программные способы решения этой задачи через встроенный язык․ В данной статье подробно разберем все подходы: от работы с объектом ПользователиИнформационнойБазы до анализа прикладных пользователей (если они реализованы в конфигурации) и использования внешних обработок․

Основной способ: Объектная модель «ПользователиИнформационнойБазы»

Это единственный нативный и официально поддерживаемый платформой способ получения ролей технологических пользователей (тех, кто входит в базу через окно авторизации платформы)․

Получение ролей текущего пользователя

Самый частый сценарий — проверить права того, кто сейчас работает в сеансе․

// Получаем массив ролей текущего пользователя
МассивРолей = ПользователиИнформационнойБазы․ТекущийПользователь․Роли;

// Перебор ролей
Для Каждого Роль Из МассивРолей Цикл
 Сообщить(Роль․Имя); // Имя роли (например, "ПолныеПрава", "Оператор")
 // Роль․ПолноеИмя ‒ возвращает полное имя с префиксом конфигурации, если есть
КонецЦикла;

Получение ролей конкретного пользователя по имени

Если у вас есть строковое имя пользователя (например, из лога или справочника «Пользователи» прикладной конфигурации), алгоритм следующий:

Функция ПолучитьРолиПользователяПоИмени(ИмяПользователя) Экспорт
 
 // 1․ Пытаемся найти пользователя ИБ
 ПользовательИБ = ПользователиИнформационнойБазы․НайтиПоИмени(ИмяПользователя);
 
 Если ПользовательИБ = Неопределено Тогда
 Возврат Новый Массив; // Пользователь не найден
 КонецЕсли;
 
 // 2․ Свойство Роли возвращает коллекцию (массив) объектов типа РольИБ
 Возврат ПользовательИБ․Роли;
 
КонецФункции

// Пример использования:
МассивРолей = ПолучитьРолиПользователяПоИмени("ИвановИван");
Для Каждого Роль Из МассивРолей Цикл
 Сообщить(Роль․Имя);
КонецЦикла;

Важно: Метод НайтиПоИмени чувствителен к регистру в зависимости от настроек СУБД и платформы, лучше приводить имя к единому виду или перебирать всех пользователей при неточном совпадении․

Массовое получение ролей для списка пользователей

Если нужно обработать сразу группу пользователей (например, для отчета), эффективнее получить общий список пользователей ИБ один раз:

Процедура ВывестиРолиВсехПользователей
 
 // Получаем массив всех пользователей ИБ
 ВсеПользователи = ПользователиИнформационнойБазы․ПолучитьПользователей;
 
 Для Каждого Пользователь Из ВсеПользователи Цикл
 СтрокаРолей = "";
 
 Для Каждого Роль Из Пользователь․Роли Цикл
 СтрокаРолей = СтрокаРолей + Роль․Имя + "; ";
 КонецЦикла;
 
 Сообщить(Пользователь․Имя + ": " + СтрокаРолей);
 КонецЦикла;
 
КонецПроцедуры

Проверка наличия конкретной роли (Функция РольДоступна)

Часто не нужен весь список, а требуется просто проверить: «Есть ли у пользователя роль X?»․ Для этого не обязательно перебирать массив, есть встроенная функция платформы․

// Проверка для текущего пользователя
Если РольДоступна("ПолныеПрава") Тогда
 Сообщить("Есть полные права");
КонецЕсли;

// Проверка для конкретного пользователя (требует контекста пользователя)
// В серверном контексте или фоновом задании можно сменить пользователя сеанса,
// но чаще всего проверяют текущего․

Нюанс: Функция РольДоступна проверяет не только прямые роли, но и роли, входящие в состав других ролей (иерархию ролей), а также права, выданные через профили доступа (в новых версиях платформы)․ Это делает её более надежной, чем ручной перебор массива Пользователь․Роли․

«Запросом» к прикладным пользователям (Справочник «Пользователи»)

Во многих типовых конфигурациях (ERP, КА, УТ, ЗУП и др․) существует прикладной справочник «Пользователи» (или «ПользователиСистемы»)․ Это объекты метаданных конфигурации, а не платформы․ К ним можно обращаться языком запросов 1С․

Обычно связь с ролями реализована через табличную часть справочника «Роли» или отдельный регистр сведений․

Пример запроса к справочнику Пользователи (типовая структура):

Запрос = Новый Запрос;
Запрос․Текст = 
"ВЫБРАТЬ
| Пользователи․Ссылка КАК Пользователь,
| ПользователиРоли․Роль КАК Роль
|ИЗ
| Справочник․Пользователи КАК Пользователи
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник․Пользователи․Роли КАК ПользователиРоли
| ПО Пользователи․Ссылка = ПользователиРоли․Ссылка
|ГДЕ
| Пользователи․Имя = &ИмяПользователя";

Запрос․УстановитьПараметр("ИмяПользователя", "Иванов Иван");
Результат = Запрос․Выполнить;
Выборка = Результат․Выбрать;

Пока Выборка․Следующий Цикл
 Сообщить(Выборка․Роль);
КонецЦикла;

Обратите внимание: Структура хранения ролей в прикладном справочнике зависит от конкретной конфигурации․ В современных типовых решениях (на БСП) роли часто хранятся в регистре сведений ПраваПользователей или табличной части Роли справочника Пользователи․ Всегда проверяйте метаданные вашей конфигурации (Конфигуратор -> Метаданные -> Справочники -> Пользователи -> Табличные части)․

Программное создание ролей и назначение прав (Расширение конфигурации)

Если задача стоит не просто «прочитать», а «выдать роль пользователю по кнопке», используется метод Записать объекта пользователя ИБ․

Процедура НазначитьРольПользователю(ИмяПользователя, ИмяРоли)
 
 ПользовательИБ = ПользователиИнформационнойБазы․НайтиПоИмени(ИмяПользователя);
 
 Если ПользовательИБ = Неопределено Тогда
 Сообщить("Пользователь не найден");
 Возврат;
 КонецЕсли;
 
 // Создаем объект для редактирования
 ОбъектПользователя = ПользовательИБ․ПолучитьОбъект;
 
 // Проверяем, есть ли уже роль
 НайтиРоль = ОбъектПользователя․Роли․Найти(ИмяРоли, "Имя");
 
 Если НайтиРоль = Неопределено Тогда
 НоваяРоль = ОбъектПользователя․Роли․Добавить;
 НоваяРоль․Имя = ИмяРоли;
 ОбъектПользователя․Записать;
 Сообщить("Роль назначена");
 Иначе
 Сообщить("Роль уже была назначена");
 КонецЕсли;
 
КонецПроцедуры

Использование внешних обработок и консоли запросов

Как упоминалось в обзоре интернет-источников (например, форум Инфостарт, публикации Лаврова), для разовых административных задач удобно использовать готовые внешние обработки (файлы ․epf)․

  • Консоль конфигуратора / Консоль запросов: Прямой запрос ВЫБРАТЬ * ИЗ ПользователиИнформационнойБазы не сработает, так как это системный объект, недоступный в языке запросов․
  • Внешние обработки: Обычно это обертки над кодом из п․ 1․1–1․3․ Они позволяют администратору без прав конфигуратора (но с правами администрирования ИБ) быстро посмотреть роли, введя имя пользователя в поле ввода формы․
  • Сравнение пользователей: Типовая задача — «Сравнить права двух пользователей»․ Алгоритм: получить два массива ролей (п․ 1․2), найти разницу (методами массивов Найти или через Соответствие), вывести отличия․

Работа в клиент-серверном варианте и на сервере 1С

Объект ПользователиИнформационнойБазы доступен только на сервере (в серверных процедурах, фоновых заданиях, веб-сервисах, REST API)․

Если код выполняется на клиенте (обычная форма, управляемая форма с клиентскими командами):

  1. Вызывайте серверную функцию через &НаСервере / &НаСервереБезКонтекста․
  2. Возвращайте на клиент массив строк (имен ролей) или массив структур, так как объекты РольИБ не сериализуются для передачи на клиент напрямую․
&НаСервереБезКонтекста
Функция ПолучитьРолиНаСервере(ИмяПользователя)
 Пользователь = ПользователиИнформационнойБазы․НайтиПоИмени(ИмяПользователя);
 Если Пользователь = Неопределено Тогда Возврат Новый Массив; КонецЕсли;
 
 Результат = Новый Массив;
 Для Каждого Роль Из Пользователь․Роли Цикл
 Результат․Добавить(Роль․Имя); // Передаем только строки
 КонецЦикла;
 Возврат Результат;
КонецФункции

&НаКлиенте
Процедура КнопкаПолучитьРолиНажатие(Команда)
 Роли = ПолучитьРолиНаСервере("Admin");
 // Работаем с массивом строк на клиенте
КонецПроцедуры

Типичные ошибки и лучшие практики

Ошибка / Проблема Решение
Попытка написать ВЫБРАТЬ * ИЗ ПользователиИнформационнойБазы в консоли запросов․ Нельзя․ Используйте только встроенный язык (объектную модель)․
Роль есть в массиве Пользователь․Роли, но РольДоступна возвращает Ложь (или наоборот)․ РольДоступна учитывает иерархию ролей и профили доступа․ Массив Роли, только явно назначенные․ Доверяйте РольДоступна для проверки доступа․
Код работает в тонком клиенте, но падает в веб-клиенте/мобильном приложении․ Проверьте директивы компиляции․ Код работы с ПользователиИнформационнойБазы должен быть строго &НаСервере․
Не вижу пользователей, созданных через конфигуратор, в справочнике «Пользователи» конфигурации․ Это разные сущности․ Пользователи ИБ, это платформа․ Справочник «Пользователи», это данные конфигурации․ Синхронизацию нужно настраивать отдельно (обычно при входе пользователя)․
Нужно получить роли пользователя, который не заходит в базу давно (отключен)․ ПользователиИнформационнойБазы․ПолучитьПользователей возвращает всех, включая отключенных․ Свойство Пользователь․Активность покажет статус․

Резюме: какой способ выбрать?

  1. Задача: «Узнать роли текущего пользователя в коде»․ → ПользователиИнформационнойБазы․ТекущийПользователь․Роли или РольДоступна("ИмяРоли")․
  2. Задача: «Получить список ролей по имени пользователя (строка) в отчете/обработке»․ → Серверная функция + ПользователиИнформационнойБазы․НайтиПоИмени(Имя)․Роли․
  3. Задача: «Сделать отчет по всем пользователям и их ролям для аудита»․ → Цикл по ПользователиИнформационнойБазы․ПолучитьПользователей на сервере, выгрузка в табличный документ/Excel․
  4. Задача: «Получить роли прикладного пользователя (Справочник․Пользователи) запросом»․ → Язык запросов 1С к табличной части Роли справочника или регистру ПраваПользователей (зависит от конфигурации)․
  5. Задача: «Разовый просмотр админом без программирования»․ → Внешняя обработка (epf) с формой ввода имени и списком ролей․

Понимание разницы между пользователями информационной базы (платформа) и прикладными пользователями (конфигурация) — ключ к правильному выбору инструмента․ Прямого «SELECT * FROM Users» в 1С не существует, но объектная модель ПользователиИнформационнойБазы предоставляет полнофункциональный и быстрый API для решения любых административных задач․