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