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