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