Как выполнить иерархический отбор элементов справочника в динамическом списке 1С?

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

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

Для решения этой задачи мы будем использовать встроенную функцию В ИЕРАРХИИ в запросе динамического списка и механизм параметров. Этот подход позволяет гибко управлять отбором, а также предусматривает сценарии, когда отбор должен быть сброшен, и требуется отобразить все элементы справочника.

Реализация иерархического отбора с использованием функции В ИЕРАРХИИ

Для разработки и тестирования запросов к динамическим спискам отлично подойдет управляемая консоль запросов и отчетов.

Основной принцип решения заключается в том, чтобы использовать в запросе динамического списка специальную функцию В ИЕРАРХИИ, которая позволяет выбрать все элементы, входящие в указанный элемент и его подчиненные. Разберем по шагам, как это сделать.

  1. Модификация запроса динамического списка. Для структурной обработки текста запроса можно применить процессор схемы запроса.

    Начнем с изменения текста запроса, который лежит в основе схемы компоновки данных (СКД) вашего динамического списка. Допустим, мы работаем со справочником "Номенклатура". Нам необходимо добавить условие в секцию ГДЕ, которое будет использовать функцию В ИЕРАРХИИ.

    Предположим, у нас есть поле для выбора группы, по которой будет осуществляться отбор. Мы будем передавать выбранное значение в параметр запроса. Назовем этот параметр Родитель. Построить каркас кода для подобных задач поможет консоль кода с ИИ-помощником.

    
    ВЫБРАТЬ
        Номенклатура.Ссылка,
        Номенклатура.Код,
        Номенклатура.Наименование,
        Номенклатура.Родитель,
        Номенклатура.ЭтоГруппа
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        Номенклатура.Ссылка В ИЕРАРХИИ(&Родитель)
    

    В этом запросе &Родитель является параметром, значение которого мы будем устанавливать из формы. Функция В ИЕРАРХИИ(&Родитель) указывает системе выбрать все записи из справочника "Номенклатура", которые иерархически подчинены или являются самим элементом, переданным в параметр &Родитель.

  2. Настройка параметра динамического списка.

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

    • Откройте форму, содержащую динамический список.
    • Выберите динамический список в дереве элементов формы.
    • В окне свойств динамического списка перейдите на вкладку Параметры.
    • Нажмите кнопку "Добавить" и создайте новый параметр с именем Родитель (имя должно точно совпадать с именем параметра в запросе).
    • Установите свойство Доступность для этого параметра в значение Редактирование. Это позволит нам программно изменять значение параметра.
  3. Установка значения параметра из формы.

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

    В обработчике события ПриИзменении этого поля выбора группы мы будем устанавливать значение параметра Родитель для динамического списка.

    
    // Предположим, что поле выбора группы называется "ГруппаОтбора"
    &НаКлиенте
    Процедура ГруппаОтбораПриИзменении(Элемент)
        Если Элемент.Значение <> Неопределено Тогда
            // Если группа выбрана, устанавливаем ее в параметр
            Список.Параметры.УстановитьЗначениеПараметра("Родитель", Элемент.Значение);
        Иначе
            // Если группа не выбрана (поле очищено), сбрасываем отбор
            Список.Параметры.УстановитьЗначениеПараметра("Родитель", Неопределено);
        КонецЕсли;
    КонецПроцедуры
    

    Здесь Список — это имя вашего динамического списка на форме. Метод УстановитьЗначениеПараметра позволяет передать выбранное значение в параметр запроса СКД. После установки параметра динамический список автоматически обновится, отображая элементы согласно новому отбору.

Отображение всех элементов при отсутствии выбранной группы

Возникает логичный вопрос: что делать, если пользователь не выбрал ни одной группы, или хочет видеть все элементы справочника? В текущей реализации, если параметр &Родитель будет Неопределено или пустой ссылкой, запрос с В ИЕРАРХИИ может не вернуть ничего или работать некорректно в зависимости от версии платформы и настроек. Чтобы обеспечить отображение всех элементов при отсутствии выбранной группы, мы можем модифицировать запрос.

  1. Доработка запроса для сброса отбора.

    Для реализации этого поведения нам нужно изменить условие ГДЕ в запросе динамического списка, добавив проверку на пустое значение параметра.

    
    ВЫБРАТЬ
        Номенклатура.Ссылка,
        Номенклатура.Код,
        Номенклатура.Наименование,
        Номенклатура.Родитель,
        Номенклатура.ЭтоГруппа
    ИЗ
        Справочник.Номенклатура КАК Номенклатура
    ГДЕ
        Номенклатура.Ссылка В ИЕРАРХИИ(&Родитель)
        ИЛИ &Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
        ИЛИ &Родитель = Неопределено
    

    Теперь запрос будет работать следующим образом: если в параметр &Родитель передана пустая ссылка или значение Неопределено, условие ИЛИ сработает, и будут выбраны все элементы справочника, игнорируя условие В ИЕРАРХИИ. Если же в параметр передана ссылка на существующую группу, то сработает первое условие, и будет выполнен иерархический отбор.

    Важно отметить, что ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) используется для явного указания пустой ссылки конкретного справочника, что предпочтительнее для сравнения с пустыми ссылками. В более сложных случаях может потребоваться сравнение строки с представлением ссылки в запросе.

  2. Инициализация параметра при открытии формы.

    Чтобы при первом открытии формы (или если отбор еще не был установлен) отображались все элементы, необходимо инициализировать параметр Родитель в Неопределено или ПустаяСсылка. Мы можем сделать это в обработчике события формы ПриСозданииНаСервере или ПриОткрытии.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Инициализируем параметр, если он еще не установлен
        Если Список.Параметры.ПолучитьЗначениеПараметра("Родитель").Значение = Неопределено Тогда
            Список.Параметры.УстановитьЗначениеПараметра("Родитель", Неопределено);
        КонецЕсли;
    
        // Или можно так, если мы хотим явно использовать пустую ссылку
        // Если Список.Параметры.ПолучитьЗначениеПараметра("Родитель").Значение = Неопределено Тогда
        //     Список.Параметры.УстановитьЗначениеПараметра("Родитель", Справочники.Номенклатура.ПустаяСсылка());
        // КонецЕсли;
    КонецПроцедуры
    

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

Важные моменты и дополнительные рекомендации

Таким образом, использование функции В ИЕРАРХИИ в запросе динамического списка в сочетании с параметрами предоставляет мощный и гибкий инструмент для реализации иерархического отбора в 1С:Предприятии. Следуя этим рекомендациям, мы сможем эффективно управлять отображением данных и улучшить пользовательский опыт работы с программой.

← На главную