Перенос отбора по ответственному из формы отчета УНФ в обычную

В одном из релизов УНФ перешли с формы отчета УНФ на обычную форму отчета БСП.

А в форме отчета УНФ были сделаны настройки по правам доступа менеджеров — если это ограниченный в правах менеджер, то ему можно запускать отчеты только там, где он ответственный (за исключением некоторых отчетов, где этот доступ не контролируется).

Старый код был реализован в расширении формы так:


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

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

&НаСервере
Функция дор_НеКонтролироватьОтветственныхПоПравамДоступа() Экспорт
	Возврат Вариант.дор_НеКонтролироватьОтветственныхПоПравамДоступа;
КонецФункции

Тем не менее, перенести его в новую форму отчета оказалось не так уж и просто.

Для начала посмотрим, куда попадает отбор по ответственному.

Устанавливаю отбор по менеджеру в форме отчета:

Но в Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы этого отбора нет, где он был раньше:

Теперь этот отбор можно найти в Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы:

Просто перебирая этот список, невозможно получить левое значение отбора, решение нашлось тут.

Я решил оформить получение пользовательской настройки это в виде функции:

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

С учетом этого основной код формы будет выглядеть так:

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

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

Осталось еще посмотреть, куда переехал вариант, а переехал он в структуру НастройкиОтчета, поэтому функция проверки необходимости контролировать пользователей в отчете выглядит теперь так:

&НаСервере
Функция дор_НеКонтролироватьОтветственныхПоПравамДоступа() Экспорт
	Попытка
		Возврат НастройкиОтчета.ВариантСсылка.дор_НеКонтролироватьОтветственныхПоПравамДоступа;
	Исключение
	КонецПопытки;
КонецФункции

В итоге при открытии ответсвенный заполняется, а если пользователь изменит по нему отбор, получит отказ в формировании отчета:

Среда: УНФ 1.6.27.167 Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *