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

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

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

Ограничения стандартного списка значений и их решение

При попытке пользователя выбрать группу в стандартный список значений (СЗ) на управляемой форме платформа по умолчанию блокирует это действие, выдавая системное сообщение: «Выберите элемент, а не группу!». Это ограничение связано с настройками элементов управления формой по умолчанию.

Кроме того, есть визуальное ограничение: список значений на форме всегда отображается в виде плоского списка (даже если он выведен в формате таблицы с кнопками «Добавить» и «Подбор»). Если пользователь добавит туда папку, он не сможет развернуть или свернуть её прямо внутри этого списка, чтобы посмотреть состав.

Посмотрим, как снять эти базовые ограничения, если вы все же решили использовать именно реквизит с типом «Список значений»:

  1. Откройте свойства элемента формы (это может быть колонка таблицы или поле ввода, связанное с вашим списком значений).
  2. Найдите свойство Выбор групп и элементов.
  3. Принудительно установите для него значение Группы и элементы.
  4. Убедитесь, что сам реквизит имеет строго заданный тип данных (например, СправочникСсылка.Номенклатура), который поддерживает иерархию. Если тип будет составным или неопределенным, корректная работа свойства не гарантируется.

Особенности передачи смешанного списка в запрос

Проанализируем ситуацию: мы собрали список, в котором есть как конкретные элементы, так и группы. Если передать его в запрос стандартным образом (через оператор В), запрос отработает только по прямым ссылкам и не развернет содержимое выбранных папок.

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


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

Альтернатива 1: Использование пользовательского отбора (СКД)

Вместо того чтобы «колхозить» собственные списки с ручными кнопками «Добавить» и «Удалить», гораздо эффективнее использовать штатный механизм платформы. Разместим на форме поле компоновщика (объект ОтборКомпоновкиДанных).

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

Альтернатива 2: Таблица значений или Дерево значений

Список значений — это по сути одна строка на форме (даже если она раскрывается в табличку). Когда пользователю необходимо добавить 100 и более объектов, а затем анализировать их, стандартный список становится крайне неудобным: в нем затруднен поиск и нет полноценной работы с горячими клавишами (Shift, Ctrl).

В таких случаях эталонным решением для одноразовой или сервисной обработки становится:

  1. Таблица значений. В ней всё видно, удобно реализован поиск и массовое выделение строк. Для реализации достаточно добавить на форму реквизит с типом ТаблицаЗначений с одной колонкой нужного типа ссылок.
  2. Дерево значений. Если бизнес-требование предполагает, что пользователю нужно визуально выстраивать иерархию (например, создавать виртуальные папки на форме и перетаскивать туда элементы), лучше использовать реквизит с типом ДеревоЗначений.

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

← На главную