Нечеткий поиск в справочнике. Версия 1.02

19.02.16

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

Для целей автоматического сопоставления справочников из разных баз данных при загрузке табличных частей документов была написана эта функция,  к которой в итоге был прикручен визуальный интерфейс. На практике вполне оправдала себя и позволила за разумное время автоматически заполнять большие документы.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Нечеткий поиск в справочнике 1.02
.erf 10,76Kb
69
69 Скачать (1 SM) Купить за 1 850 руб.

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

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

Процедура написана на языке 1С, потому не является оптимизированной по скорости, но со своими задачами вполне справляется на справочнике порядка 7000 элементов.

Для интерактивного ее варианта (и отладки) было добавлено отображение списка 20 лучших результатов с рейтингами и подстроками совпадения.

История версий:

1.02

  • Отбор без групп удален из запроса, выведен в цикл перебора результатов (вызывал ошибку в справочниках без групп)
  • Достоверность по умолчанию установлена в 80% (при 0% - была ошибка)
  • Убрано прерывание поиска в случае 100% совпадения

нечеткий поиск справочник поиск 1с8

См. также

Поиск данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

10800 руб.

14.05.2012    159543    339    253    

573

Математика и алгоритмы Инструментарий разработчика Универсальные функции Поиск данных Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Абонемент ($m)

Несколько упакованных в один класс интерфейсов для обработки популярных универсальных коллекций. Для тех, кого раздражает отсутствие действительно единого интерфейса для универсальных коллекций.

5 стартмани

25.09.2024    2547    1    Артано    14    

19

Поиск данных Программист Платформа 1С v8.3 Россия Бесплатно (free)

В этой статье я хочу рассмотреть еще один кейс применения Clickhouse в связке с 1С - оптимизацию поиска в справочнике по ключевым словам. Здесь не будет готового решения, но будут описаны важные моменты, которые позволят легко применить данный кейс в реальности.

18.08.2024    2160    1cnik2    23    

15

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

Отображение и просмотр реквизитов справочника или документа - с бесконечным открытием подуровней.

1 стартмани

14.06.2024    3635    9    RustIG    29    

22

Поиск данных Системный администратор Программист Платформа 1С v8.3 Россия Абонемент ($m)

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

1 стартмани

30.11.2023    5000    andreysidor4uk    18    

53

Поиск данных Корректировка данных Пользователь Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

PowerOffice - обработка для поиска, просмотра и обработки данных для пользователей. Доступ к объектам на просмотр и редактирование данных определяется правами пользователя.

1 стартмани

05.06.2023    2416    26    PowerBoy    1    

16

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

Получение ссылки в 1С по бинарной строке из PostgreSQL в виде строки формата bytea или из MSSQL в виде шестнадцатиричной строки. Кроме ссылочных объектов ссылки могут быть получены и для перечислений. Это может быть полезно при анализе логов журнала регистрации или СУБД.

1 стартмани

04.04.2023    3305    4    berserg    2    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. karpik666 3865 20.01.16 07:48 Сейчас в теме
А замер времени такой операции производился?
2. sleeping07 29 20.01.16 08:00 Сейчас в теме
Ну, по факту - конечно. Зависит от размера справочника линейно и в большей степени от длины строки сравнения. Запрос оптимизирован для ускоренного поиска по подобию началу строки поиска, в реальных условиях это помогает в большинстве случаев, тогда скорость поиска в пределах единиц секунд, если же случай сложный, то перебираются все остальные варианты, время в таком случае может достигать десятков секунд. Запрос выглядит так:
Запрос=Новый Запрос("ВЫБРАТЬ
| Справочник.Наименование КАК Наименование,
| Справочник.Ссылка,
| Выбор Когда (Справочник.Наименование Подобно &Начало)
| Тогда 0 Иначе 1 Конец КАК Подобие
| ИЗ Справочник."+Справочник+" КАК Справочник
| ГДЕ
| НЕ Справочник.ПометкаУдаления
| И НЕ Справочник.ЭтоГруппа
|УПОРЯДОЧИТЬ ПО
| Подобие, Наименование");
Запрос.УстановитьПараметр("Начало","%"+Сред(Искомое,1,5)+"%");
3. karpik666 3865 20.01.16 08:11 Сейчас в теме
(2) ааа, то есть просто запрос на подобно, а если в фразе несколько слов, то вначале разбиваете строку на слова, и каждое слово ищете на подобно, а затем получаете результат, который соответствует обоим вариантам?
4. sleeping07 29 20.01.16 08:19 Сейчас в теме
Нет, процедура сравнения всегда одинаковая - с разбиением на части (не на слова, перед сравнением все пробелы, спецсимволы убираются), просто из предположения, что совпадающие с началом строки поиска более вероятны, позволяет поиск ускорить в большинстве случаев.
5. V.Nikonov 121 22.01.16 12:40 Сейчас в теме
Что то при поиске Номенклатуры выглядит неубедительно...
Хочется получить статистику сравнительного анализа способов поиска...
6. sleeping07 29 22.01.16 13:03 Сейчас в теме
V.Nikonov, какую достоверность ставите? У меня все находило на автомате при значении порядка 60% при загрузке табличной части из другой базы с похожей, но все же местами отличающейся наименованиями номенлатурой.
UPD: вот попробовал с номенклатурой
Прикрепленные файлы:
7. CheBurator 2694 24.01.16 20:19 Сейчас в теме
А почему бы не было сделать с использованием проверенной и зарекомендовавшей себя strmatch.dll..?
8. sleeping07 29 24.01.16 20:57 Сейчас в теме
(7) CheBurator, а зачем, собственно? Интересно было реализовать именно на языке 1С. Сама функция сравнения небольшая, симпатичная, рекурсивная. Не черный ящик, все можно подстроить. Это приложение конечно малоприменимо на практике, только для демонстрации, но и в реале функция уже поработала, и сейчас на ее основе закончил обработку сравнения-сопоставления таблиц - весьма работоспособна.
9. Olga12 173 19.02.16 11:32 Сейчас в теме
Добрый день.
1. При поиске в демо базе Ботинки женские обработка находит только в справочнике Номенклатура Ботинки женские демисезонные, хотя в справочнике есть и Ботинки женские натуральная кожа, т.е не совсем рабочий алгоритм.
2. При вводе в поле Ищем данных пишет Ошибка деления на ноль.
10. sleeping07 29 19.02.16 12:52 Сейчас в теме
(9) kn, спасибо за замечание! Устранил, сейчас выложу изменения. Дело в том, что изначально поиск предназначался для поиска одного подходящего значения, поэтому при 100% совпадении с поисковой строкой поиск прерывается. Для данной демонстрации это неверно, потому следует в процедуре "НечеткийПоиск" закомментировать строчку
Если Рез=100 Тогда Прервать КонецЕсли;
Ошибка деления на 0 - очевидно при 0 достоверности, также поправил - по умолчанию устанавливается значение 80%.
11. sommid 03.03.17 17:43 Сейчас в теме
Описанный алгоритм может искажать результат, т.к. найденный кусок "вырывается" и остаток строки "склеивается" для продолжения поиска в ней.
Например, ищем " кдличному" в строке "+ 10% кличномудисконту": находим сразу кусок "личному" и получаем на следующем шаге, что ищем "кд" в строке "+ 10% кдисконту" и находим кусок "кд", хотя в исходной строке, где ищем, такого сочетания не было.

Пример не очень красивый ), просто как наглядная демонстрация.
Может как-то совершенствовали алгоритм, чтобы учесть это?

А вообще за алгоритм спасибо.
12. sleeping07 29 03.03.17 18:17 Сейчас в теме
(11) Спасибо за замечание. Согласен. Алгоритм не совершенствовал, но в данном случае могу предложить навскидку на место вырезанного фрагмента вставить какой нибудь спецсимвол, и сравнивать дальше. Это надо пробовать, конечно...
13. sommid 05.03.17 13:29 Сейчас в теме
(12) - тоже думал про этот вариант, но тогда надо и в строку поиска и в искомую вставлять.. да и символ должен гарантированно отсутствовать в этих строках + потребуется корректировать определение рейтинга, т.к. искусственно увеличиваем длину строк

Можете пояснить смысл и назначение переменной "Огр"?
А еще лучше, если есть какая ссылка на описание метода или название используемого метода поиска..(12)
14. sleeping07 29 05.03.17 15:30 Сейчас в теме
(13) Рейтинг придется считать по-другому, исключая вставленные спецсимволы, которые кстати друг за дружкой подряд наверно идти не должны - можно лишние убирать.
Огр - порог длины осмысленной подстроки для сравнения, 2 символа и короче - уже не сравниваются. А "Длина/10" - это похоже атавизм, можно убрать из кода.
Метод сравнения источника не имел, так что все здесь :)
На днях попробую добавить в алгоритм замену на подстроку...
15. sleeping07 29 05.03.17 16:01 Сейчас в теме
Попробовал, не удержался. Просто вместо пустой строки вставил спецсимвол с кодом 27
Стр1=СтрЗаменить(Строка1,Иск,Символ(27));
Стр2=СтрЗаменить(Строка2,Иск,Символ(27));
Алгоритм не сломался, рейтинг тоже работает, если ли от этого толк - не понять без хорошего примера.
16. sommid 07.03.17 14:32 Сейчас в теме
Еще из пожеланий: как по мне было бы логичнее, чтобы найденные кусочки были в порядке их следования в исходной строке
(15) - ок, спасибо, буду иметь ввиду
17. Scottlinch 9 22.08.17 02:06 Сейчас в теме
Можно было все намного быстрее и правильнее сделать через регулярные выражения. Если конечно вам более необходимо точное 100 % совпадение.
18. sleeping07 29 22.08.17 05:59 Сейчас в теме
(17) Спасибо! На самом деле этот демо интерфейс не показывает настоящую цель обработки - она делалась для сравнения похожих справочников и подбора наиболее подходящего элемента, пример - отождествление сходных справочников номенклатуры разных предприятий. Пока не увидел возможности с помощью регулярных выражений решить эту задачу точнее и быстрее.
19. provadyuga 99 20.12.24 11:25 Сейчас в теме
Функция НечеткоеСравнение(Строка1,Строка2,Строка3,Ранг=0)
Не понятно зачем здесь Строка3.
Для сравнения достаточно двух строк.
Оставьте свое сообщение