При разработке интерфейсов на управляемых формах в 1С:Предприятии 8.3 журналы документов и списки отображаются с помощью специального объекта — Динамического списка. Попытка выполнить классический запрос в обработчике события формы и загрузить результат вручную не подходит для динамических списков. Разберем по шагам, как правильно настроить отбор данных и почему интерфейсный фильтр не заменяет полноценную защиту данных.
Рассмотрим стандартный способ программного наложения отбора. В управляемых формах данные динамического списка формируются на сервере. Поэтому установку условий необходимо выполнять в серверном обработчике ПриСозданииНаСервере, а не в клиентском ПриОткрытии. Это позволяет избежать лишних серверных вызовов и гарантирует, что первая порция данных будет прочитана сразу с нужными условиями.
Чтобы пользователь не мог случайно или намеренно отключить программный отбор через стандартное меню «Настроить список», условие следует добавлять в коллекцию ФиксированныеНастройки:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем элемент отбора из фиксированных настроек
ЭлементОтбора = Список.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = НужныйКонтрагент;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
Проанализируем преимущества использования ФиксированныеНастройки:
Если для динамического списка включен флаг Произвольный запрос, мы можем жестко зафиксировать условие непосредственно в тексте запроса в секции ГДЕ, передав значение через параметр.
Посмотрим на пример установки значения параметра в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Установка параметра произвольного запроса динамического списка
Список.Параметры.УстановитьЗначениеПараметра("ТекущийКонтрагент", НужныйКонтрагент);
КонецПроцедуры
В тексте запроса динамического списка условие будет выглядеть следующим образом:
ВЫБРАТЬ
Журнал.Ссылка КАК Ссылка,
Журнал.Дата КАК Дата,
Журнал.Номер КАК Номер,
Журнал.Контрагент КАК Контрагент
ИЗ
ЖурналДокументов.Продажи КАК Журнал
ГДЕ
Журнал.Контрагент = &ТекущийКонтрагент
Часто перед разработчиком ставится задача ограничить видимость документов в зависимости от роли или прав текущего пользователя. Важно понимать, что любой отбор на форме не является средством защиты данных.
Выясним причину, почему интерфейсный фильтр не защищает информацию:
Для надежного разграничения доступа на уровне строк необходимо настроить RLS (Record Level Security). Рассмотрим ключевые особенности RLS для журналов документов:
ПараметрыСеанса), заполняемые при старте сеанса, чтобы исключить тяжелые вычисления прав при каждом запросе списка.