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

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

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

Причины поведения динамического списка и платформенные ограничения

Разберем внутреннюю логику работы табличного поля с типом ДокументСписок или ЖурналДокументовСписок:

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

Способ 1. Включение индексирования реквизита и настройка порядка

Если требуется предоставить пользователю возможность сортировать список по колонке (например, по контрагенту) и быстро искать по ней набором текста, выполним следующие шаги в конфигураторе:

  1. Откроем свойства нужного реквизита документа и установим свойство «Индексирование» в значение Индексировать или Индексировать с доп. упорядочиванием (этот вариант добавляет дату документа в индекс для корректного хронологического порядка).
  2. В свойствах формы или при ее открытии разрешим доступность сортировки для этого поля:

ЭлементыФормы.ДокументСписок.НастройкаПорядка.Контрагент.Доступность = Истина;

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

Способ 2. Программное изменение порядка поиска по умолчанию

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


Процедура ПриОткрытии()
    // Устанавливаем сортировку по возрастанию номера
    ДокументСписок.Порядок.Установить("Номер Возр");
КонецПроцедуры

Теперь при открытии списка документов фокус и автопоиск будут по умолчанию привязаны к колонке номера.

Способ 3. Программный поиск через поле ввода и позиционирование курсора

Если реквизит нельзя индексировать (например, из-за высокой нагрузки на запись в базу данных) или требуется искать документ без изменения текущего порядка сортировки, разберем программный вариант реализации:

  1. Разместим на форме отдельное текстовое поле ввода для поиска.
  2. В обработчиках АвтоПодборТекста или ОкончаниеВводаТекста выполним быстрый запрос к базе данных для поиска подходящей ссылки.
  3. Переведем фокус табличного поля на найденный документ через свойство ТекущаяСтрока.

Рассмотрим пример кода обработчика окончания ввода:


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

Альтернативные варианты поиска

Если требуется предоставить расширенные возможности поиска по нескольким полям одновременно, можно рассмотреть следующие подходы:

  1. Стандартный отбор и полнотекстовый поиск: Использование встроенной панели отбора или поля полнотекстового поиска (иконка поиска с биноклем / лупой на командной панели списка). Полнотекстовый поиск позволяет находить вхождения текста по всем реквизитам без переключения сортировки списка.
  2. Замена динамического списка на таблицу значений: Если объем документов в журнале небольшой (например, за короткий рабочий интервал), список можно заполнять через объект ТаблицаЗначений результатом запроса. В статической таблице значений сортировка и мгновенный поиск работают штатно по любым колонкам без требований к индексам в метаданных.
← На главную