В процессе разработки на платформе 1С:Предприятие 8.3 (особенно при работе с обычными формами в толстом клиенте) программисты часто сталкиваются с тем, что стандартный «быстрый поиск» (Jump Search) отлично работает для текстовых полей, таких как «Наименование» или «Артикул», но совершенно игнорирует числовые реквизиты. В этой статье мы подробно разберем, почему так происходит, и рассмотрим эффективные методики решения этой задачи.
Давайте проанализируем ситуацию. Когда мы начинаем набирать символы, находясь в колонке с типом Строка, платформа ищет совпадение по первым символам. Для типа данных Число логика поиска в СУБД и на уровне платформы принципиально иная. С точки зрения математики, число «28» не является началом числа «284» так, как строка «28» является началом строки «284». Платформа ожидает ввода полного числа для позиционирования или точного совпадения.
Кроме того, в обычных формах механизм быстрого поиска жестко привязан к текущей колонке. Если колонка числовая, платформа пытается интерпретировать ввод как числовое значение, что часто приводит к тому, что фокус не перескакивает на нужную строку, даже если искомое значение визуально начинается на введенные цифры.
Проанализируем самый надежный и производительный способ, который используется в крупных типовых конфигурациях (например, УПП). Он заключается в создании дублирующего реквизита с типом Строка. Рассмотрим реализацию пошагово:
АртикулСтрока.Строка, длину, соответствующую числу, и обязательно включим Индексирование.ПередЗаписью пропишем программное заполнение этого поля на основе числового значения.Для корректного преобразования важно убрать разделители групп разрядов (пробелы), чтобы число «1 234» превратилось в строку «1234». Воспользуемся функцией Формат:
Процедура ПередЗаписью(Отказ)
// Преобразуем число в строку без группировки разрядов
АртикулСтрока = Формат(АртикулЧисло, "ЧГ=0");
КонецПроцедуры
Теперь в форме списка мы можем вывести именно эту строковую колонку. Поиск по ней будет работать мгновенно, так как платформа будет воспринимать её как обычный текст.
Если по каким-то причинам мы не можем изменять структуру базы данных (добавлять новые реквизиты), рассмотрим вариант с программным перехватом поиска. Выясним, как использовать событие ОкончаниеВводаТекста для элемента управления «Поле списка».
Алгоритм действий следующий:
СправочникСписок.ОкончаниеВводаТекста.СтандартнаяОбработка = Ложь и реализуем поиск вручную через НайтиСтроки или позиционирование курсора.Посмотрим на пример кода, который позволяет активизировать строку при вводе цифр в числовую колонку:
Процедура СправочникСписокОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Пытаемся найти элемент по числовому значению
ИскомоеЧисло = Число(Текст);
Отбор = Новый Структура("ВашЧисловойРеквизит", ИскомоеЧисло);
ПараметрыВыбора = Новый Структура("Отбор", Отбор);
// Если нужно просто позиционировать курсор:
НайденнаяСсылка = Справочники.ВашСправочник.НайтиПоРеквизиту("ВашЧисловойРеквизит", ИскомоеЧисло);
Если Не НайденнаяСсылка.Пустая() Тогда
ЭлементыФормы.СправочникСписок.ТекущаяСтрока = НайденнаяСсылка;
КонецЕсли;
КонецПроцедуры
Важный нюанс: Этот метод требует нажатия клавиши Enter или потери фокуса для срабатывания, в то время как «прыжок» по списку обычно происходит в реальном времени. В обычных формах полноценно имитировать «прыжок» по мере набора каждого символа для числовой колонки без создания строкового поля крайне сложно.
Разберем еще один способ, который не требует изменения структуры таблиц, но может замедлить работу интерфейса. Мы можем добавить в список колонку без данных и заполнять её в событии ПриВыводеСтроки.
Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Записываем текстовое представление числа в ячейку оформления
ОформлениеСтроки.Ячейки.ТекстовоеПоле.УстановитьТекст(Формат(ДанныеСтроки.ЧисловойРеквизит, "ЧГ=0"));
КонецПроцедуры
Хотя визуально мы видим текст, платформа все равно будет опираться на тип данных связанного реквизита. Чтобы поиск заработал по правилам строк, колонка должна быть связана с данными типа Строка. Поэтому данный метод чаще всего комбинируют с методом №1.
Проанализируем эффективность предложенных решений:
Ctrl + F. В 1С 8.3 полнотекстовый поиск индексирует числа, если они не являются уникальными идентификаторами. Однако это не заменяет привычный пользователям «прыжок» по колонке при наборе символов.Резюме: Если для пользователей критически важна скорость работы и возможность искать детали по числовому артикулу так же быстро, как по названию — используйте Метод №1 с добавлением индексированного строкового реквизита. Это стандарт индустрии для высоконагруженных систем на обычных формах.