Каталог решений - Просмотр прав доступа и ролей 1С (документы, справочники и т.д.)

Просмотр прав доступа и ролей 1С (документы, справочники и т.д.)

Просмотр прав доступа и ролей 1С (документы, справочники и т.д.)

В наличии

Обработка для просмотра прав пользователей в 1С на конкретный объект метаданных (документ, справочник, и т.д.). Может быть полезна для анализа и настройки прав пользователей в различных конфигурациях (1С: Бухгалтерия, 1С: ERP, 1С: Документооборот, 1С: Розница, 1С: УНФ и т.д.). Поможет понять, кому какие нужно добавить или изменить права, и какие роли.

Категория:

Описание

Обработка позволяет вывести на экран по объекту метаданных:

  • во-первых, роли с указанием состава прав на объект;
  • во-вторых, пользователей с указанием прав;
  • в-третьих, состав пользователей, у которых есть конкретная роль с указанием прав по этой роли.

Обработка практически универсальная, без привязки к БСП. Открывается через Файл — Открыть.

По умолчанию есть два ограничения:

  • справочник с пользователями должен называться "Справочник.Пользователи";
  • используется общая форма "ВыборОбъектовМетаданных".

В случае, если в конфигурации объекты называются иначе, требуется в разделе "Техническая информация" указать нужные наименования.

 

 

Алгоритм работы в пользовательском режиме:

1. Необходимо в поле "Объект метаданных" нажать на три точки и выбрать необходимый объект, права на который требуется определить.

Например, выберем в 1С: Бухгалтерии документ Поступление (акт, накладная):

 

    

2. Далее заполнятся три табличных части формы:

  • "Роли, имеющие права на объект" — в данной табличной части указаны все роли, которые имеют хотя бы одно право на объект. Состав прав указан флагами в соответствующих столбцах. В зависимости от типа объекта состав прав может быть разным, например у справочников это могут быть Чтение, Добавление, Изменение, Удаление. А у документов добавятся Проведение, Отмена проведения.
  • "Все пользователи с доступом к объекту — здесь указаны все пользователи, которые имеют хотя бы одно право на объект. Состав прав указан флагами в соответствующих столбцах.
  • "Пользователи, у которых есть выделенная роль" — данная табличная часть показывает состав пользователей, у которых есть роль, которая выделена в первой табличной части ("Роли, имеющие права на объект"). Добавил данный функционал, так как благодаря ему удобно анализировать, откуда у того или иного пользователя возникло право на документ, справочник.

 

    

3. После этого можно посредством кнопок "Еще — Вывести список" сохранить, например, в Excel.

 

    

Основные процедуры (для программиста):

1. При создании на сервере заполняется кэш с пользователями ИБ и пользователями из справочника:

 

	ТаблицаПользователей = Новый ТаблицаЗначений;
	ТаблицаПользователей.Колонки.Добавить("ПользовательИБ", Новый ОписаниеТипов("ПользовательИнформационнойБазы"));
	ТаблицаПользователей.Колонки.Добавить("ПользовательСсылка", Новый ОписаниеТипов("СправочникСсылка." + СправочникПользователи));
	ВыборкаПользователи = Справочники.Пользователи.Выбрать();
	Пока ВыборкаПользователи.Следующий() Цикл
		ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ВыборкаПользователи.ИдентификаторПользователяИБ);
		Если ПользовательИБ = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		НовСтр = ТаблицаПользователей.Добавить();
		НовСтр.ПользовательИБ = ПользовательИБ;
		НовСтр.ПользовательСсылка = ВыборкаПользователи.Ссылка;
	КонецЦикла;
	ХранилищеТаблицыПользователей = ПоместитьВоВременноеХранилище(ТаблицаПользователей, УникальныйИдентификатор);

    

2. При выборе объекта метаданных заполняются табличные части с помощью проверки функцией ПравоДоступа(). Также происходит динамическая установка видимости необходимых колонок/прав в зависимости от применимости к типу метаданных. Например, "Проведение" не может быть у справочника. Реализовал через Попытку/Исключение.

Текст основной процедуры:

&НаСервере
Процедура ВыполнитьКомандуНаСервере()
	ТЗ_Роли.Очистить();	//первая табличная часть с ролями
	ТЗ_Пользователи.Очистить(); //вторая табличная часть со всеми пользователями
	ТЗ_ПользователиРоли.Очистить(); //третья табличная часть с пользователями с выделенной ролью, заполняется динамически
	Если Не ЗначениеЗаполнено(ОбъектМетаданных) Тогда
		ВызватьИсключение "Необходимо выбрать объект метаданных!";	
		Возврат;
	КонецЕсли;

	//формируем массив всех основных прав
	МассивПрав = Новый Массив;
	МассивПрав.Добавить("Чтение");
	МассивПрав.Добавить("Просмотр");

	МассивПрав.Добавить("Добавление");
	МассивПрав.Добавить("ИнтерактивноеДобавление");

	МассивПрав.Добавить("Изменение");
	МассивПрав.Добавить("Редактирование");

	МассивПрав.Добавить("Удаление");
	МассивПрав.Добавить("ИнтерактивноеУдаление");

	МассивПрав.Добавить("ИнтерактивнаяПометкаУдаления");
	МассивПрав.Добавить("ИнтерактивноеСнятиеПометкиУдаления");
	МассивПрав.Добавить("ИнтерактивноеУдалениеПомеченных");
	
	МассивПрав.Добавить("Проведение");
	МассивПрав.Добавить("ИнтерактивноеПроведение");
	МассивПрав.Добавить("ИнтерактивноеИзменениеПроведенных");

	МассивПрав.Добавить("ОтменаПроведения");
	МассивПрав.Добавить("ИнтерактивнаяОтменаПроведения");

	МассивПрав.Добавить("Использование");
	МассивПрав.Добавить("Получение");
	МассивПрав.Добавить("Установка");

	Об = Метаданные.НайтиПоПолномуИмени(ОбъектМетаданных);

	//создаем ТЗ, с которой будем работать, и которую в дальнейшем загрузим в первую табличную часть
	мТЗ_Роли = Новый ТаблицаЗначений;      
	мТЗ_Роли.Колонки.Добавить("РольСсылка", Новый ОписаниеТипов("ОбъектМетаданных"));
	мТЗ_Роли.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка"));
	мТЗ_Роли.Колонки.Добавить("РольИмя", Новый ОписаниеТипов("Строка"));
	мТЗ_Роли.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка"));
	мТЗ_Пользователи = Новый ТаблицаЗначений;
	мТЗ_Пользователи.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("СправочникСсылка.Пользователи"));
	КоличествоПрав = МассивПрав.Количество();
	СтруктураПрав = Новый Структура;
	ТипБулево = Новый ОписаниеТипов("Булево");

	//для каждого права проверяем применимость к объекту метаданных и исходя из этого устанавливаем видимость колонок во всех ТЧ
	Для й = 1 По КоличествоПрав Цикл
		Инд = КоличествоПрав - й;
		Право = МассивПрав[Инд];
		Попытка
			ПравоДоступа(Право, Об);
			Элементы["ТЗ_Роли" + Право].Видимость = Истина;          
			Элементы["ТЗ_Пользователи" + Право].Видимость = Истина;
			Элементы["ТЗ_ПользователиРоли" + Право].Видимость = Истина;
			мТЗ_Роли.Колонки.Добавить(Право, ТипБулево);
			мТЗ_Пользователи.Колонки.Добавить(Право, ТипБулево);
			СтруктураПрав.Вставить(Право, Ложь);
		Исключение
			Элементы["ТЗ_Роли" + Право].Видимость = Ложь;
			Элементы["ТЗ_Пользователи" + Право].Видимость = Ложь;
			Элементы["ТЗ_ПользователиРоли" + Право].Видимость = Ложь;
			МассивПрав.Удалить(Инд);
		КонецПопытки;
	КонецЦикла;

	//заполняем первую ТЧ, добавляя те роли, которые имеют хотя бы одно из прав на объект
	Для каждого Роль Из Метаданные.Роли Цикл
		ЕстьХотяБыОдноПраво = Ложь; 
		Для каждого Право Из МассивПрав Цикл
			ЕстьПраво = ПравоДоступа(Право, Об, Роль);
			Если Не ЕстьХотяБыОдноПраво И ЕстьПраво Тогда
				ЕстьХотяБыОдноПраво = Истина;
			КонецЕсли;
			СтруктураПрав[Право] = ЕстьПраво;
		КонецЦикла;
		Если ЕстьХотяБыОдноПраво Тогда
			НовСтрока = мТЗ_Роли.Добавить();
			НовСтрока.РольСсылка = Роль;   
			НовСтрока.Роль = Роль.Синоним;
			НовСтрока.РольИмя = Роль.Имя;
			НовСтрока.ПолноеИмя = Роль.Имя;
			ЗаполнитьЗначенияСвойств(НовСтрока, СтруктураПрав);
		КонецЕсли;
	КонецЦикла;

	//заполняем вторую ТЧ пользователями, которые имеют хотя бы одну роль из первой ТЧ
	ТаблицаПользователей = ПолучитьИзВременногоХранилища(ХранилищеТаблицыПользователей);
	Для каждого Стр Из ТаблицаПользователей Цикл
		ПользовательИБ = Стр.ПользовательИБ;
		Ссылка = Стр.ПользовательСсылка;
		ПользовательИмеетХотьОднуРоль = Ложь;
		Для каждого СтрТЗ Из мТЗ_Роли Цикл
			Если Не ПользовательИБ.Роли.Содержит(СтрТЗ.РольСсылка) Тогда
				Продолжить;
			КонецЕсли;
			Если Не ПользовательИмеетХотьОднуРоль Тогда
				НовСтр = мТЗ_Пользователи.Добавить();
				НовСтр.Пользователь = Ссылка;
				ПользовательИмеетХотьОднуРоль = Истина;
			КонецЕсли;
			Для каждого Право Из МассивПрав Цикл
				Если СтрТЗ[Право] И Не НовСтр[Право] Тогда
					НовСтр[Право] = Истина;		
				КонецЕсли;		
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	
	ТЗ_Роли.Загрузить(мТЗ_Роли);
	ТЗ_Пользователи.Загрузить(мТЗ_Пользователи);

КонецПроцедуры

Обработка не затрагивает такие категории, как "Профили групп доступа", регистр "Права ролей", и прочее.

has been added to your cart:
Оформление заказа