Имя: Пароль:
1C
 
способ "красиво" спрятать часть справочника ч-з RLS.
0 ignorant
 
14.01.08
15:56
Иногда возникает потребность скрыть от пользователей некоторую часть справочника.
Использование отбора с условием ВСпискеПоИерархии перед открытием формы списка
не позволяет это сделать достаточно красиво: видна иерархическая структура справочника
с "лишними" группами.

Удалось решить проблему, используя RLS. В качестве примера рассмотрим справ. Номенклатура
Потребовалось:

1. 3 параметра сеанса
ИспользоватьФильтрациюНоменклатуры - булево, флажок использования фильтрации
РасширенныйФильтрПоНоменклатуре - ФиксированныйМассив - список групп номенклатуры,
подлежащих визуализации
ПустойФильтрПоНоменклатуре - ФиксированныйМассив - пустой список групп номенклатуры
для служебных целей

2. В роли пользователя для права Чтение справ. Номенклатура для поля Ссылка ограничиваем
доступ условием:

Номенклатура ГДЕ ВЫБОР
           КОГДА &ИспользоватьФильтрациюНоменклатуры И Номенклатура.ЭтоГруппа
           ТОГДА Номенклатура.Ссылка В (&РасширенныйФильтрПоНоменклатуре)
                       ИЛИ Номенклатура.Родитель В (&ПустойФильтрПоНоменклатуре)
           ИНАЧЕ ИСТИНА
       КОНЕЦ

3. Для храненения списка групп, с которыми разрешено работать пользователям филиала в нашей конфигурации
создана ТЧ НоменклатураФилиала в плане обмена Филиалы - т. сказать, "местные" условия  ;)

4. В МодулеПриложения вот таким извращенным способом определяем значения ПараметровСеанса

