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