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

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

При разработке интерфейсов на управляемых формах 1С разработчики часто сталкиваются с необходимостью кастомизировать выпадающий список автоподбора (ввод по строке). Стандартно платформа 1С отображает только реквизит Наименование или Код, либо результат стандартной обработки представления. Однако в реальных прикладных задачах пользователям требуется видеть дополнительные параметры — например, позывной водителя, артикул номенклатуры, адрес контрагента или госномер автомобиля.

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

Разница между получением представления и получением данных выбора

Выясним причину, по которой изменение процедуры ОбработкаПолученияПредставления не меняет состав строк в выпадающем списке подсказок:

  1. ОбработкаПолученияПредставления — вызывается для формирования текстового отображения уже выбранной ссылки в полях формы, в ячейках динамических списков, в отчетах СКД и журналах. Этот метод не управляет логикой динамического поиска и выпадающим окном подсказок при наборе текста.
  2. ОбработкаПолученияДанныхВыбора — специально предназначенный обработчик события модуля менеджера, который перехватывает ввод текста пользователем в поле ввода и формирует коллекцию ДанныеВыбора (объект СписокЗначений), отображаемую в выпадающем меню быстрого подбора.

Реализация через модуль менеджера справочника

Рассмотрим по шагам реализацию задачи на примере справочника «Водители», где требуется выполнять поиск одновременно по наименованию (ФИО) и по дополнительному реквизиту «Позывной», а в выпадающем списке отображать их в виде единой строки.

Откроем модуль менеджера справочника и определим процедуру ОбработкаПолученияДанныхВыбора. Обратите внимание на оптимизацию запроса: чтобы избежать неоптимальных обращений через точку в цикле (dot-walking), все необходимые поля мы выбираем сразу в секции ВЫБРАТЬ и ограничиваем количество выводимых записей конструкцией ПЕРВЫЕ.

Посмотрим на пример корректного кода:


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

Важные технические нюансы и оптимизация

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

  1. Отключение стандартной обработки: Установка СтандартнаяОбработка = Ложь отключает платформенный механизм поиска. Если в свойствах поля на форме были настроены «Связи параметров выбора» или «Параметры выбора», платформа больше не будет накладывать их автоматически — разработчик обязан разобрать структуру Параметры.Отбор и передать условия в запрос вручную.
  2. Ограничение объема выборки: Обязательно используйте ВЫБРАТЬ ПЕРВЫЕ 30-50. Полнотекстовый поиск по шаблону %ПоисковаяСтрока% сканирует таблицу без использования индексов по наименованию. Без ограничения количества строк получение данных на каждый введенный символ приведет к существенным задержкам интерфейса.
  3. Синхронизация с представлением ссылки: После того как пользователь выбрал нужный пункт из списка, в поле ввода отобразится результат работы ОбработкаПолученияПредставления. Для консистентности интерфейса рекомендуется в модуле менеджера переопределить оба метода так, чтобы формат строки в подсказке и формат выбранного значения совпадали.
  4. Визуальное оформление: Так как ДанныеВыбора является объектом СписокЗначений, мы можем дополнительно оформлять элементы, обращаясь к объекту ЭлементСпискаЗначений, например, устанавливать картинку через ЭлементСписка.Картинка или настраивать цвет текста.

Альтернативные варианты реализации

Проанализируем ситуации, когда логику подбора нужно изменить не глобально для всей конфигурации, а только для одного конкретного поля документа или обработки:

  1. Событие поля ввода «АвтоПодбор» на форме: Позволяет на стороне клиента перехватить набранный текст, вызвать серверную функцию и передать сформированный список в параметр обработчика ЭлементыДанныхВыбора. Это избавляет от изменения модуля менеджера объекта.
  2. Событие формы «ОбработкаПолученияДанныхВыбора»: Позволяет централизованно управлять выбором данных в рамках конкретного окна формы.
  3. Использование свойства «РежимВыбораИзСписка»: Если перечень вариантов фиксирован или редко меняется, можно единоразово заполнить свойство СписокВыбора элемента формы, отключив необходимость выполнения динамических серверных запросов на каждый ввод символа.
← На главную