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

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

При работе с динамическими списками в управляемых формах 1С часто возникает необходимость ограничить отображаемые данные. Если ваш список содержит ссылки на документы разных типов (составной тип данных), вы можете отфильтровать их так, чтобы пользователю были доступны, например, только документы Командировка. Давайте разберем два основных подхода к решению этой задачи: статический отбор в запросе и динамический отбор через объект Отбор.

Вариант 1: Использование условия ГДЕ в запросе динамического списка

Этот метод является наиболее производительным. Когда вы добавляете условие непосредственно в текст запроса, база данных отсекает ненужные записи еще на этапе выполнения SQL-запроса к СУБД. Это значит, что лишние данные не передаются на клиент, что значительно экономит ресурсы системы.

Чтобы реализовать такой подход, откройте настройки динамического списка в конфигураторе и в тексте запроса добавьте условие:


ВЫБРАТЬ
    Ссылка,
    Дата,
    Номер
ИЗ
    Документ.ВашСоставнойДокумент КАК Документ
ГДЕ
    Документ.Регистратор ССЫЛКА Документ.Командировка

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

Вариант 2: Программная настройка через объект Отбор

Если вам требуется гибкость — например, чтобы пользователь мог переключаться между отображением разных типов документов или отменять фильтрацию — используйте программное управление свойством Отбор. В этом случае все данные загружаются в список, а фильтрация применяется на уровне системы компоновки данных (СКД).

Реализуем настройку фильтра при открытии формы в обработчике ПриСозданииНаСервере:


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

Разберем, что происходит в этом коде:

  1. Мы обращаемся к коллекции Список.Отбор.Элементы.
  2. Методом Добавить() мы создаем новый объект фильтрации.
  3. В ЛевоеЗначение мы передаем ПолеКомпоновкиДанных, которое соответствует колонке нашего списка.
  4. В ПравоеЗначение мы передаем Тип конкретного документа.
  5. Устанавливаем свойство Использование = Истина, чтобы фильтр применился сразу.

Рекомендации по выбору метода

При выборе метода ориентируйтесь на следующие критерии:

Мы проанализировали основные способы решения задачи. Выбор между «жестким» запросом и «гибким» отбором зависит исключительно от того, планируете ли вы менять состав документов в списке в процессе работы пользователя.

← На главную