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

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

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

Способ 1. Использование реквизита формы типа "СписокЗначений"

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

  1. Создание реквизита формы: В редакторе формы добавим новый реквизит и укажем для него тип СписокЗначений.
  2. Настройка типа элементов списка: Выделим созданный реквизит и в окне свойств найдем параметр Тип значения элементов. Укажем значение СправочникСсылка.Номенклатура.

    Важно: Обратите особое внимание на выбор именно ссылочного типа (СправочникСсылка), а не объектного (СправочникОбъект). Если выбрать объектный тип, платформа не позволит интерактивно выбирать элементы и группы из справочника в окне редактирования списка.

  3. Размещение на форме: Перетащим реквизит в дерево элементов формы. Платформа создаст элемент с типом Поле формы (поле ввода).
  4. Ограничение выбора только группами: В свойствах созданного элемента формы найдем параметр Выбор групп и элементов и установим для него значение Группы (или Группы и элементы, если требуется разрешить выбор отдельных позиций).

Для дополнительного ограничения отображаемых данных в окне выбора можно настроить параметр Параметры выбора элемента формы, добавив отбор с именем Отбор.ЭтоГруппа и значением Истина.

Способ 2. Программный выбор из списка значений через события

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

Рассмотрим пример обработки события НачалоВыбора у элемента формы:


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

&НаКлиенте
Процедура ПослеВыбораГруппыЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Обработка выбранного значения
        Объект.ВыбраннаяГруппа = ВыбранныйЭлемент.Значение;
    КонецЕсли;
    
КонецПроцедуры

Для предоставления пользователю возможности выбора нескольких галочек из заранее сформированного списка можно использовать встроенный метод ПоказатьОтметкуЭлементов или ПоказатьРедактированиеСпискаЗначений.

Важные особенности и рекомендации по работе с группами

При работе со списками значений, содержащими группы справочников, необходимо учитывать следующие технические нюансы:

  1. Использование в запросах: Когда выбранные группы передаются в запрос для фильтрации элементов, обязательно используйте оператор В ИЕРАРХИИ (&СписокГрупп), а не обычный оператор В (&СписокГрупп). Обычное сравнение вернет совпадение только с самой папкой, но не с элементами внутри нее.
  2. Производительность: Данные реквизита формы типа СписокЗначений полностью передаются между клиентом и сервером при каждом вызове. Не рекомендуется хранить в таком реквизите тысячи элементов.
  3. Сохранение данных: Реквизит формы не сохраняется автоматически в базе данных. Для сохранения сделанного выбора значения из списка необходимо переносить в табличную часть объекта или сериализовать (например, в ХранилищеЗначения).
← На главную