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