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