Процедура НазначитьПараметрыСеанса ()
   
   ПараметрыСеанса.ИспользоватьФильтрациюНоменклатуры = Ложь;
   
   ГлавныйУзел = ПланыОбмена.ГлавныйУзел();
   Если ГлавныйУзел = Неопределено Тогда
       ПараметрыСеанса.ГлавныйУзелРИБ = Истина;
       //Возврат;
   Иначе
       ГлавныйУзелРИБ = Ложь;
   КонецЕсли;
   
   //    Для подчиненного узла РИБ анализируем наличие фильтра по номенклатуре
   Если ПланыОбмена.Филиалы.ЭтотУзел().НоменклатураФилиала.Количество() = 0 Тогда
       Возврат;
   Иначе
       ПараметрыСеанса.ИспользоватьФильтрациюНоменклатуры = Истина;
       
       МассивГруппФильтрации = ПланыОбмена.Филиалы.ЭтотУзел().НоменклатураФилиала.ВыгрузитьКолонку("Номенклатура");
       ПараметрыСеанса.РасширенныйФильтрПоНоменклатуре = Новый ФиксированныйМассив ( МассивГруппФильтрации);
       ПараметрыСеанса.ПустойФильтрПоНоменклатуре = Новый ФиксированныйМассив ( МассивГруппФильтрации);
       
       СписокГруппФильтрацииНоменклатуры    = Новый СписокЗначений;
       СписокГруппФильтрацииНоменклатуры.ЗагрузитьЗначения(МассивГруппФильтрации);
       
       СписокГруппНижнегоУровня            = Новый СписокЗначений;
       СписокГруппНижнегоУровня.ЗагрузитьЗначения(МассивГруппФильтрации);
   КонецЕсли;        
   
   //    В цикле формируем список групп ВЕРХНЕГО УРОВНЯ, подлежащих фильтрации
   Пока Истина Цикл
       
       ДобавленыГруппыВСписокФильтрации = Ложь;
       Для Каждого Элемент ИЗ МассивГруппФильтрации Цикл
           Если Элемент.Родитель.Пустая() Тогда
               Продолжить;
           ИначеЕсли СписокГруппФильтрацииНоменклатуры.НайтиПоЗначению(Элемент.Родитель) = Неопределено Тогда
               СписокГруппФильтрацииНоменклатуры.Добавить(Элемент.Родитель);
               ДобавленыГруппыВСписокФильтрации = Истина;
           КонецЕсли;
       КонецЦикла;
       
       Если НЕ ДобавленыГруппыВСписокФильтрации Тогда
           Прервать;
       КонецЕсли;
       
       ПараметрыСеанса.РасширенныйФильтрПоНоменклатуре = Новый ФиксированныйМассив ( СписокГруппФильтрацииНоменклатуры.ВыгрузитьЗначения());
       
   КонецЦикла;
   
   Запрос = Новый Запрос;
   Запрос.Текст =    "ВЫБРАТЬ
          |    Номенклатура.Ссылка
          |ИЗ
          |    Справочник.Номенклатура КАК Номенклатура
          |ГДЕ
          |    Номенклатура.ЭтоГруппа
          |    И Номенклатура.Родитель В(&ГруппаРодителей)";
   
   //    В цикле формируем список групп НИЖНЕГО УРОВНЯ, подлежащих фильтрации
   Пока Истина Цикл
       
       Запрос.УстановитьПараметр( "ГруппаРодителей", СписокГруппНижнегоУровня);
       ВыборкаГруппНижнегоУровня = Запрос.Выполнить().Выбрать();
       
       Если ВыборкаГруппНижнегоУровня.Количество() = 0 Тогда
           Прервать;
       КонецЕсли;
       
       СписокГруппНижнегоУровня.Очистить();
       ДобавленыГруппыВСписокФильтрации = Ложь;
       Пока ВыборкаГруппНижнегоУровня.Следующий() Цикл

           Если СписокГруппФильтрацииНоменклатуры.НайтиПоЗначению(ВыборкаГруппНижнегоУровня.Ссылка) = Неопределено Тогда
               СписокГруппФильтрацииНоменклатуры.Добавить(ВыборкаГруппНижнегоУровня.Ссылка);
               ДобавленыГруппыВСписокФильтрации = Истина;
           КонецЕсли;
           
           Если СписокГруппНижнегоУровня.НайтиПоЗначению(ВыборкаГруппНижнегоУровня.Ссылка) = Неопределено Тогда
               СписокГруппНижнегоУровня.Добавить(ВыборкаГруппНижнегоУровня.Ссылка);
           КонецЕсли;
           
       КонецЦикла;
           
       Если НЕ ДобавленыГруппыВСписокФильтрации Тогда
           Прервать;
       КонецЕсли;
       
       ПараметрыСеанса.РасширенныйФильтрПоНоменклатуре = Новый ФиксированныйМассив ( СписокГруппФильтрацииНоменклатуры.ВыгрузитьЗначения());
       ПараметрыСеанса.ПустойФильтрПоНоменклатуре        = Новый ФиксированныйМассив ( СписокГруппФильтрацииНоменклатуры.ВыгрузитьЗначения());
       
   КонецЦикла;
   
   ПустойМассив = Новый Массив();
   ПараметрыСеанса.ПустойФильтрПоНоменклатуре = Новый ФиксированныйМассив (ПустойМассив);
   
КонецПроцедуры        //    НазначитьПараметрыСеанса
1 ТелепатБот
 
гуру
14.01.08
15:56
2 IronDemon
 
14.01.08
16:02
А при добавлении/переносе заново формировать РасширенныйФильтрПоНоменклатуре?
3 ignorant
 
14.01.08
16:13
что значит "Формировать"?
Это переменные сеанса. Формируются при КАЖДОМ входе пользователя
4 Гений 1С
 
гуру
14.01.08
16:13
(2) Ну видимо это происходит не так уж и часто. ;-) При запуске системы формируется этот список, как я понял! Перезайти и увидишь.

Но лучше бы просто считать число видимых элементов в группе и если оно равно нулю, тогда и группу не показывать. ;-)
5 IronDemon
 
14.01.08
16:16
(3) В центре добавили новый товар для филиала. Юзвери не увидят пока не перазайдут, так?
6 ignorant
 
14.01.08
16:18
в предложенной реализации фильтр - группы справочника, поэлементно не фильтруем.
7 ignorant
 
14.01.08
16:23
(5) если товар довавлен в "разрешенную" группу, то перезоходить юзерам не надо.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс