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

19.02.16

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

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

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

Наименование Файл Версия Размер
Нечеткий поиск в справочнике 1.02
.erf 10,76Kb
68
.erf 10,76Kb 68 Скачать

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

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

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

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

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

1.02

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

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

См. также

Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)

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

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

9600 руб.

14.05.2012    155283    326    252    

558

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

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

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42518    10    24    

38

Кто такая Мантикора?

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

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

1 стартмани

30.11.2023    3057    andreysidor4uk    16    

45

PowerOffice

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

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

1 стартмани

05.06.2023    1922    23    PowerBoy    1    

15

Получение ссылки по бинарной строке PostgreSQL или MSSQL

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

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

1 стартмани

04.04.2023    2579    2    berserg    2    

12

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

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

Обработка позволяет найти проведенные документы без движений и, наоборот, НЕ проведенные документы с движениями. Подходит для любой конфигурации.

1 стартмани

18.08.2022    2986    21    KVIKS    3    

10

Поиск и замена значений + Поиск дублирующихся элементов справочников с подключением к внешней базе

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

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

3600 руб.

30.03.2022    8586    3    0    

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

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

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

Можете пояснить смысл и назначение переменной "Огр"?
А еще лучше, если есть какая ссылка на описание метода или название используемого метода поиска..(12)
14. sleeping07 28 05.03.17 15:30 Сейчас в теме
(13) Рейтинг придется считать по-другому, исключая вставленные спецсимволы, которые кстати друг за дружкой подряд наверно идти не должны - можно лишние убирать.
Огр - порог длины осмысленной подстроки для сравнения, 2 символа и короче - уже не сравниваются. А "Длина/10" - это похоже атавизм, можно убрать из кода.
Метод сравнения источника не имел, так что все здесь :)
На днях попробую добавить в алгоритм замену на подстроку...
15. sleeping07 28 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 28 22.08.17 05:59 Сейчас в теме
(17) Спасибо! На самом деле этот демо интерфейс не показывает настоящую цель обработки - она делалась для сравнения похожих справочников и подбора наиболее подходящего элемента, пример - отождествление сходных справочников номенклатуры разных предприятий. Пока не увидел возможности с помощью регулярных выражений решить эту задачу точнее и быстрее.
Оставьте свое сообщение