Как программно установить отбор в журнале документов на управляемых формах 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на управляемых формах в 1С:Предприятии 8.3 журналы документов и списки отображаются с помощью специального объекта — Динамического списка. Попытка выполнить классический запрос в обработчике события формы и загрузить результат вручную не подходит для динамических списков. Разберем по шагам, как правильно настроить отбор данных и почему интерфейсный фильтр не заменяет полноценную защиту данных.

Способ 1. Установка отбора через компоновщик настроек динамического списка

Рассмотрим стандартный способ программного наложения отбора. В управляемых формах данные динамического списка формируются на сервере. Поэтому установку условий необходимо выполнять в серверном обработчике ПриСозданииНаСервере, а не в клиентском ПриОткрытии. Это позволяет избежать лишних серверных вызовов и гарантирует, что первая порция данных будет прочитана сразу с нужными условиями.

Чтобы пользователь не мог случайно или намеренно отключить программный отбор через стандартное меню «Настроить список», условие следует добавлять в коллекцию ФиксированныеНастройки:


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

Проанализируем преимущества использования ФиксированныеНастройки:

  1. Отбор жестко накладывается поверх всех пользовательских настроек.
  2. Элементы фиксированного отбора не видны в стандартном пользовательском диалоге настройки списка, поэтому пользователь не сможет отключить их через интерфейс.

Способ 2. Использование параметров в произвольном запросе динамического списка

Если для динамического списка включен флаг Произвольный запрос, мы можем жестко зафиксировать условие непосредственно в тексте запроса в секции ГДЕ, передав значение через параметр.

Посмотрим на пример установки значения параметра в обработчике ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Установка параметра произвольного запроса динамического списка
    Список.Параметры.УстановитьЗначениеПараметра("ТекущийКонтрагент", НужныйКонтрагент);
    
КонецПроцедуры

В тексте запроса динамического списка условие будет выглядеть следующим образом:


ВЫБРАТЬ
    Журнал.Ссылка КАК Ссылка,
    Журнал.Дата КАК Дата,
    Журнал.Номер КАК Номер,
    Журнал.Контрагент КАК Контрагент
ИЗ
    ЖурналДокументов.Продажи КАК Журнал
ГДЕ
    Журнал.Контрагент = &ТекущийКонтрагент

Интерфейсный отбор и безопасность: почему нужен RLS

Часто перед разработчиком ставится задача ограничить видимость документов в зависимости от роли или прав текущего пользователя. Важно понимать, что любой отбор на форме не является средством защиты данных.

Выясним причину, почему интерфейсный фильтр не защищает информацию:

  1. Пользователь с правами на чтение документов сможет открыть запрещенный документ по прямой навигационной ссылке, через историю просмотров, поиск или буфер обмена.
  2. Документы останутся доступными через связанные отчеты, ввод на основании или функции универсального просмотра данных.
  3. Данные могут быть получены через внешние сервисы и протоколы (OData, REST API), если они опубликованы.

Для надежного разграничения доступа на уровне строк необходимо настроить RLS (Record Level Security). Рассмотрим ключевые особенности RLS для журналов документов:

  1. RLS настраивается на документы: сам объект метаданных «Журнал документов» не хранит таблицы в базе данных и выступает агрегатором. Правила ограничения чтения настраиваются в ролях для каждого отдельного вида документа, входящего в журнал.
  2. Автоматическая фильтрация: при корректно настроенном RLS платформа на уровне СУБД отсекает запрещенные записи, и в журнал попадут только разрешенные строки без необходимости ручной фильтрации в коде формы.
  3. Производительность: для оптимизации работы списков с RLS рекомендуется использовать параметры сеанса (ПараметрыСеанса), заполняемые при старте сеанса, чтобы исключить тяжелые вычисления прав при каждом запросе списка.
← На главную