При разработке и интеграции в конфигурациях на платформе «1С:Предприятие 8.3» разработчики нередко сталкиваются с ситуацией: создается пользователь информационной базы, в коде выполняется метод ПользовательИБ.Роли.Добавить(...), вызывается Записать(), однако добавленные роли у пользователя не появляются либо моментально сбрасываются. Разберем, почему возникает такое поведение в современных типовых решениях (например, в «1С:Бухгалтерия предприятия 3.0») и как корректно программно назначать права.
Проанализируем архитектуру подсистемы безопасности типовых конфигураций, созданных на базе Библиотеки стандартных подсистем (БСП):
ПользовательИнформационнойБазы, а рассчитываются автоматически на основании связанных данных справочников ГруппыДоступа и ПрофилиГруппДоступа. При любой записи элемента справочника Пользователи, выполнении регламентных заданий или входе пользователя в систему подсистема сверяет текущий состав ролей в ИБ с рассчитанным эталоном. Все роли, добавленные разработчиком «напрямую» через платформенный объект ИБ, система воспринимает как несанкционированные и удаляет.ИдентификаторПользователяИБ справочника Пользователи имеет системный тип УникальныйИдентификатор (UUID). Ошибочная передача в него строки (например, имени пользователя) нарушает целостность связки между учетной записью ИБ и справочником Пользователи.ИдентификаторыОбъектовМетаданных). До выполнения регламентного обновления БСП не сможет учесть эту роль в правах доступа.Выясним правильный подход: в конфигурациях на БСП необходимо оперировать не отдельными ролями, а профилями групп доступа. Назначим пользователю доступ штатными методами.
Посмотрим на пример привязки профиля к пользователю через модуль УправлениеДоступом:
ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");
ПрофильСсылка = Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Бухгалтер");
// Назначение профиля средствами подсистемы БСП
УправлениеДоступом.ВключитьПрофильПользователю(ПользовательСсылка, ПрофильСсылка);
Если доступ в конфигурации организован через группы доступа, добавим пользователя непосредственно в состав участников группы:
ГруппаОбъект = Справочники.ГруппыДоступа.НайтиПоНаименованию("Бухгалтерия").ПолучитьОбъект();
СтрокаПользователя = ГруппаОбъект.Пользователи.Добавить();
СтрокаПользователя.Пользователь = ПользовательСсылка;
ГруппаОбъект.Записать();
Разберем по шагам создание нового пользователя с использованием стандартов БСП, чтобы все связи учетной записи и подсистемы доступа сформировались без ошибок:
// Шаг 1. Формирование структуры описания пользователя ИБ
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ОписаниеПользователяИБ.Имя = "Ivanov";
ОписаниеПользователяИБ.ПолноеИмя = "Иванов Иван Иванович";
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.ВходВПрограммуРазрешен = Истина;
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Истина;
ОписаниеПользователяИБ.Язык = "Русский";
// Шаг 2. Создание элемента справочника Пользователи
ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
ПользовательОбъект.Наименование = ОписаниеПользователяИБ.ПолноеИмя;
ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
ПользовательОбъект.Записать();
// Шаг 3. Привязка прав через профиль доступа
ПрофильСсылка = Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("Администратор");
УправлениеДоступом.ВключитьПрофильПользователю(ПользовательОбъект.Ссылка, ПрофильСсылка);
Если группы доступа или профили назначены программно, но состав ролей пользователя ИБ еще не пересчитался, выполним принудительное обновление состава ролей:
УправлениеДоступомСлужебный.ОбновитьРолиПользователей(ПользовательОбъект.Ссылка);
УстановитьПривилегированныйРежим(Истина) или выполнять процедуру в привилегированном общем модуле.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеДанныхТекущейВерсии() или обработку «Обновление вспомогательных данных»).