Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

v8: Использование RLS для отборов в динамических списках

Часто возникает необходимость установить сложные отборы на динамические списки Документов, Справочников. В данной стать описан механизм с помощью которого можно устанавливать отборы используя ограничения доступа на уровне данных (Record Level Security)Автор статьи: Neco | Редакторы: Asirius
Последняя редакция №2 от 25.08.08 | История
URL: http://kb.mista.ru/article.php?id=524

Ключевые слова: ограничения доступа, RLS, отбор


Поставим перед собой наиболее простую задачу. Убрать из динамического списка документы для запрещенных контрагентов.
За основу взята конфигурация "Примеры ИТС" для 8.1. В конфигурацию добавлены следующие объекты:
- Регистр сведений "Запрещенные контрагенты" - содержит измерение "Контрагент"
- Параметр сеанса "СкрытьЗапрещенныхКонтрагентов" - тип булево
- Роль "Пользователь"
Для права на чтение у роли "Пользователь" для документа "Приходная накладная" прописываем следующий запрос:
ПриходнаяНакладная ГДЕ ((НЕ &СкрытьЗапрещенныхКонтрагентов)
  ИЛИ (НЕ ПриходнаяНакладная.Контрагент В
   (ВЫБРАТЬ
     ЗапрещенныеКонтрагенты.Контрагент
       ИЗ
     РегистрСведений.ЗапрещенныеКонтрагенты КАК ЗапрещенныеКонтрагенты)))

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


Далее при работе в режиме предприятия мы заполним регистр сведений "ЗапрещенныеКонтрагенты" теми контрагентами документы которых хотели бы скрыть в списке. В самом списке при установке "СкрытьЗапрещенныхКонтрагентов" будет произведен отбор только документов, контрагенты которых не присуствуют в регистре "ЗапрещенныеКонтрагенты".

Нужно заметить, что использование таких RLS это пожалуй единственный способ "легального" отбора в динамических списках без использования промежуточных запросов и выгрузки в таблицу значений.
Но у способа описанного выше есть минусы. Самый явственный пожалуй, это не гибкость устанавливаемых условий. Было бы замечательно если можно внедрять любые произвольные запросы на стадии получения данных из динамических списков, да и вообще любых данных. Следующее ограничение, это невозможность использования в условиях виртуальных таблиц. Т.е. если мы перед собой поставим задачу отобрать всех контрагентов-должников, долги которых фиксируются в регистре накоплений, то написать запрос RLS к таблице остатков этого регистра мы не сможем.
И еще одно ограничение, которое может быть, впрочем, и большим плюсом, это то, что установленные права распространяются не только на список документов, но также и на другие объекты конфигурации, которые получают данные по этим документам.

Демо конфигурация с примером ограничения прав доступа:
http://proba1c.narod.ru/downloads/1Cv8_ITS.dt

От Asirius:
Если очень надо (не взирая на падение производительности), то виртуальную таблицу можно эмулировать. В моем случае СрезПоследних для выглядел так:


ВЫБРАТЬ
    СведенияОбОбъектах.Объект
ИЗ
    (ВЫБРАТЬ
        МАКСИМУМ(СведенияОбОбъектах.Период) КАК Период,
        СведенияОбОбъектах.Объект КАК Объект,
    ИЗ
        РегистрСведений.СведенияОбОбъектах КАК СведенияОбОбъектах
    ГДЕ
        СведенияОбОбъектах.Период <= &ДатаОтбора
    
    СГРУППИРОВАТЬ ПО
        СведенияОбОбъектах.Объект) КАК СведенияСрезПоследних
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОбОбъектах КАК СведенияОбОбъектах
        ПО СведенияСрезПоследних.Период = СведенияОбОбъектах.Период
            И СведенияСрезПоследних.Объект = СведенияОбОбъектах.Объект
ГДЕ
        СведенияОбОбъектах.ЗначениеОбъекта = &ЗначениеОтбора

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика