Быстрый умный поиск с выпадающим списком

04.08.14

Задачи пользователя - Поиск данных

Обработка + консольная утилита (exe). Работает с использованием FormEx.dll (Алексей Фёдоров aka АЛьФ), strmatch (Ракунов Александр aka skorp) и 1sqlite (Александр Орефков).
Выполняет быстрый нечеткий поиск по справочнику (по умолчанию - номенклатуры) с выводом наиболее похожих позиций в выпадающий список.
Работает на 1с 7.7.
Тестировалось на server 2003 в терминалах, в файловой БД.
Предполагаемые достоинства: пример (более) «адекватного» (по меркам автора на данный момент) поведения поисковой строки (реализовано при помощи консольной утилиты, работающей через winapi – исходники прилагаются (писалось в lazarus)) и удобной навигации по списку, во время ввода.
Является, скорее, примером для реализаций собственных адаптированных поисковых решений.

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

Наименование Файл Версия Размер
Все одним файлом + библиотеки
.zip 916,96Kb
32
.zip 916,96Kb 32 Скачать
Обработка + утилита
.zip 72,15Kb
1
.zip 72,15Kb 1 Скачать
Исходники утилиты + она сама
.zip 65,59Kb
1
.zip 0.0.1 65,59Kb 1 Скачать
Необходимые библиотеки отдельным файлом
.zip 650,77Kb
0
.zip 650,77Kb Скачать

Не так давно, общаясь с пользователем, услышал жалобу на то, что новые сотрудники компании совершенно не ориентируются в номенклатуре предприятия (ТиС), что при работе с клиентами «в голос» и справочнике в 10 тыс. позиций – достаточно критично. Да и мне самому частенько приходилось «играть» с поисковой строкой, дабы обнаружить позицию, с которой «что-то не то».

Упоминание библиотеки нечеткого поиска было еще свежо в памяти (strmatch.dll от Александра Ракунова (skorp)) – потому и решил ее опробовать.
Хотелось, чтобы наиболее похожие позиции отображались во время набора (здесь, вероятно, виноват openconf+телепат+intellisence).
Для быстроты заполнения КЭШа strmatch (внутренне хранилище строк с быстрым последовательным доступом) было решено использовать 1sqlite (Александр Орефков), т.к. он уже использовался в системе, а для отслеживания начала/окончания изменения поисковой строки – Formex (Алексей Фёдоров aka АЛьФ), по той же причине.
Нужно сказать, что организовать подобный поиск можно и иными средствами, например: можно не использовать прямые запросы и обойтись strmatch + Formex (либо 1cpp) / не использовать strmatch, а просто искать по вхождениям, используя 1cpp + sqlite/vfpoledb/MSSQL и т.д.

Что делает обработка: при открытии обработки и изменении флага учета неактуальных позиций происходит заполнение/перезаполнение КЭШа strmatch. В качестве хэшей используются id справочника. При начале/продолжении ввода печатных символов с клавиатуры, либо удалении обработка начинает считать паузы между нажатиями на клавиши. При длительности паузы более определенного лимита (н-р 500 мс) запускается консольная утилитка (GetTextFrom1cedit 0.0.1 (Jill)), перехватывающая, через win api содержимое указанного окна и возвращающая текст в текстовый файл. Далее происходит сравнение строк и заполнение/перезаполнение списка похожих строк. Фокус со строки ввода, при этом, не уходит. Для навигации по списку и выбора значения используется перехват нажатий на клавиши (U93;/U95;/enter), при помощи FormEx.

Описание параметров GetTextFrom1cedit:
1 – дескриптор окна (handle) в десятиричном виде (либо «0» - если не известен)
2 – заголовок искомого окна (игнорируется, при наличии хэндла)
3 – номер 1cedit’а
4 – полный путь к текстовому файлу (файл будет создан/перезаписан)

Что делает утилита: при наличии хэндла окна находит дочернее окно класса 1cedit тем, или иным способом, в зависимости от способа вызова обработки (в модальном и не модальном режимах структура дерева дочерних окон 1с различна) и получает текст поля. При отсутствии хэндла (указан 0) ищет окно по наименованию, далее действует аналогичным образом.

Внимание: при поиске по наименованию и множестве одновременно открытых обработок (в т.ч. в нескольких 1с) с одинаковым заголовком возможны ошибки.

