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