gifts2017

Организация быстрого подбора

Опубликовал Дмитрий (DeAmon2K) в раздел Программирование - Практика программирования

Организация быстрого подбора, что бы отфильтрованные позиции справочника "вылетали" по нажатии символов, причём не важно, в каком позиции начинается слово в названии элемента.

Была поставленна такая задача. Начал думать как бы организовать этакий полнотекстовый поиск по справочнику. Всякие запросы с LIKE-ами отмёл сразу, за неуниверсализм и зависимость от условий. Да и не сможет сделать поиск внутри строки по словам. Хотелось универсального, без компонент и независимо от DBF или SQL.

Идея метода такова: создаём справочник-индекс у в которого будет два поля - уникальное слово и коды элементов. Пишем обработку которая, собирает все уникальные (не цифры и не менее 3 символов) слова в наименованиях справочника элементов и в каких кодах это слово встречается. Коды перечисляются через запятую. Потом делаем непосредственно индекс - индексом будет строка из всех слов, через точку запятой, в той последовательности, как у нас хранится в справочнике-индексе.

При нажатии на кнопку, перехватываем её (например formex.dll) и простой операцией поиска в индексе-строке с разделителем впереди (что бы искалось с начала слова, а ни любое вхождение внутри слов, хотя для нескольких букв можно уже и внутри) ищем позицию, считаем сколько разделителей перед найденной позицией. По количество разделителей - получаем позицию в справочнике-индексе (который кстати можно загрузить в таблицу значений предварительно) - во втором поле которого перечисленны коды элементов справочника в которых есть слово начинающеяся с этой буквы или некоторого количества букв (советую начинать с двух-трёх). Потом обрезаем строку индекс по это слово и исчем дальше вхождения и тут рекурсия. Потом пробегаемся по списку кодов, которые мы собираем и вытаскиваем уже сами элементы. Кстати этот способ можно применять для нескольких слов в поиске ища по словно - можно искать такого типа "сап 42".

Данный способ пробовался на справочнике товаров свыше 12 тысяч позиций. Собирание индекса таблицы, самый долгий процесс - порядка нескольких секунд, его можно делать, по событию изменения наименований или по расписанию. Поиск по индексу происходит достаточно шустро - меньше секунды. Кстати на удивление немного получается в справочнике-индексе строк, по сравнению со справочником источником. Единственно я не решил проблему с перехватом нажатий клавиш с помощью formex.dll. Срабатывает весьма не стабильно. Может кто нибудь предложит другой способ. Предлагаю обработки, но они не рабочие на стандартных конфах, но доточить на любой справочник - не представляется никаких проблем (внутри чистая "математика", названия справочников можно изменить и всё заработает)

Может быть способ кому нибудь пригодится.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Заполнение справочника индекса
.ert 10,00Kb
15.06.10
80
.ert 10,00Kb 80 Бесплатно
Организация поиска
.ert 11,50Kb
15.06.10
32
.ert 11,50Kb 32 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Епрст (Ёпрст) 15.06.10 13:56
Как то всё через одно место и.. медленно.

Вот это решение посмотрите:
http://www.rikcenter.ru/solutions.php

которое сделано на основе
http://www.script-coding.info/svcsvc.html
2. Епрст (Ёпрст) 15.06.10 14:04
+1
Всякие запросы с LIKE-ами отмёл сразу, за неуниверсализм и зависимость от условий


Это вы зря, посмотрите ЭТО универсальное решение для поиска:
http://www.1cpp.ru/forum/YaBB.pl?num=1211491690
3. Сергей (Che) Коцюра (CheBurator) 16.06.10 02:21
5. Александр Орефков (orefkov) 16.06.10 10:45
Судя по описанию, похоже на реализацию полнотекстового поиска средствами 1С.
Ну, может быть, когда-то Сергей Брин с такого же велосипеда начинал...
Хотя, like он как-то проще, да и не встречаются на 1С такие справочники, чтобы like не вытянул объемы перебора.
6. Дмитрий (DeAmon2K) 16.06.10 14:19
Like не сможет найти по началу третьего слова
7. Епрст (Ёпрст) 16.06.10 14:23
(6) Да ну ?? :))0
Like %вася% найдет Васю, где бы он не был в строке (или её части)..
8. Епрст (Ёпрст) 16.06.10 14:25
А у вас 2-ая избыточность.. На поддержание такого справочника нужно как минимум тригер вешать, чтоб в актуальном состоянии всегда был.. да и.. затратно всё это и код ни разу не оптимален..Да и найтиПоКоду - моветон...
9. Дмитрий (DeAmon2K) 17.06.10 12:59
(7) а вот как раз в ЧАСТИ и не надо
(8) НайтиПоКоду моветон? 8-\ а что не моветон?
10. Епрст (Ёпрст) 17.06.10 14:55
(9) Не вопрос, Like % вася% , так устроит ?
11. Алексей Плутенко (Noy) 17.06.10 21:26
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа