|
способ "красиво" спрятать часть справочника ч-з RLS. | ☑ | ||
---|---|---|---|---|
0
ignorant
14.01.08
✎
15:56
|
Иногда возникает потребность скрыть от пользователей некоторую часть справочника.
Использование отбора с условием ВСпискеПоИерархии перед открытием формы списка не позволяет это сделать достаточно красиво: видна иерархическая структура справочника с "лишними" группами. Удалось решить проблему, используя RLS. В качестве примера рассмотрим справ. Номенклатура Потребовалось: 1. 3 параметра сеанса ИспользоватьФильтрациюНоменклатуры - булево, флажок использования фильтрации РасширенныйФильтрПоНоменклатуре - ФиксированныйМассив - список групп номенклатуры, подлежащих визуализации ПустойФильтрПоНоменклатуре - ФиксированныйМассив - пустой список групп номенклатуры для служебных целей 2. В роли пользователя для права Чтение справ. Номенклатура для поля Ссылка ограничиваем доступ условием: Номенклатура ГДЕ ВЫБОР КОГДА &ИспользоватьФильтрациюНоменклатуры И Номенклатура.ЭтоГруппа ТОГДА Номенклатура.Ссылка В (&РасширенныйФильтрПоНоменклатуре) ИЛИ Номенклатура.Родитель В (&ПустойФильтрПоНоменклатуре) ИНАЧЕ ИСТИНА КОНЕЦ 3. Для храненения списка групп, с которыми разрешено работать пользователям филиала в нашей конфигурации создана ТЧ НоменклатураФилиала в плане обмена Филиалы - т. сказать, "местные" условия ;) 4. В МодулеПриложения вот таким извращенным способом определяем значения ПараметровСеанса Процедура НазначитьПараметрыСеанса () ПараметрыСеанса.ИспользоватьФильтрациюНоменклатуры = Ложь; ГлавныйУзел = ПланыОбмена.ГлавныйУзел(); Если ГлавныйУзел = Неопределено Тогда ПараметрыСеанса.ГлавныйУзелРИБ = Истина; //Возврат; Иначе ГлавныйУзелРИБ = Ложь; КонецЕсли; // Для подчиненного узла РИБ анализируем наличие фильтра по номенклатуре Если ПланыОбмена.Филиалы.ЭтотУзел().НоменклатураФилиала.Количество() = 0 Тогда Возврат; Иначе ПараметрыСеанса.ИспользоватьФильтрациюНоменклатуры = Истина; МассивГруппФильтрации = ПланыОбмена.Филиалы.ЭтотУзел().НоменклатураФилиала.ВыгрузитьКолонку("Номенклатура"); ПараметрыСеанса.РасширенныйФильтрПоНоменклатуре = Новый ФиксированныйМассив ( МассивГруппФильтрации); ПараметрыСеанса.ПустойФильтрПоНоменклатуре = Новый ФиксированныйМассив ( МассивГруппФильтрации); СписокГруппФильтрацииНоменклатуры = Новый СписокЗначений; СписокГруппФильтрацииНоменклатуры.ЗагрузитьЗначения(МассивГруппФильтрации); СписокГруппНижнегоУровня = Новый СписокЗначений; СписокГруппНижнегоУровня.ЗагрузитьЗначения(МассивГруппФильтрации); КонецЕсли; // В цикле формируем список групп ВЕРХНЕГО УРОВНЯ, подлежащих фильтрации Пока Истина Цикл ДобавленыГруппыВСписокФильтрации = Ложь; Для Каждого Элемент ИЗ МассивГруппФильтрации Цикл Если Элемент.Родитель.Пустая() Тогда Продолжить; ИначеЕсли СписокГруппФильтрацииНоменклатуры.НайтиПоЗначению(Элемент.Родитель) = Неопределено Тогда СписокГруппФильтрацииНоменклатуры.Добавить(Элемент.Родитель); ДобавленыГруппыВСписокФильтрации = Истина; КонецЕсли; КонецЦикла; Если НЕ ДобавленыГруппыВСписокФильтрации Тогда Прервать; КонецЕсли; ПараметрыСеанса.РасширенныйФильтрПоНоменклатуре = Новый ФиксированныйМассив ( СписокГруппФильтрацииНоменклатуры.ВыгрузитьЗначения()); КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа | И Номенклатура.Родитель В(&ГруппаРодителей)"; // В цикле формируем список групп НИЖНЕГО УРОВНЯ, подлежащих фильтрации Пока Истина Цикл Запрос.УстановитьПараметр( "ГруппаРодителей", СписокГруппНижнегоУровня); ВыборкаГруппНижнегоУровня = Запрос.Выполнить().Выбрать(); Если ВыборкаГруппНижнегоУровня.Количество() = 0 Тогда Прервать; КонецЕсли; СписокГруппНижнегоУровня.Очистить(); ДобавленыГруппыВСписокФильтрации = Ложь; Пока ВыборкаГруппНижнегоУровня.Следующий() Цикл Если СписокГруппФильтрацииНоменклатуры.НайтиПоЗначению(ВыборкаГруппНижнегоУровня.Ссылка) = Неопределено Тогда СписокГруппФильтрацииНоменклатуры.Добавить(ВыборкаГруппНижнегоУровня.Ссылка); ДобавленыГруппыВСписокФильтрации = Истина; КонецЕсли; Если СписокГруппНижнегоУровня.НайтиПоЗначению(ВыборкаГруппНижнегоУровня.Ссылка) = Неопределено Тогда СписокГруппНижнегоУровня.Добавить(ВыборкаГруппНижнегоУровня.Ссылка); КонецЕсли; КонецЦикла; Если НЕ ДобавленыГруппыВСписокФильтрации Тогда Прервать; КонецЕсли; ПараметрыСеанса.РасширенныйФильтрПоНоменклатуре = Новый ФиксированныйМассив ( СписокГруппФильтрацииНоменклатуры.ВыгрузитьЗначения()); ПараметрыСеанса.ПустойФильтрПоНоменклатуре = Новый ФиксированныйМассив ( СписокГруппФильтрацииНоменклатуры.ВыгрузитьЗначения()); КонецЦикла; ПустойМассив = Новый Массив(); ПараметрыСеанса.ПустойФильтрПоНоменклатуре = Новый ФиксированныйМассив (ПустойМассив); КонецПроцедуры // НазначитьПараметрыСеанса |
|||
1
ТелепатБот
гуру
14.01.08
✎
15:56
|
Книга знаний: УРБД на v8 за четыре шага.
Книга знаний: Пустые ссылки Книга знаний: Права пользователей в 1С:Предприятии 8.0 Книга знаний: Элегантная реализация прав доступа в 1С 80 Книга знаний: Размещение колонки с остатками в списке справочника Книга знаний: 1C 8.0. Задача отбора групп в форме списка справочников |
|||
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) если товар довавлен в "разрешенную" группу, то перезоходить юзерам не надо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |