Как в подчиненном справочнике запретить снимать отбор по владельцу в 1С?

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

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

Решение для обычных форм (обычное приложение)

Проанализируем базовый вариант, предложенный на форуме. Для того чтобы запретить пользователю редактировать критерий отбора по владельцу в стандартном диалоговом окне «Отбор и сортировка», обратимся к свойствам табличного поля списка. Разместим в обработчике события ПриОткрытии формы списка следующий код:


Процедура ПриОткрытии()
    ЭлементыФормы.СправочникСписок.НастройкаОтбора.Владелец.Доступность = Ложь;
КонецПроцедуры

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

Важное ограничение: указанная строка отключает изменение отбора только внутри диалогового окна настройки. Пользователь все еще может отключить отбор с помощью кнопки «Отключить отбор» на стандартной командной панели или сбросить его горячими клавишами. Чтобы закрыть эту возможность полностью, выполним следующие действия:

  1. Откроем форму списка подчиненного справочника в конфигураторе.
  2. Найдем командную панель, связанную с табличным полем СправочникСписок.
  3. Снимем у командной панели свойство Автозаполнение.
  4. Вручную добавим только те стандартные действия, которые разрешены пользователю, исключив команды сброса отбора (кнопку «Отключить отбор») или отключив их видимость и доступность программно.

Решение для управляемых форм (управляемое приложение)

В управляемом интерфейсе логика списков построена на объекте ДинамическийСписок и системе компоновки данных. Если мы попытаемся решить задачу в лоб через пользовательские настройки, пользователь всегда сможет вернуть все элементы списка через команду «Настроить список». Рассмотрим надежные варианты блокировки.

1. Использование фиксированных настроек компоновщика:

Наиболее правильный и жесткий способ — поместить условие по владельцу в ФиксированныеНастройки динамического списка. Условия из фиксированных настроек применяются на уровне запроса платформы, не видны в пользовательском окне «Настроить список» и не могут быть сброшены никакими стандартными кнопками.

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


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

2. Управление режимом отображения элемента отбора:

Если отбор все же создается в пользовательских настройках списка, мы можем отключить его редактирование, установив специальный режим отображения. Разберем программную настройку:


ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

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

3. Передача системного отбора при вызове формы:

Если мы открываем форму подчиненного справочника программно из формы владельца, передадим фильтр напрямую в параметрах открытия формы. Платформа распознает ключ Отбор и применит системные ограничения:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", ТекущийВладелец));
ОткрытьФорму("Справочник.ПодчиненныйСправочник.ФормаСписка", ПараметрыФормы, ЭтотОбъект);

Альтернативные способы защиты целостности данных

Выясним причину, почему простой визуальной блокировки отбора в форме списка иногда бывает недостаточно. Пользователь может ввести элемент «чужого» владельца не через форму списка, а с помощью механизма автоподбора (ввод по строке в поле ввода). Для комплексной защиты данных применим дополнительные инструменты платформы:

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