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