Проверить назначение ролей. Проверяет корректность заполнения назначения ролей, а также корректность прав в ролях по назначению.
// Проверяет корректность заполнения назначения ролей, а также корректность прав в ролях по назначению.
Процедура ПроверитьНазначениеРолей(НазначениеРолей = Неопределено, ПроверитьВсе = Ложь, СписокОшибок = Неопределено) Экспорт
Если НазначениеРолей = Неопределено Тогда
НазначениеРолей = ПользователиСлужебныйПовтИсп.НазначениеРолей();
КонецЕсли;
ЗаголовокОшибки =
НСтр("ru = 'Ошибка в процедуре ПриОпределенииНазначенияРолей общего модуля ПользователиПереопределяемый.'");
ТекстОшибки = "";
Назначение = Новый Структура;
Для Каждого ОписаниеНазначенияРолей Из НазначениеРолей Цикл
Роли = Новый Соответствие;
Для Каждого КлючИЗначение Из ОписаниеНазначенияРолей.Значение Цикл
Роль = Метаданные.Роли.Найти(КлючИЗначение.Ключ);
Если Роль = Неопределено Тогда
ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В метаданных не найдена роль ""%1"",
|указанная в назначении %2.'"),
КлючИЗначение.Ключ, ОписаниеНазначенияРолей.Ключ);
Если СписокОшибок = Неопределено Тогда
ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки;
Иначе
СписокОшибок.Добавить(Неопределено, ОписаниеОшибки);
КонецЕсли;
Продолжить;
КонецЕсли;
Роли.Вставить(Роль, Истина);
Для Каждого ОписаниеНазначения Из Назначение Цикл
Если ОписаниеНазначения.Значение.Получить(Роль) = Неопределено Тогда
Продолжить;
КонецЕсли;
ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Роль ""%1"" указана более чем в одном назначении:
|%2, %3.'"),
Роль.Имя, ОписаниеНазначенияРолей.Ключ, ОписаниеНазначения.Ключ);
Если СписокОшибок = Неопределено Тогда
ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки;
Иначе
СписокОшибок.Добавить(Роль, ОписаниеОшибки);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Назначение.Вставить(ОписаниеНазначенияРолей.Ключ, Роли);
КонецЦикла;
// Проверка ролей внешних пользователей.
НедоступныеПрава = Новый Массив;
НедоступныеПрава.Добавить("Администрирование");
НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации");
НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных");
НедоступныеПрава.Добавить("АдминистрированиеДанных");
ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.ТолькоДляВнешнихПользователей, ТекстОшибки,
НСтр("ru = 'При проверке ролей только для внешних пользователей найдены ошибки:'"), СписокОшибок);
ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.СовместноДляПользователейИВнешнихПользователей, ТекстОшибки,
НСтр("ru = 'При проверке ролей совместно для пользователей и внешних пользователей найдены ошибки:'"), СписокОшибок);
// Проверка ролей пользователей.
Если ОбщегоНазначения.РазделениеВключено() Или ПроверитьВсе Тогда
Роли = Новый Соответствие;
Для Каждого Роль Из Метаданные.Роли Цикл
Если Назначение.ТолькоДляАдминистраторовСистемы.Получить(Роль) <> Неопределено
Или Назначение.ТолькоДляПользователейСистемы.Получить(Роль) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Роли.Вставить(Роль, Истина);
КонецЦикла;
НедоступныеПрава = Новый Массив;
НедоступныеПрава.Добавить("Администрирование");
НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации");
НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных");
НедоступныеПрава.Добавить("ТолстыйКлиент");
НедоступныеПрава.Добавить("ВнешнееСоединение");
НедоступныеПрава.Добавить("Automation");
НедоступныеПрава.Добавить("ИнтерактивноеОткрытиеВнешнихОбработок");
НедоступныеПрава.Добавить("ИнтерактивноеОткрытиеВнешнихОтчетов");
НедоступныеПрава.Добавить("РежимВсеФункции");
НеразделенныеДанные = НеразделенныеДанные();
ПроверитьСоставПравРолей(НедоступныеПрава, Роли, ТекстОшибки,
НСтр("ru = 'При проверке ролей для пользователей приложения найдены ошибки:'"), СписокОшибок, НеразделенныеДанные);
КонецЕсли;
Если Не ОбщегоНазначения.РазделениеВключено() Или ПроверитьВсе Тогда
Роли = Новый Соответствие;
Для Каждого Роль Из Метаданные.Роли Цикл
Если Назначение.ТолькоДляАдминистраторовСистемы.Получить(Роль) <> Неопределено
Или Назначение.ТолькоДляВнешнихПользователей.Получить(Роль) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Роли.Вставить(Роль, Истина);
КонецЦикла;
НедоступныеПрава = Новый Массив;
НедоступныеПрава.Добавить("Администрирование");
НедоступныеПрава.Добавить("АдминистрированиеРасширенийКонфигурации");
НедоступныеПрава.Добавить("ОбновлениеКонфигурацииБазыДанных");
ПроверитьСоставПравРолей(НедоступныеПрава, Роли, ТекстОшибки,
НСтр("ru = 'При проверке ролей для пользователей найдены ошибки:'"), СписокОшибок);
ПроверитьСоставПравРолей(НедоступныеПрава, Назначение.СовместноДляПользователейИВнешнихПользователей, ТекстОшибки,
НСтр("ru = 'При проверке ролей совместно для пользователей и внешних пользователей найдены ошибки:'"), СписокОшибок);
КонецЕсли;
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
ВызватьИсключение ЗаголовокОшибки + ТекстОшибки;
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)