Зачем нужно было сочинять какие-то утилитки, если можно просто обойтись активацией поля при ложном закрытии и использовании WScript.Shell + sendkey, или просто, тем же Formex, перехватывать символы: как уже было сказано поведение поля ввода поисковой строки кажется более адекватным. Например: в модальном режиме конструкция с ложным закрытием работать откажется, а при перехвате символов довольно проблемно реализовать незамудренный (если хорошенько постараться, конечно, можно разродиться каким-нибудь монстриком, но решение с win api показалось мне более простым и менее времязатратным) алгоритм, обрабатывающий выделение части строки и ввод поверх и т.п. ситуации.

Подключение:
В «ПриНачалеРаботыСистемы»:

Попытка
   ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
Исключение
   Предупреждение("Ошибка! Загрузить внешнюю компоненту ""1sqlite.dll"" не удалось! Обратитесь к специалисту.");
КонецПопытки; 

Попытка
   ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Исключение
   Предупреждение("Ошибка! Загрузить внешнюю компоненту ""FormEx.dll"" не удалось! Обратитесь к специалисту.");
КонецПопытки; 

Попытка
   ЗагрузитьВнешнююКомпоненту("StrMatch.dll");
Исключение
   Предупреждение("Ошибка! Загрузить внешнюю компоненту ""StrMatch.dll"" не удалось! Обратитесь к специалисту.");
КонецПопытки; 

Кнопка вызова: 

ОткрытьФормуМодально("Отчет", Контекст, КаталогИБ()+"\EXTFORMS\QuicktFuzzySearch\FastSearch.ert").

P.S. не рекомендуется использовать базу, в строке пути к которой, имеются кириллические символы и пробелы.

поиск выпадающий список нечеткий

См. также

Универсальная обработка навигации по метаданным 1С:Предприятия 7.7 для пользователя (навигатор - органайзер открывает любые объекты в режиме 1С:Предприятия)

Поиск данных Платформа 1С v7.7 Абонемент ($m)

Если у пользователя конфигурации 1С 7.7 сложный интерфейс (или несколько интерфейсов), в котором проблематично найти нужный элемент метаданных - константу, справочник или документ (журнал документов), отчет или обработку, в этом случае поможет универсальный навигатор - органайзер по элементам метаданных, позволяющий легко найти нужный пользователю вид объекта метаданных в отсортированном по алфавитному порядку списке идентификаторов, синонимов или даже комментариев объектов метаданных. Данная универсальная обработка позволяет выбрать и открыть необходимую форму списка и форму элемента. Для доступа к нужному объекту в конфигурации у пользователя должно быть настроено разрешение в правах пользователя, а ссылка в его интерфейсе пользователя в конфигурации не обязательна.

1 стартмани

09.10.2021    4765    0    ksnik    1    

6

Поиск и исправление дублей штрихкодов для номенклатурных единиц измерения

Поиск данных Чистка данных Логистика, склад и ТМЦ Оперативный учет 7.7 1С:Торговля и склад 7.7 Управленческий учет Абонемент ($m)

Простая и удобная обработка предназначена для поиска и исправления задублированных (повторяющихся) номенклатурных штрихкодов справочника Единицы. Также она даёт возможность посмотреть номенклатурные остатки. Полезна в случаях, когда номенклатура сопоставляется по штрихкоду с другими внешними источниками, а именно с модулем "Обмент ГИСМТ".

1 стартмани

19.11.2020    7565    1    Kuzya_brаtsk    4    

8

Вычленение из строки с набором букв и цифр номера сотового телефона

Поиск данных Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 Россия Абонемент ($m)

Для 1с77 ТиС 9.2 отчет - выборка всех сотовых телефонов из справочника контрагенты для передачи в СМС рассылку. Для 1с8 Обработка с алгоритмом распознавания номера телефона из строки.

1 стартмани

20.03.2020    5241    4    AlexHelmer    1    

2

Поиск дублей в любом справочнике для 1С 7.7

Поиск данных Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

Внешняя обработка предназначена для поиска и подробного анализа дублей.

2 стартмани

29.04.2015    18631    52    Pirat-37    1    

0

Поиск автозапчастей по каталожному номеру

WEB-интеграция Поиск данных Платформа 1С v7.7 1С:Торговля и склад 7.7 Автомобили, автосервисы Абонемент ($m)

