До старта конференции

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

Программирование - Практика программирования

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

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

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

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

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

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

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

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

См. также

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

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

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


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