Почему не работает поиск по группам при установленном свойстве Выбор групп и элементов?

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

При настройке полей ввода в управляемых формах 1С часто возникает задача предоставить пользователю возможность выбирать не только конечные элементы справочника, но и родительские группы (папки). Для этого в свойствах реквизита формы и самого поля ввода указывается режим Выбор групп и элементов со значением Группы и элементы. Однако на практике разработчики сталкиваются с ситуацией, когда автоподбор при вводе текста продолжает находить только элементы, полностью игнорируя группы, либо показывает группу лишь тогда, когда она уже выбиралась ранее.

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

Причины некорректного поведения автоподбора

Проанализируем механику работы платформы «1С:Предприятие 8.3» при поиске по строке:

  1. Переопределение обработчика в модуле менеджера: В типовых конфигурациях и при заказной разработке ввод по строке часто перехватывается в модуле менеджера справочника процедурой ОбработкаПолученияДанныхВыбора. Если в этой процедуре написан собственный запрос для формирования выпадающего списка, в нем нередко жестко зашито условие ГДЕ НЕ Таблица.ЭтоГруппа либо некорректно проверяется системное перечисление ИспользованиеГруппИЭлементов. В результате стандартный механизм отбора платформы подменяется кастомным запросом, отсекающим папки.
  2. Механизм «История выбора при вводе»: Если группа всё же появляется в подсказках, но только после того, как была выбрана вручную через форму выбора, это результат работы платформенной истории выбора. Платформа добавляет недавно выбранные значения в начало списка подсказок вне зависимости от условий запроса в модуле менеджера.

Способ 1. Корректировка процедуры ОбработкаПолученияДанныхВыбора в модуле менеджера

Рассмотрим основной и наиболее правильный способ устранения проблемы. Откроем модуль менеджера нужного справочника и найдем процедуру ОбработкаПолученияДанныхВыбора.

В этой процедуре входящий параметр Параметры.ВыборГруппИЭлементов содержит значение системного перечисления ИспользованиеГруппИЭлементов (варианты: Элементы, Группы, ГруппыИЭлементы). Проверим, как формируется условие по признаку иерархии в тексте запроса.

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


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Запрос = Новый Запрос;
    ТекстЗапроса = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |	Спр.Ссылка КАК Ссылка,
        |	Спр.Наименование КАК Наименование
        |ИЗ
        |	Справочник.Контрагенты КАК Спр
        |ГДЕ
        |	Спр.Наименование ПОДОБНО &СтрокаПоиска";
    
    // Проверяем параметр ВыборГруппИЭлементов
    Если Параметры.Свойство("ВыборГруппИЭлементов") Тогда
        Если Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы Тогда
            ТекстЗапроса = ТекстЗапроса + " И НЕ Спр.ЭтоГруппа";
        ИначеЕсли Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы Тогда
            ТекстЗапроса = ТекстЗапроса + " И Спр.ЭтоГруппа";
        // При ИспользованиеГруппИЭлементов.ГруппыИЭлементы дополнительный фильтр не накладываем
        КонецЕсли;
    КонецЕсли;
    
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%");
    
    ДанныеВыбора = Новый СписокЗначений;
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование);
    КонецЦикла;
    
КонецПроцедуры

Если для данного справочника вовсе не требуется нестандартный поиск, достаточно вернуть стандартное поведение платформы, указав СтандартнаяОбработка = Истина; и убрав переопределение списка ДанныеВыбора.

Способ 2. Проверка настроек реквизита и элемента формы

Разберем по шагам свойства, которые необходимо проверить в конфигураторе на стороне управляемой формы:

  1. Выделим реквизит формы и в палитре свойств найдем Выбор групп и элементов. Установим значение Группы и элементы.
  2. Выделим элемент формы (поле ввода) и проверим аналогичное свойство Выбор групп и элементов — значение должно быть унаследовано или явно задано как Группы и элементы.
  3. Проверим свойство поля РежимВыбораИзФормы: если флаг установлен, платформа при попытке ввода может сразу открывать диалог выбора вместо выпадающего списка быстрого поиска.

Способ 3. Переопределение события АвтоПодбор на форме

Если справочник является типовым и менять его модуль менеджера нежелательно, логику формирования выпадающего списка можно переопределить локально для конкретного поля формы.

Создадим обработчик события АвтоПодбор у поля ввода на клиенте и сформируем список выбора с помощью серверной функции:


&НаКлиенте
Процедура КонтрагентАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
    
    Если Ожидание Тогда
        Возврат;
    КонецЕсли;
    
    СтандартнаяОбработка = Ложь;
    ДанныеВыбора = ПолучитьДанныеВыбораНаСервере(Текст);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДанныеВыбораНаСервере(ТекстПоиска)
    
    Список = Новый СписокЗначений;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 20
        |	Спр.Ссылка КАК Ссылка,
        |	Спр.Наименование КАК Представление
        |ИЗ
        |	Справочник.Контрагенты КАК Спр
        |ГДЕ
        |	Спр.Наименование ПОДОБНО &Текст";
    Запрос.УстановитьПараметр("Текст", "%" + ТекстПоиска + "%");
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Список.Добавить(Выборка.Ссылка, Выборка.Представление);
    КонецЦикла;
    
    Возврат Список;
    
КонецФункции

Важные нюансы платформы

При настройке поиска обратим внимание на следующие особенности:

  1. Поля ввода по строке: При стандартной обработке поиск выполняется только по реквизитам, включенным в свойство метаданных справочника Поля ввода по строке (как правило, это Код и Наименование). Если у групп эти реквизиты не заполнены, группа не появится в подсказках.
  2. Тип иерархии: Убедимся, что у справочника в метаданных задана Иерархия групп и элементов. Если установлена «Иерархия элементов», папок в справочнике нет, а все узлы дерева считаются обычными элементами.
← На главную