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