Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > КИС Lack & УС Land

Свободная дискуссия на произвольные технические вопросы по УС, ЕГАИС, методологии, идеологии : КИС Lack & УС Land

21.11.2024 18:54


06.07.2024 15:10
Поиск дублей в справочниках по алгоритму "нечеткого поиска"? Недавно такую тему с коллегами поднимали, у меня раньше самодельный алгоритм много пропускал. В результате подглядели в postgre SQL. Сейчас достаточно хорошо отлавливает по заданному проценту схожести названий. Работает для товаров, контрагентов, сотрудников.
06.07.2024 19:33
Цитата:
FinSoft Поиск дублей в справочниках по алгоритму "нечеткого поиска"?
Где же такое узрел? Мной написано - "Дублирование - понятие относительное и для каждого типа объекта конфигурации и для каждого предприятия оно может иметь разные смыслы"

... и сие не относилось к разрабатываемыми нами программами, а к моей недавной бытности анализа качества ведения учета в 1С:ERP и 1С:ЗУП на крупном предприятии. Что по "УС Лэнд"... при разработке было выявлено, что проверки дублей на этапе ввода информации несут огромные задержки в работе и их в системе практически нет, но есть мощные и быстрые механизмы выявления дублированной информации
06.07.2024 20:47
Я просто спросил. Разумеется, проверка дублей не на этапе ввода информации, используется специальный отчет.
Штука нужная для учетных систем. Ниже краткое описание алгоритма для postgreSQL, возможно, пригодится.

Цитата:
pg_trgm, извлекая триграммы из строк, игнорирует символы, не относящиеся к словам (не алфавитно-цифровые). При выделении триграмм, содержащихся в строке, считается, что перед каждым словом находятся два пробела, а после — один пробел. Например, из строки «cat» выделяется набор триграмм: « c», « ca», «cat» и «at ». Из строки «foo|bar» выделяются триграммы: « f», « fo», «foo», «oo », « b», « ba», «bar» и «ar ».
Уточню один момент, который четко не обозначен. Перед разбивкой на триграммы, из строки удаляются все символы, кроме букв и цифр. Пробелы тоже остаются для разделения на слова, при этом для приведения к правилу пробелы могут добавляться или убираться (лишние).

На скриншоте вид отчета, чтобы было нагляднее.
Миниатюры
Нажмите на изображение для увеличения
Название: search.jpg
Просмотров: 18
Размер:	233.3 Кб
ID:	12450  
08.07.2024 20:45
FinSoft, извини, что не среагировал на пост - работа и прочие заморочки... Тема, которую поднял, конечно интересная, но она не совсем отражает суть заморочек бизнеса.

Ты презентовал технологию анализа созвучности текста (наименования объектов), но не дал алгоритмы, что не уже не понятно. Однако это не дубляж в терминах бизнеса. Приведу пару примеров:

1. Уникальностью контрагентов можно условно считать уникальность связки ИНН+КПП... Но по правилам конкретного бизнеса и это не может считаться уникальностью, например для КА - физлиц;
2. По правилам 1С туева хуча товаров может объединяться в одно наименование, например конфеты, а различают их по характеристикам;
3. Уникальность входящей накладной могут считать номер поставщика + дату поставщика + сумма + совпадение суммарного количества товаров или что иное...

Где здесь применить алгоритмы от PostgreSQL? А темку о анализе схожести текстов, если даш в понятном виде алгоритмы, можно обсудить, например в https://olegon.ru/showthread.php?t=33438 или какой-нибудь другой, например в https://olegon.ru/forumdisplay.php?f=297... Мне она интересна
09.07.2024 11:00
Андрей, если хочешь, перенеси в другую тему. В приведенной выше цитате алгоритм достаточно подробно описан. Я могу приложить сырцы на clarion, но это вряд ли даст что-то дополнительно. Я использую отчет для проверки на ошибки операторов, связанные с дублированием записей в справочниках. Кстати, когда-то давно подсмотрел подобное в Папирусе. По поводу примеров могу так добавить.
1. Не все вводят ИНН и КПП. У меня используется проверка на повторный ИНН при сохранении изменений в справочнике контрагентов, выводится предупреждение.
2. Одно наименование для товаров это плохая практика. В указанной ситуации обычно наименование модифицируется (в том числе автоматически) в соответствии с характеристиками. Возможно, какой-то самопал попался.
3. Да, подобное тоже делал. Потребность возникает, когда приходят заказы или чеки через интернет. Тут полностью от сбоев сложно застраховаться и нужен какой-то пост контроль.
09.07.2024 14:23
Цитата:
FinSoft Андрей, если хочешь, перенеси в другую тему.
Перенес
Цитата:
FinSoft В приведенной выше цитате алгоритм достаточно подробно описан. Я могу приложить сырцы на clarion, но это вряд ли даст что-то дополнительно.
Возможно я недогоняю, но алгоритма в цитате я не увидел, а увидел лишь фрагменты идей. Может будет полезен код на Кларионе - думаю пойму?

