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