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