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