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

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

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

Подготовка механизма множественного выбора

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

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


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

Обработка результатов выбора

После того как пользователь выберет несколько элементов в открывшейся форме и нажмет кнопку «Выбрать», управление вернется в указанный нами метод оповещения. Параметр Результат в этой процедуре будет содержать массив выбранных элементов справочника. Это дает нам полный контроль над тем, как именно мы обработаем полученные данные.


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

Решение проблем с событием ПриИзменении

При реализации множественного выбора часто возникает конфликт с событием ПриИзменении, которое может срабатывать автоматически при заполнении реквизита. Если ваш реквизит используется в качестве параметра отбора для динамического списка или системы компоновки данных (СКД), важно учитывать следующие нюансы:

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

Рекомендации по улучшению UX

Для повышения удобства работы пользователей при работе с множественным выбором, мы рекомендуем следующие практики:

Используя предложенный подход с параметром МножественныйВыбор и механизмом ОписаниеОповещения, вы сможете гибко управлять процессом выбора данных и обеспечить комфортную работу пользователей с любыми справочниками системы — для ускорения разработки подобных интерфейсов используйте инструментарий разработчика для тестирования кода и СКД.

← На главную