Как программно установить отбор для динамического списка в управляемой форме 1С 8.3?

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

При работе с платформой 1С:Предприятие 8.3 в режиме управляемого приложения часто возникает необходимость программно управлять содержимым динамических списков на формах. Например, мы хотим, чтобы при открытии формы список автоматически показывал только определенные элементы справочника или документа, соответствующие заданным критериям. В этой статье мы подробно рассмотрим, как правильно и эффективно установить программный отбор для динамического списка в управляемой форме.

Нашей задачей является создание такого механизма отбора, который будет работать корректно, позволит гибко настраивать условия фильтрации и при этом не будет создавать неудобств для пользователя.

Понимание основ динамических списков и их настроек

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

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

Почему прямой подход к отбору динамического списка может не сработать?

Часто разработчики-новички или те, кто только осваивает управляемые формы, пытаются установить отбор, обращаясь непосредственно к свойству Отбор у самого объекта ДинамическийСписок (например, Список.Отбор.Элементы.Добавить(...)). Давайте рассмотрим пример такого подхода, который обычно не приносит желаемого результата:


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

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

Для корректной работы отбора нам необходимо воздействовать на объект НастройкаОтбора, который принадлежит конкретному элементу формы, отображающему динамический список.

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

Для успешной программной установки отбора в динамическом списке управляемой формы, мы должны работать с коллекцией Элементы формы и свойством НастройкаОтбора у конкретного элемента, представляющего наш динамический список. Разберем этот процесс по шагам.

Предположим, у нас есть элемент формы с именем СписокКонтрагентов, который отображает динамический список справочника "Контрагенты", и мы хотим отобрать только контрагентов с определенным кодом.

  1. Получаем доступ к настройкам отбора элемента формы. Мы обращаемся к коллекции Элементы формы по имени нашего динамического списка и затем к его свойству НастройкаОтбора. Это свойство возвращает объект типа НастройкиКомпоновкиДанных, содержащий коллекцию Элементы, куда мы и будем добавлять наши условия отбора.

  2. Добавляем новый элемент отбора. В коллекцию Элементы объекта НастройкаОтбора мы добавляем новый элемент, указывая его тип как Тип("ЭлементОтбораКомпоновкиДанных"). Это будет наше конкретное условие фильтрации.

  3. Задаем левое значение. Свойство ЛевоеЗначение нового элемента отбора определяет поле данных, по которому мы будем производить фильтрацию. Мы создаем новый объект ПолеКомпоновкиДанных и указываем в нем имя поля из источника данных динамического списка. Например, для отбора по коду это будет Новый ПолеКомпоновкиДанных("Код").

  4. Указываем вид сравнения. Свойство ВидСравнения определяет, как будут сравниваться левое и правое значения. Например, ВидСравненияКомпоновкиДанных.Равно для точного совпадения, ВидСравненияКомпоновкиДанных.Больше, ВидСравненияКомпоновкиДанных.Содержит и так далее.

  5. Устанавливаем правое значение. Свойство ПравоеЗначение определяет значение, с которым будет сравниваться ЛевоеЗначение. Это может быть строка, число, дата, ссылка на объект и т.д.

  6. Активируем отбор и при необходимости скрываем его от пользователя. Свойство Использование элемента отбора должно быть установлено в Истина, чтобы отбор применялся. Свойство РежимОтображения позволяет нам управлять видимостью элемента отбора для пользователя. Если мы устанавливаем его в РежимОтображенияЭлементаНастройкиКомпоновкиДанных.НеОтображать, пользователь не увидит этот отбор в окне настроек списка и не сможет его изменить, что часто бывает необходимо для служебных отборов.

Посмотрим на пример кода, который реализует описанный подход:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Получаем доступ к настройкам отбора элемента формы "СписокКонтрагентов"
    НастройкаОтбора = Элементы.СписокКонтрагентов.НастройкаОтбора;

    // Добавляем новый элемент отбора в коллекцию
    ЭлементОтбора = НастройкаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

    // Устанавливаем левое значение - поле "Код" из источника данных списка
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Код");

    // Устанавливаем вид сравнения - "Равно"
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

    // Устанавливаем правое значение - конкретный код контрагента
    ЭлементОтбора.ПравоеЗначение = "00001";

    // Активируем использование этого отбора
    ЭлементОтбора.Использование = Истина;

    // Устанавливаем режим отображения, чтобы пользователь не видел и не мог изменить этот отбор
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.НеОтображать; 
КонецПроцедуры