Внешняя обработка для поиска автозапчастей по каталожному номеру

1 стартмани

26.01.2015    14871    10    kras_71    6    

2

Поиск контрагентов по списку ИНН, переноса в группу и формирования оборотов

Поиск данных Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 Абонемент ($m)

Поиск контрагентов по списку ИНН, переноса в группу и формирования оборотов по счетам с субконто "Контрагенты"

10 стартмани

16.08.2014    16926    2    GSoft    1    

1

Контекстный поиск в 7.7

Поиск данных Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Процедура контекстного поиска в журнале документов.

18.04.2014    11187    cushe    3    

5

Поиск дублирующихся записей в DBF файлах

Поиск данных Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Обработка 1С7.7 ищет в таблице DBF дублирующиеся записи. Помещает все найденные дубли в файл dubli.dbf. Есть вариант поиска с удалением дублей из файла, если установить соответствующую отметку на форме.

1 стартмани

26.07.2013    14562    10    hubby    2    

0
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. OneS 5 02.01.14 09:50 Сейчас в теме
Не так давно, общаясь с пользователем, услышал жалобу на то, что новые сотрудники компании совершенно не ориентируются в номенклатуре предприятия (ТиС), что при работе с клиентами «в голос» и справочнике в 10 тыс. позиций – достаточно критично. Да и мне самому частенько приходилось «играть» с поисковой строкой, дабы обнаружить позицию, с которой «что-то не то».


Это припарка. Потом придётся делать поиск в результатах поиска. Нужно убивать источник проблемы.
4. Jill 17 02.01.14 16:29 Сейчас в теме
(1) OneS, динамический выпадающий список, показывающий наиболее похожие позиции в порядке убывания, ИМХО, очень похож на "поиск в результатах поиска".
Ну, и "убивать источник проблемы": т.к. пользователей мочить как-то не гуманно, то сейчас "не ориентирующиеся" пользуют этот поиск в целях освоения. При выборе он встает на строку номенклатуры, т.е. показывает где "лежит" искомая позиция.
Ну и как уже было сказано: это, скорее, пример возможных решений. Можно глянуть и "сбахать" свою адаптацию.
5. OneS 5 02.01.14 16:54 Сейчас в теме
(4) когда выпадет за сотню строк, тогда может быть и дойдёт, что нужно заняться справочником.
6. Jill 17 02.01.14 22:04 Сейчас в теме
(5) OneS, какой ассортимент держать/закупать решают другие люди.
Как структурировать справочник и то, как должна выглядеть строка наименования (шаблонность н-р "объем/вес_наименование_брэнд") - тоже.
Для оптовых компаний 2-5 тыс. активных позиций - норма.

Ну и, наконец, если глянуть в код, то 100 строк (без правки) не выпадет никогда.
2. AnryMc 846 02.01.14 10:14 Сейчас в теме
А при чём здесь:
рыба
?
3. Jill 17 02.01.14 16:21 Сейчас в теме
(2) AnryMc, "Является, скорее, примером для реализаций собственных адаптированных поисковых решений."
Хотя, конечно, можно пользовать и как готовое решение.
7. AnryMc 846 02.01.14 23:00 Сейчас в теме
(3) Всё равно не понял...
8. Jill 17 03.01.14 13:50 Сейчас в теме
(7) AnryMc, выкинул рыбу.
Dolly_EV; +1 Ответить
9. пользователь 08.01.14 12:05
Сообщение было скрыто модератором.
...
10. Jill 17 08.01.14 14:58 Сейчас в теме
(9) margo_m09, спасибо. :)
11. lelusha 06.02.14 22:20 Сейчас в теме
Очень интересная идея, спасибо разработчику.
12. CheBurator 3118 15.06.16 01:03 Сейчас в теме
"Например: в модальном режиме конструкция с ложным закрытием работать откажется,"

- хм, не знаю, не знаю... Активно пользуюсь этим и именнов модальных формах (обработки для ТСД) - все нормально всегда было с ложным закрытием. Может, я чего-то не понял...
13. Jill 17 16.06.16 13:15 Сейчас в теме
(12) CheBurator, давно дело было, сейчас вряд ли вспомню - может быть чего-то напарил.
Но точно помню что при модально запуске подбора ложное закрытие то ли в принципе вело себя некорректно, то ли что-то неладное творилось с фокусировкой.
Оставьте свое сообщение