Как изменить представление справочника в окне быстрого поиска 1С

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

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

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

Почему не работают стандартные обработчики представления

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

Логика платформы здесь заключается в следующем: пользователю в момент выбора необходимо наглядно видеть, по какому именно совпадению найден элемент (наименование, артикул, код или полнотекстовый индекс). Формат «Наименование (Код)» задается платформой автоматически, исходя из состава реквизитов, включенных в свойство справочника Ввод по строке.

Решение 1. Глобальное переопределение через модуль менеджера

Рассмотрим основной способ программного управления подсказками. За формирование выпадающего списка поиска отвечает событие ОбработкаПолученияДанныхВыбора в модуле менеджера справочника (либо аналогичная подписка на событие).

Разберем алгоритм переопределения по шагам:

  1. Открываем модуль менеджера нужного справочника.
  2. Создаем экспортную процедуру ОбработкаПолученияДанныхВыбора.
  3. Устанавливаем параметр СтандартнаяОбработка = Ложь.
  4. Формируем список значений ДанныеВыбора, где в качестве значения передаем ссылку на элемент, а в качестве представления — необходимую строку.

Посмотрим на пример базовой реализации:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) Экспорт

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

КонецПроцедуры

Решение 2. Модификация стандартной выдачи без написания запроса

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

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

Посмотрим на пример безопасного использования:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) Экспорт

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

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

КонецПроцедуры

Решение 3. Локальное переопределение в конкретной форме

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

Для этого задействуем события поля ввода:

  1. АвтоПодбор — срабатывает в процессе набора текста пользователем. В обработчике сбрасываем СтандартнаяОбработка = Ложь и формируем коллекцию ДанныеВыбора нужными значениями.
  2. ОкончаниеВводаТекста — вызывается после завершения ввода текста (например, при нажатии клавиши Enter), если пользователь не выбрал элемент из выпадающего списка вручную.

Важные нюансы и ограничения

При реализации собственного механизма выбора обязательно учитываем следующие технические моменты:

  1. Ограничение выборки: стандартный список выбора в 1С ограничен (как правило, до 50 записей). При формировании собственного запроса всегда используем конструкцию ВЫБРАТЬ ПЕРВЫЕ..., иначе при поиске по распространенным символам запрос к большой таблице приведет к заметным зависаниям интерфейса.
  2. Учет отборов: в структуре Параметры.Отбор передаются системные фильтры, установленные в форме (связи параметров выбора, отбор по владельцу и т. д.). При выполнении прямого запроса эти условия необходимо программно переносить в условие ГДЕ, чтобы не нарушать бизнес-логику ограничений.
  3. Свойство «Ввод по строке»: если цель состоит лишь в том, чтобы убрать код в скобках, проверьте свойства справочника в конфигураторе. Удаление реквизита Код из свойства Ввод по строке уберет скобки, однако сделает невозможным поиск элемента по точному значению кода.
← На главную