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