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