В этом примере мы используем процедуру ПриСозданииНаСервере, которая выполняется при создании формы на сервере. Это идеальное место для установки начальных отборов, которые должны действовать сразу после открытия формы.

Давайте подробнее остановимся на каждом свойстве ЭлементОтбораКомпоновкиДанных, чтобы глубже понять их назначение:

Расширенные возможности: отбор по списку значений

Часто возникает ситуация, когда нам нужно отобрать элементы динамического списка не по одному конкретному значению, а по нескольким. Например, показать контрагентов с кодами "00001", "00005" и "00010". Для этого мы можем использовать ВидСравненияКомпоновкиДанных.ВСписке, а в качестве ПравоеЗначение передать объект типа СписокЗначений.

Рассмотрим, как это реализовать, а также как можно обновлять существующий отбор, вместо того чтобы каждый раз добавлять новый.


&НаСервере
Процедура УстановитьОтборПоСпискуКодов(СписокКодовДляОтбора)
    // Создаем или получаем список значений для отбора
    // В реальном сценарии СписокКодовДляОтбора может приходить как параметр
    // или формироваться динамически на основе других данных.
    // Для примера создадим его здесь:
    Если СписокКодовДляОтбора = Неопределено Тогда
        СписокКодовДляОтбора = Новый СписокЗначений();
        СписокКодовДляОтбора.Добавить("00001");
        СписокКодовДляОтбора.Добавить("00002");
        СписокКодовДляОтбора.Добавить("00005");
    КонецЕсли;

    НастройкаОтбора = Элементы.СписокКонтрагентов.НастройкаОтбора;

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

    // Если элемент отбора не найден, создаем новый
    Если ЭлементОтбора = Неопределено Тогда
        ЭлементОтбора = НастройкаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Код");
    КонецЕсли;

    // Устанавливаем вид сравнения "ВСписке"
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;

    // В качестве правого значения передаем наш СписокЗначений
    ЭлементОтбора.ПравоеЗначение = СписокКодовДляОтбора;

    // Активируем отбор
    ЭлементОтбора.Использование = Истина;

    // Скрываем отбор от пользователя
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.НеОтображать;
КонецПроцедуры

// Пример вызова этой процедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    УстановитьОтборПоСпискуКодов(Неопределено); // Будет использован список из процедуры
КонецПроцедуры

В этом примере мы демонстрируем несколько важных моментов:

  1. Использование СписокЗначений: Объект СписокЗначений идеально подходит для передачи множественных значений в ПравоеЗначение при использовании видов сравнения ВСписке или НеВСписке.

  2. Поиск существующего отбора: Метод Найти() коллекции Элементы позволяет нам проверить, существует ли уже отбор по заданному полю ("Код" в данном случае), и либо обновить его, либо создать новый. Это предотвращает создание дублирующих элементов отбора, что может привести к непредсказуемому поведению или лишним элементам в настройках списка.

Этот подход делает код более гибким и позволяет легко менять критерии отбора без перезаписи всей структуры.

Где размещать код для установки отбора

Выбор места размещения кода для установки отбора зависит от конкретной логики работы вашей формы:

Важные рекомендации и подводные камни

Заключение

Мы подробно рассмотрели процесс программной установки отбора для динамического списка в управляемой форме 1С 8.3. Мы выяснили, что ключ к успеху лежит во взаимодействии с элементом формы и его свойством НастройкаОтбора, а не с самим объектом ДинамическийСписок напрямую. Мы изучили примеры кода для установки одиночного отбора и отбора по списку значений, а также обсудили, где лучше размещать такой код и какие особенности следует учитывать.

Применяя эти знания и примеры кода, вы сможете эффективно управлять данными, отображаемыми в динамических списках ваших управляемых форм, делая интерфейс более функциональным и адаптированным под нужды пользователей.

← На главную