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