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