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