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