Администрирование · 11 мин
Как получить группу пользователя в 1С
Как получить группу пользователя в 1С: через интерфейс, запросом и кодом на встроенном языке. Примеры для справочника «Пользователи» и групп доступа.
Задача определить, в какую группу входит пользователь, возникает в 1С регулярно: при настройке прав доступа, при разработке отчётов с отбором по подразделениям, при проверке принадлежности сотрудника к группе доступа. Способ решения зависит от того, о каких именно группах идёт речь — в типовых конфигурациях их несколько, и путают их чаще всего.
В конфигурациях на Библиотеке стандартных подсистем (БСП) существуют как минимум три разных механизма: группы пользователей (иерархический справочник), группы доступа (профили и права) и группы исполнителей задач. Каждый механизм хранит состав по-своему, и универсального ответа «где лежит группа пользователя» нет — сначала нужно понять, какая группа нужна.
Ниже разобраны способы получить группу пользователя через интерфейс, запросом к базе и программно на встроенном языке 1С, с примерами кода и типичными ошибками.
Какие группы пользователей существуют в 1С
Прежде чем писать запрос или искать в интерфейсе, определите, какая группа вам нужна. В типовых конфигурациях (Управление торговлей, ERP, ЗУП, Бухгалтерия) на базе БСП обычно присутствуют три механизма группировки пользователей.
Группы пользователей — иерархический справочник «Группы пользователей». Это простая организационная группировка: «Бухгалтерия», «Менеджеры», «Руководство». Состав хранится в табличной части «Состав» каждой группы.
Группы доступа — определяют права пользователя на объекты (профили групп доступа). Состав участников хранится в табличной части «Пользователи» группы доступа, а вычисленный состав с учётом иерархии — в регистре сведений «Составы групп пользователей».
Группы исполнителей задач — используются в механизмах бизнес-процессов, когда задача адресуется не конкретному человеку, а роли или группе. В конфигурациях без бизнес-процессов этот механизм может отсутствовать.
Сравнение механизмов групп
Подходит для организационной группировки и отборов в отчётах. Не влияет на права доступа.
Определяют права на объекты через профили. Использовать, когда задача связана с разграничением прав.
Нужны для адресации задач в бизнес-процессах. Вне процессов практически не применяются.
Как посмотреть группу пользователя через интерфейс
Самый быстрый способ без программирования — открыть карточку пользователя. Перейдите в раздел «Администрирование» → «Настройка прав и пользователей» → «Пользователи». Откройте нужного сотрудника: на форме обычно есть поле или ссылка, показывающая, в какие группы он входит.
Обратный путь — открыть саму группу. В разделе «Администрирование» найдите «Группы пользователей» (иногда пункт находится в «Настройка прав и пользователей»). Откройте группу: в табличной части «Состав» перечислены все участники.
Для групп доступа путь аналогичный: «Администрирование» → «Настройка прав и пользователей» → «Группы доступа». В карточке группы доступа на закладке «Участники» виден список пользователей, а в карточке пользователя часто выводится список его групп доступа.
- 1Откройте «Администрирование» → «Настройка прав и пользователей» → «Пользователи»
- 2Откройте карточку нужного пользователя
- 3Найдите поле или ссылку со списком групп (в ряде конфигураций — отдельная закладка)
- 4Для проверки откройте саму группу и убедитесь, что пользователь есть в табличной части «Состав»
Как получить группу пользователя запросом
Когда нужен массовый список «пользователь — группа» или отбор в отчёте, удобнее всего запрос к табличной части справочника. Состав группы пользователей хранится в табличной части «Состав» справочника «ГруппыПользователей».
ВЫБРАТЬ
ГруппыПользователейСостав.Ссылка КАК Группа,
ГруппыПользователейСостав.Пользователь КАК Пользователь
ИЗ
Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
ГДЕ
ГруппыПользователейСостав.Пользователь = &Пользователь
Такой запрос вернёт все группы, в которые пользователь включён непосредственно. Обратите внимание: если группы образуют иерархию, то вложенность учитывается не во всех механизмах одинаково — для групп доступа вычисленный состав с учётом иерархии хранится отдельно.
Для групп доступа запрос строится к табличной части «Пользователи» справочника «ГруппыДоступа» либо к регистру сведений «СоставыГруппПользователей», если нужен состав с учётом иерархии групп и подгрупп.
Как получить группу текущего пользователя программно
В коде на встроенном языке задача обычно звучит так: проверить, входит ли текущий пользователь в конкретную группу, и в зависимости от этого показать или скрыть функциональность. В БСП для этого есть готовые функции модуля «Пользователи».
Получить ссылку на текущего пользователя можно функцией Пользователи.ТекущийПользователь() (в серверном контексте) или ПользователиКлиент.ТекущийПользователь() (в клиентском). Дальше состав группы проверяется запросом или обходом табличной части.
Функция ПользовательВходитВГруппу(Пользователь, Группа) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Состав.Пользователь
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК Состав
|ГДЕ
| Состав.Ссылка = &Группа
| И Состав.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Группа", Группа);
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Возврат Не Запрос.Выполнить().Пустой();
КонецФункции
Такую функцию удобно разместить в общем серверном модуле и вызывать из форм, подписок на события и отчётов. Проверка через запрос надёжнее, чем обход табличной части группы в цикле: запрос выполняется на сервере СУБД и не тянет весь объект группы в память.
Если нужно получить не факт вхождения, а список всех групп пользователя, уберите ограничение по группе из условия и выгрузите результат запроса в таблицу значений.
Если проверка вхождения в группу вызывается часто (например, при каждом открытии формы), имеет смысл кэшировать результат в параметрах сеанса или повторно используемых значениях, чтобы не выполнять запрос при каждом обращении.
Как получить группу доступа пользователя
Группы доступа — самый частый сценарий, когда под «группой пользователя» понимают его права. Узнать, какие группы доступа назначены пользователю, можно в его карточке: в типовых конфигурациях там выводится список групп доступа с возможностью перехода.
Программно состав группы доступа читается из табличной части «Пользователи» справочника «ГруппыДоступа». Однако для проверки фактических прав лучше использовать механизмы БСП, потому что итоговые права складываются из профилей групп доступа, а не из самих групп.
ВЫБРАТЬ
ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
ИЗ
Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
ГДЕ
ГруппыДоступаПользователи.Пользователь = &Пользователь
Имейте в виду: регистр «Составы групп пользователей» заполняется регламентным заданием обновления. Если пользователя только что добавили в группу, а регламентное задание ещё не отработало, данные регистра могут временно отставать от табличной части.
Типичные ошибки при получении группы пользователя
Первая ошибка — путать группы пользователей и группы доступа. Отчёт построен по справочнику «Группы пользователей», а проверить нужно было права — в результате выводятся не те данные, и выводы о доступе оказываются неверными.
Вторая ошибка — искать пользователя по имени строкой. В базе могут быть однофамильцы или пользователи с изменёнными наименованиями. Всегда оперируйте ссылкой на элемент справочника «Пользователи», а не его строковым представлением.
Третья ошибка — игнорировать недействительных пользователей. В справочнике «Пользователи» есть признак «Недействителен»: такие учётные записи остаются в составах групп, но фактически не работают. При формировании списков участников фильтруйте их осознанно.
Четвёртая ошибка — забыть про внешних пользователей (контрагентов, физических лиц), если в конфигурации включён этот механизм. Они хранятся в отдельном справочнике и в общий запрос не попадают.
Как проверить результат
После того как вы получили группу пользователя любым способом, сверьте результат с интерфейсом. Откройте карточку пользователя и карточку группы: состав должен совпадать с тем, что вернул запрос или код.
Если данные расходятся, проверьте три вещи: тот ли это справочник (группы пользователей или группы доступа), отработало ли регламентное задание обновления составов, нет ли у пользователя нескольких учётных записей в базе.
Как проверить результат
Совпадает с результатом запроса или кода
В интерфейсе есть пользователь, которого нет в выборке — проверьте фильтры запроса
Последние изменения групп видны в выборке
Свежие изменения отсутствуют — дождитесь регламентного задания или обновите вручную
Уволенные пользователи исключены или помечены
В списке участников числятся неработающие сотрудники
Что важно запомнить
Сначала определите, какая группа нужна: группа пользователей, группа доступа или группа исполнителей задач. В интерфейсе состав виден в карточке пользователя и группы, программно — через запрос к табличной части «Состав» справочника «ГруппыПользователей» или «Пользователи» справочника «ГруппыДоступа». Оперируйте ссылками, а не наименованиями, и учитывайте задержку обновления регистра составов.
Частые вопросы
Как получить всех пользователей, входящих в конкретную группу?
Выполните запрос к табличной части «Состав» справочника «ГруппыПользователей» с условием по ссылке на группу. Либо откройте группу в интерфейсе — табличная часть «Состав» покажет всех участников. Для групп доступа аналогично используется табличная часть «Пользователи».
Чем группа пользователей отличается от группы доступа?
Группа пользователей — это организационная группировка для удобства отборов и отчётов, она не влияет на права. Группа доступа связана с профилем и определяет, какие объекты и действия доступны участникам.
Почему запрос не находит пользователя, который точно есть в группе?
Проверьте, что ищете по ссылке, а не по наименованию, что обращаетесь к нужному справочнику (группы пользователей, а не группы доступа), и что в условии не отсекаются недействительные элементы. Также убедитесь, что пользователь добавлен в состав группы напрямую, а не через вложенную группу.
Как узнать группу текущего пользователя в клиентском коде?
На клиенте получите ссылку через ПользователиКлиент.ТекущийПользователь(), а саму проверку вхождения в группу выполните серверным вызовом — запросы к базе доступны только на сервере.
Можно ли добавить пользователя в группу программно?
Да: получите объект группы методом ПолучитьОбъект(), добавьте строку с пользователем в табличную часть «Состав» и запишите объект. Делайте это в транзакции и проверяйте, что пользователь ещё не входит в состав, чтобы не создать дубли.
Работают ли эти способы в самописной конфигурации?
Только если конфигурация построена на БСП или повторяет её структуру. В полностью самописных решениях имена справочников и табличных частей могут отличаться — уточните структуру в конфигураторе через дерево метаданных.