Цитата:
pg_trgm, извлекая триграммы из строк, игнорирует символы, не относящиеся к словам (не алфавитно-цифровые). При выделении триграмм, содержащихся в строке, считается, что перед каждым словом находятся два пробела, а после — один пробел. Например, из строки «cat» выделяется набор триграмм: « c», « ca», «cat» и «at ». Из строки «foo|bar» выделяются триграммы: « f», « fo», «foo», «oo », « b», « ba», «bar» и «ar ».
Цитата:
FinSoft Я использую отчет для проверки на ошибки операторов, связанные с дублированием записей в справочниках. Кстати, когда-то давно подсмотрел подобное в Папирусе. По поводу примеров могу так добавить.
1. Не все вводят ИНН и КПП. У меня используется проверка на повторный ИНН при сохранении изменений в справочнике контрагентов, выводится предупреждение.
2. Одно наименование для товаров это плохая практика. В указанной ситуации обычно наименование модифицируется (в том числе автоматически) в соответствии с характеристиками. Возможно, какой-то самопал попался.
3. Да, подобное тоже делал. Потребность возникает, когда приходят заказы или чеки через интернет. Тут полностью от сбоев сложно застраховаться и нужен какой-то пост контроль.
Ну и я использую отчеты для верификации - малая часть описана в теме: https://olegon.ru/showthread.php?t=33438

Но по п/п 1... У меня КА может полностью быть описан в справочнике клиентов - тогда его уникальность контролируется связкой ИНН+КПП и одно ЮЛ может быть в куче строк, если это не физическое лицо, но возможно его расчленение на головное предприятие и адреса складов (ТТ) - тогда ЮЛ одно, а адресов с уникальными КПП (для холдингов ИНН и КПП) множество... и это другая "песня", а возможно и реально пользуется комбинированное ведение

Как итого - "уникальность" определяется правилами ведения каждого конкретного бизнеса. Что по №2 - такой подход описывается в каждом учебнике по конфигурациям 1С, т.е. является правильным по методологии ООО "1С"
09.07.2024 17:02
Лови для примера реализации.

Код:
form_r routine   !формирование отчета
  DATA
lor:queue queue, pre()
lor:idobj   long
lor:ind     long
lor:mass    string(3),dim(10000)
.
lor:symbols string(100)
lor:str     string(3)
lor:dl      long
lor:kolRep  long

lor:nameobjSel string(200)
lor:idobjSel   long
lor:indSel     long
lor:indMax     long
lor:massSel    string(3),dim(10000)
lor:massContr  long,dim(10000)

lor:i   long
lor:j   long
lor:k   long
lor:n   long
lor:flag byte

BasicProcess  BasicProcessType

  CODE

    lor:symbols='abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789'  !список анализируемых символов

    BasicProcess.Init(True,'Загрузка товаров',,,,,100,Records(tovar))
    set(tovar)
    loop
       next(tovar)
       if error()
          break
       .
       if ~BasicProcess.LoopStep()
          break
       .
       if tov:NoPost=1
          cycle
       .
       if tov:name=''
          cycle
       .

       tov:name=left(lower(tov:name))
       lor:nameobjSel=''
       lor:j=0
       lor:flag=0
       loop lor:i=1 to len(clip(tov:name))
          if tov:name[lor:i]=' ' and lor:flag=1
             lor:flag=0
             lor:j+=2
          elsif instring(tov:name[lor:i],clip(lor:symbols),1,1)>0
             lor:flag=1
             lor:j+=1
             lor:nameobjSel[lor:j]=tov:name[lor:i]
          .
       .
       lor:nameobjSel = '  ' & clip(lor:nameobjSel)

       clear(lor:queue)
       lor:idobj=tov:id
       lor:dl=len(clip(lor:nameobjSel))+1
       lor:ind=0
       lor:k=1
       loop
          if lor:k>lor:dl
             break
          .
          lor:str=lor:nameobjSel[lor:k : lor:k+2]
          if lor:ind>9996  !перестраховка
             break
          .
          if lor:str[2 : 3] <> '  '
             lor:ind+=1
             lor:mass[lor:ind] = lor:str
          .
          lor:k+=3
       .
       add(lor:queue)
    .
    BasicProcess.Kill()

    open(ProgressWindow)
    BasicProcess.Init(False,'Сопоставление',,?Progress:Thermometer,?Progress:Cancel,True,5,Records(lor:queue),?Progress:UserString)
    loop lor:i=1 to records(lor:queue)-1
       get(lor:queue,lor:i)
       if ~BasicProcess.LoopStep()
          break
       .

       lor:indSel=lor:ind
       lor:idobjSel=lor:idobj
       lor:massSel=lor:mass

       loop lor:j=lor:i+1 to records(lor:queue)
          get(lor:queue,lor:j)
          lor:kolRep=0
          lor:indMax=choose(lor:indSel>lor:ind,lor:indSel,lor:ind)
          clear(lor:massContr)
          loop lor:k=1 to lor:indSel
             if lor:massSel[lor:k]=''
                cycle
             .
             loop lor:n=1 to lor:ind
                if lor:mass[lor:n]=''
                   cycle
                .
                if lor:mass[lor:n]=lor:massSel[lor:k] and lor:massContr[lor:n]=0
                   lor:kolRep+=1
                   lor:massContr[lor:n]=1
                .
             .
          .
          lor:kolRep=lor:kolRep/lor:indMax*100
          if Loc:Proc<=lor:kolRep
             clear(Loc:Queue)
             Loc:IDObj1=lor:idobjSel
             Loc:IDObj2=lor:idobj
             Loc:ProcQ=lor:kolRep
             add(Loc:Queue)
          .
       .
    .

    free(lor:queue)
    BasicProcess.Kill()
    close(ProgressWindow)
09.07.2024 17:06
Цитата:
AndreyZh Как итого - "уникальность" определяется правилами ведения каждого конкретного бизнеса. Что по №2 - такой подход описывается в каждом учебнике по конфигурациям 1С, т.е. является правильным по методологии ООО "1С"
Я бы сказал, что в конкретных ситуациях могут быть свои нюансы.
Часовой пояс GMT +3, время: 18:54.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.