Как реализовать быстрый поиск по числовому полю в форме списка 1С

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

В процессе разработки на платформе 1С:Предприятие 8.3 (особенно при работе с обычными формами в толстом клиенте) программисты часто сталкиваются с тем, что стандартный «быстрый поиск» (Jump Search) отлично работает для текстовых полей, таких как «Наименование» или «Артикул», но совершенно игнорирует числовые реквизиты. В этой статье мы подробно разберем, почему так происходит, и рассмотрим эффективные методики решения этой задачи.

Почему поиск по числу не работает «из коробки»

Давайте проанализируем ситуацию. Когда мы начинаем набирать символы, находясь в колонке с типом Строка, платформа ищет совпадение по первым символам. Для типа данных Число логика поиска в СУБД и на уровне платформы принципиально иная. С точки зрения математики, число «28» не является началом числа «284» так, как строка «28» является началом строки «284». Платформа ожидает ввода полного числа для позиционирования или точного совпадения.

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

Метод 1: Создание «теневого» строкового реквизита

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

  1. Добавим в справочник новый реквизит, например, АртикулСтрока.
  2. Установим тип Строка, длину, соответствующую числу, и обязательно включим Индексирование.
  3. В модуле объекта в процедуре ПередЗаписью пропишем программное заполнение этого поля на основе числового значения.

Для корректного преобразования важно убрать разделители групп разрядов (пробелы), чтобы число «1 234» превратилось в строку «1234». Воспользуемся функцией Формат:


Процедура ПередЗаписью(Отказ)
    // Преобразуем число в строку без группировки разрядов
    АртикулСтрока = Формат(АртикулЧисло, "ЧГ=0");
КонецПроцедуры

Теперь в форме списка мы можем вывести именно эту строковую колонку. Поиск по ней будет работать мгновенно, так как платформа будет воспринимать её как обычный текст.

Метод 2: Использование программной обработки ввода текста

Если по каким-то причинам мы не можем изменять структуру базы данных (добавлять новые реквизиты), рассмотрим вариант с программным перехватом поиска. Выясним, как использовать событие ОкончаниеВводаТекста для элемента управления «Поле списка».

Алгоритм действий следующий:

  1. Выделим элемент формы СправочникСписок.
  2. В свойствах найдем событие ОкончаниеВводаТекста.
  3. Установим параметр СтандартнаяОбработка = Ложь и реализуем поиск вручную через НайтиСтроки или позиционирование курсора.

Посмотрим на пример кода, который позволяет активизировать строку при вводе цифр в числовую колонку:


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

Важный нюанс: Этот метод требует нажатия клавиши Enter или потери фокуса для срабатывания, в то время как «прыжок» по списку обычно происходит в реальном времени. В обычных формах полноценно имитировать «прыжок» по мере набора каждого символа для числовой колонки без создания строкового поля крайне сложно.

Метод 3: Вычисляемые колонки при выводе строки

Разберем еще один способ, который не требует изменения структуры таблиц, но может замедлить работу интерфейса. Мы можем добавить в список колонку без данных и заполнять её в событии ПриВыводеСтроки.


Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Записываем текстовое представление числа в ячейку оформления
    ОформлениеСтроки.Ячейки.ТекстовоеПоле.УстановитьТекст(Формат(ДанныеСтроки.ЧисловойРеквизит, "ЧГ=0"));
КонецПроцедуры

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

Сравнение подходов и рекомендации

Проанализируем эффективность предложенных решений:

Резюме: Если для пользователей критически важна скорость работы и возможность искать детали по числовому артикулу так же быстро, как по названию — используйте Метод №1 с добавлением индексированного строкового реквизита. Это стандарт индустрии для высоконагруженных систем на обычных формах.

← На главную