Как в обычных формах 1С открыть форму выбора справочника с отбором по реквизиту

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

При переходе с управляемого интерфейса на обычные формы (1С 8.0, 8.1, а также обычные формы 8.2 и 8.3) разработчики часто сталкиваются с трудностями при открытии форм с отбором. В обычном приложении отсутствует глобальный метод ОткрытьФорму() с передачей структуры параметров, а свойства динамического списка не используются напрямую. Разберем по шагам, как правильно получить форму выбора справочника, наложить нужные отборы и получить выбранное пользователем значение.

Принцип работы с формой выбора в обычном приложении

Проанализируем ключевое отличие механизма обычных форм. В толстом клиенте обычного приложения работа строится через прямое обращение к объекту формы:

  1. Через менеджер справочника получаем объект открываемой формы с помощью метода ПолучитьФормуВыбора() или ПолучитьФорму().
  2. Обращаемся к коллекции отборов основного реквизита формы (по умолчанию это СправочникСписок) через свойство Отбор.
  3. Настраиваем нужные элементы отбора (вид сравнения, значение, флаг активности).
  4. Открываем настроенную форму модально или немодально.

Вариант 1. Модальное открытие формы выбора с установкой отбора

Рассмотрим классический способ с модальным диалогом, когда выполнение текущего программного кода приостанавливается до тех пор, пока пользователь не выберет элемент или не закроет окно.

Посмотрим на пример кода с детальной настройкой свойств элемента отбора:


ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора();

// Настройка отбора через свойства элемента
ЭлементОтбора = ФормаВыбора.Отбор.ВидНоменклатуры;
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение = ВыбранныйВидНоменклатуры;
ЭлементОтбора.Использование = Истина;

// Открытие формы в модальном режиме
ВыбранноеЗначение = ФормаВыбора.ОткрытьМодально();

Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
    // Обработка полученного результата
КонецЕсли;

Разберем более компактную запись. У элементов коллекции отбора есть метод Установить(), который по умолчанию включает отбор с видом сравнения ВидСравнения.Равно:


ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора();
ФормаВыбора.Отбор.ВидНоменклатуры.Установить(ВыбранныйВидНоменклатуры, Истина);

ВыбранноеЗначение = ФормаВыбора.ОткрытьМодально();

Вариант 2. Немодальный выбор в поле ввода (переопределение НачалоВыбора)

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

Посмотрим на пример реализации в модуле формы документа или обработки:


Процедура ПолеВводаНоменклатураНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартное открытие формы без отборов
    СтандартнаяОбработка = Ложь;
    
    // Получаем форму выбора, передавая элемент-владелец
    ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора(, Элемент);
    
    // Устанавливаем требуемый отбор
    ФормаВыбора.Отбор.Услуга.Установить(Ложь, Истина);
    
    // Открываем форму немодально
    ФормаВыбора.Открыть();
    
КонецПроцедуры

В этом случае платформа автоматически вернет выбранное значение в элемент управления Элемент, переданный вторым параметром в метод ПолучитьФормуВыбора().

Вариант 3. Возврат значения в процедуру ОбработкаВыбора формы

Если результат выбора нужно обработать программно без блокировки интерфейса и без привязки к конкретному полю ввода, передадим в качестве владельца саму форму (ЭтаФорма):


Процедура ОткрытьВыборСОтбором()
    
    ФормаВыбора = Справочники.Контрагенты.ПолучитьФормуВыбора(, ЭтаФорма);
    ФормаВыбора.Отбор.Покупатель.Установить(Истина, Истина);
    ФормаВыбора.Открыть();
    
КонецПроцедуры

Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
    
    Если ТипЗнч(ЗначениеВыбора) = Тип("СправочникСсылка.Контрагенты") Тогда
        // Выполняем действия с выбранным контрагентом
    КонецЕсли;
    
КонецПроцедуры

Важные ограничения платформы по отборам в обычных формах

Выясним причину возможных ошибок при установке отбора в списках обычных форм:

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