Поиск и замена дублирующихся элементов справочников, КОД ОТКРЫТ, для 7.7

63 Comments

  1. Natalia

    Нужная обработка

    Сама для себя писала «того же назначения», в ходе последней сложной конвертации данных ничего лишним не показалось – потому попробую описать различия функционала. В качестве стартовой для организации подборов использовала свою же Печать_Справочников (есть в профайле)

    1)Тоже использовала компоненту для нечеткого сравнения строк и тоже ReplVal. Только правила ее чуть больше – во-первых, в стандартном виде замена в проводках доступна только при перепроведении – хотя штатно программно можно и без перепроведения — потому сделала птычку «Заменять в операциях без перепроведения». Из того, до чего «должны дойти руки» — оставить от ReplVal только внешнюю оболочку и сделать замену прямыми запросами – чтобы и регистры и периодику без перепроведения. Во-вторых, в ReplVal исправлена «авторская ошибка» — строки 226-227 при должных обстоятельствах «выстреливают» В третьих, добавлена возможность ограничения временного диапазона документов, в которых производится замена.

    2)Компонента нечеткого сравнения – замечательно, но иногда работаешь у клиента, и нет возможности ее зарегистрировать. Удобно, когда в этом случае работать все-таки можно, не используя нечеткое сравнение строк, а просто равенство (возможно, с точностью до регистра или до «всех значащих символов»)

    3)Удобно, когда сравнение не по одному реквизиту, а возможность одновременного сравнения по нескольким – например, контрагенты являются двойниками, когда у них «УНН равно, наименование похоже», или товары – когда «Штрих коды равны, цены равны, наименования похожи»

    4)Удобно ограничить область правильных и область поиска двойников произвольной выборкой или группой или даже признаком «удаленные» или «не удаленные» — это и ускоряет поиск, и делает результат более четким

    5) Для поиска по периодическим реквизитам – задавать дату, на которую их сравниваем

    6)В компоненте нечеткого сравнения строк есть замечательная возможность использовать Вес чисел – чтобы Масло 100 г и Маслы 100 г были похожи, а Масло 100 г и Масло 200 г — нет

    7)В ReplVal – удобнее передавать не одной порцией, а все сразу – актуально, если двойников ОЧЕНЬ много, что бывает после конвертации.

    8)После обработки ReplVal можно обучить делать «заменяемое» помеченным на удаление, а с «заменителя» эту пометку снять – мелочь, а приятно

    9)Важно иметь возможность не только передать в обработку замены, но и на печать – заменитель и все двойники к нему, с расшифровками. Например, чтобы дать ответственным возможность разобраться с нечеткими случаями. Или распечатать для виновных «рецепт на получение оплеух от начальства».

    Уффф….. вспомню еще чего – напишу еще )))

    Reply
  2. Natalia

    Еще из того, до чего не дошли руки, но нужно будет сделать — автоматически искать двойников в подчиненных справочниках. Например, если Контрагент А — двойник контрагента АА, то все договоры контрагента А считаем двойниками договоров контрагента АА при условии совпадения реквизитов. Иначе бывают проблемы при замене элементов, имеющих подчиненные.

    Reply
  3. Поручик

    На вид шикарно. Пока потребности нет, но при случае воспользуюсь.

    Reply
  4. Незнайка

    (1)(2) Спасибо за конструктив!!!

    Reply
  5. Natalia

    (4) Если доработаете ReplVal в нужном направлении — могу поделиться взамен своим готовым проектом )))

    А просто так — жаль выкладывать — уж очень большой кусок работы.

    Слишком много молчаливых пользователей с нулевым рейтингом — просто качают-качают — и все уходит куда-то «как в черную дыру» — даже без конструктива и без благодарности.

    Reply
  6. GenTay

    Прикольно!

    Reply
  7. eslava

    А с Vista она дружит? Мне выдаёт ошибку всё время «Ошибка при загрузке компоненты каталог базыdllStrMatchStrMatch.dll. Компонента не загружена.» Хотя папка DLL лежит в корне базы =(

    Reply
  8. Ёпрст

    До автора наконец дошло, что обработки с закрытым кодом никому не упали ?

    Похвально..

    Reply
  9. Ёпрст

    На будущее — храните картинки в самом ert-нике, хоть на форме, хоть в мокселе.

    Reply
  10. Natalia

    (7) зарегистрировать компоненту с админскими правами

    Reply
  11. Ish_2

    Жаль , что для восьмерки такое творчество ненужно и бесполезно.

    Наличие полнотекстового поиска ( поиск и отбор объектов во всей конфигурации) отбивает охоту у энтузиастов и любителей ВК.

    Reply
  12. saveliev

    Каким образом(10)

    Reply
  13. Natalia

    (12) regsvr32 с админскими правами

    я обычно просто выношу нужную командную строку на ярлычок и запускаю его «от имени администратора»

    Reply
  14. Ёпрст

    (11) жаль, что в снеговике нет поиска похожих слов, а реализованный полнотекстовый поиск — туфта… так что, любителей ВК не поубавится.

    Reply
  15. JohnyDeath

    (11) «Полнотекстовый поиск» и «поиск похожих» — разные вещи

    Reply
  16. Ish_2

    (14),(15) Что понимается под выражением «поиск похожих» ?

    И что понимается под выражением «полнотекстовый поиск», который «в восьмерке — туфта ?» ?

    Растолкуйте мне.

    На всякий случай выдержка из документации (описание полнотекстового поиска в 8-ке):

    * — поиск с использованием группового символа (замена окончания слова). Должно быть введено более 1 значащего символа; пример: доку* — найдет «документ», «документировать», «документальный» и др.;

    # — нечеткий поиск слов с заданным количеством отличий от указанного (если не указано, то = 1); пример: запрос #Система найдет «систама», «сивтема»; запрос Система#2 найдет «ситтама», «сеттема»;

    ! — поиск с учетом синонимов русского, английского и украинского языков. ! ставится перед соответствующим словом; пример: поиск !красный кафель, найдет еще и «алый кафель» и «коралловый кафель».

    Reply
  17. JohnyDeath

    (16) Давай на примере.

    В базе есть следующие товары:

    Т/в Виски 100мл Лимитед

    Виски 100мл Лимитед Т/в

    Виски 100мл Лимитед

    Виски 100 Лимитед

    Whisky 100 Лимитед

    Whisky Лимитед 100

    …. ну и ещё с десяток другой похожих комбинаций с перестановкой слов/символов. А всё это один и тот же товар.

    Как надо построить запрос, чтобы получить все такие похожие позиции в 8-ке без ВК?

    Reply
  18. Ish_2

    (17) Если поисковое наименование состоит из трех слов то возможен пример строки поиска :

    ПервоеСлово#2 NEAR ВтороеСлово#2 OR

    ПервоеСлово#2 NEAR ТретьеСлово#2 OR

    ВтороеСлово#2 NEAR ТретьеСлово#2

    Поиск с учетом морфологии.

    Порядок слов не имеет значения.

    #2 — допускается несовпадение двух символов в слове.

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

    И после этого — мне толкуют о какой -то самопально-хитрой ВК ?

    Reply
  19. Незнайка

    (17)(15) Кстати, большое спасибо за http://infostart.ru/public/15765/

    именно эту обработку я брал как основу

    Reply
  20. JohnyDeath

    (18) Что такое ПервоеСлово, ВтороеСлово… ?

    Для каждого элемента, в зависимости от количества слов надо будет строить новый запрос?

    ….

    млин, хоть ставь и смотри )

    Reply
  21. Ёпрст

    (20) можешь не ставить.. нет в снеговике этого.

    Reply
  22. Ёпрст

    +21 ты должен будешь писать

    Виск* 10* Lim* ну и т.д..

    Reply
  23. Ish_2

    (20)

    Задача :

    Наименование элемента справочника : «Виски 100мл Лимитед »

    Для этого элемента справочника мы ищем «похожие по наименованию» другие элементы этого же справочника.

    Решение для 8-ки :

    Определяем

    ПервоеСлово = «Виски» ;

    ВтороеСлово = «100мл» ;

    ТретьеСлово = «Лимитед»;

    Составляем символьную строку поиска с использованием литералов :

    СтрокаПоиска =

    «Виски#2 NEAR 100мл#2 OR

    Виски#2 NEAR Лимитед#2 OR

    100мл#2 NEAR Лимитед#2 »

    — и подаем на вход встроенной функции 8-ки, которая возвращает набор объектов

    «похожих» на строку поиска.

    Приведенная строка поиска означает , что искаться будут такие элементы справочника, наименование которых содержит

    либо два слова «Виски» и «100мл» ( в любом порядке),

    либо два слова «100мл» и «Лимитед» (в любом порядке),

    либо два слова «Виски» и «Лимитед» (в любом порядке)

    В каждом посиковом слове допускается несовпадение двух символов.

    Т.е. наименование , содержащее два слова

    «Висто» и «Леметед» в любом порядке — удовлетворяет критерию поиска.

    Reply
  24. Ish_2

    (20) Не слушай Ёпрста. Поставь.

    Reply
  25. Ёпрст

    (23) зачет.. А теперь найди дубли во всем справочнике..

    Тоже будешь для каждого наименования строку для поиска руками составлять?

    Reply
  26. Ish_2

    (25) Не понял. Зачем ручками ?

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

    Разбираем наименование на «пЕрвоеСлово», «ВтороеСлово»,»ТретьеСлово».

    Запускаем поиск. Получаем массив «похожих». Переходим к следующему.

    Как вариант :

    Затем можно организовать анализ всех полученных массивов на похожесть.

    И получить группы предполагаемых дубликатов.

    Сам никогда такого не делал — но предполагаю , что делать нужно примерно так.

    Reply
  27. Ёпрст

    (26) ты не понял.. Я просто запускаю обработку и она мне выдаст список всех похожих элементов..

    А тут как ?

    Там реализован программный вызов этого чуда ?

    + на сколько я помню, нужно у каждого реквизиты втыкать , что он используется в полнотекстовом поиске + поддержка индекса в актуальном состоянии для этого поиска..

    Reply
  28. Ish_2

    (27) Ага. Это чудо запускается программно. Т.е. на вход встроенного менеджера подается строка поиска , а на выходе коллекция объектов «СписокПолнотекстовогоПоиска».

    Да, у каждого реквизита объекта есть свойство «Полнотекстовый поиск».(использовать или не использовать).

    Да, база периодически должна индексироваться в монопольном режиме.

    Reply
  29. Ёпрст

    (28) ну, если в профайлере посмотреть на текст запроса — то там скорее всего, обычный like и ничего нового…

    А так — один хрен писать хоть в клюшках, хоть в снеговике придётся всё руками.

    Reply
  30. Ish_2

    Конечно, Like.

    А что там еще может быть ?

    Да, я совсем не возражаю против творчества в 77.

    Но паровоз ушел слишком далеко…

    Reply
  31. Ёпрст

    (30) мечтатель..

    🙂

    Reply
  32. JohnyDeath

    (23) Давай другой пример. Дано:

    «Виски 500 мл производство Волгоград».

    Найти похожие.

    По твоему алгоритму (как я его понял) помимо прочего получим и такие элементы:

    Водка 500 Волгоград

    Лимонад Волгоград

    Чай 500

    Так?

    Reply
  33. vip

    (30) Что ты все про паровоз?

    Как бы тебе ни хотелось, никуда он не ушел, пыхтит. И весьма бодро.

    Reply
  34. Ish_2

    (32) Нет не так .

    Если тупо применить описанный алгоритм к твоему примеру

    «Виски 500 мл производство Волгоград».

    , то строка поиска будет сотоять из комбинации трех первых слов :

    «Виски» , «500» , «мл».

    Т.е. программно на вход встроенного менеджера полнотекстового поиска мы подадим строку :

    Виски NEAR 500

    OR Виски NEAR мл

    OR 500 NEAR мл

    Отсюда следует что наименование «Водка 500 Волгоград» не содержит вместе ни одной из комбинаций из строки поиска .

    А например строка «Волгоград 500 Лимонад мл » содержит вместе слова «500» и «мл» — значит она удовлетворяет критерию поиска. (…OR 500 NEAR мл)

    Reply
  35. Ish_2

    (33) Я тут маленько похулиганил …

    но отгадай какие слова лишние ?

    «никуда он не ушел, пыхтит на месте. И на вид весьма бодро»

    Reply
  36. vip

    (35) Сам же понимаешь, что тобой добавленные слова лишние.

    На месте пыхтят и будут пыхтеть такие, как ты, типовоконфигопоклонники.

    И в 7, и в 8.

    Reply
  37. eslava

    Ок спасибо =) (13)

    Reply
  38. Ish_2

    (36) Не угадал. В предложении нет лишних слов.

    «Типовоконфигопоклонники» — пусть так.

    Нас тьмы и тьмы и тьмы… Попробуйте сразитесь с нами (с)

    Reply
  39. vip

    (38) Согласен. А нас единицы.

    И после вашей тьмы нам работать с заказчиком гораздо легче.

    Reply
  40. Ish_2

    (39) Я тебе уже писал

    «Единица — вздор, единица -ноль», а ты опять за своё…

    Reply
  41. Ish_2

    (39) Перебирайся к нам во тьму — возьми на сопровождение типовую.

    Узнаешь, что почём. В темноте , но не в обиде.

    Reply
  42. Natalia

    Все не прочитала ))

    Полнотекстовый поиск — это хорошо — но это совсем не заменит нечеткого сравнения — это совсем разное.

    На любую построенную маску — для запроса типа LIKE — легко построю контрпример, заменивши одну букву и получивши в общем-то похожее слово. К тому же «вес чисел» тоже никак не используешь — маска Масло 100* — выберет и Масло 1000. Не говоря уж о том, что я совсем не хочу ломать голову, читать справочники и строить хитрые маски. Я просто укажу — «все похожие». Если нужна маска — сформирую выборку для поиска с использованием маски.

    По поводу внешних компонент… Весь спор — «использовать или нет, если в восьмерке все есть?»

    А для меня неразгаданная загадка — почему типовой ЗиУП использует внешнюю компоненту для склонения ФИО, если «в восьмерке все есть», и в крайнем случае все можно просто программно реализовать средствами языка .

    Reply
  43. JohnyDeath

    (34) ну ты как-то слишком уж всё упростил. Я ж написал такой пример, состоящий из пяти (читай «не из трех») слов, не для того, чтобы ты применил к нему статический алгоритм для трех слов. Я ж думал, что он у тебя подстраивается под количество строк.

    Ну если тупо применять твой алгоритм, тогда давай такой пример

    «производство Волгоград 500 мл Виски».

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

    И дело вообще не в платформе 7.7/8. От неё в данном случае вообще ничего не зависит

    Reply
  44. Ish_2

    (43) Ни в коем случае , приведенный мной навскидку алгоритм не является лучшим или оптимальным . Этим примером я лишь продемонстрировал , что в 8-ке достаточно встроенных средств для реализации оптимального алгоритма и не нужны никакие ухищрения и ВК. Вот и всё.

    На фразу

    » полнотекстовым поиском добиться универсальности крайне сложно, если вообще возможно »

    можно ответить только одно :

    » любым другим поиском добиться универсальности крайне сложно …. даже (прости меня, vip ) при помощи ВК»

    Потому что (и я здесь полностью с тобой согласен) :

    «.. дело вообще не в платформе 7.7/8. От неё в данном случае вообще ничего не зависит».

    Reply
  45. Ish_2

    (42)

    1. За то , что разработчики ЗиУП используют внешний компонент для склонения ФИО — мы их осудим.

    2. Из Ваших слов непонятно Что Вы понимаете под «нечетким сравнением».

    Пример.

    В строке поиска , которая подается на вход менеджера полнотекстового поиска в 8-ке, мы указали «Natalia#2» .

    Это значит , что критерию поиска удовлетворяют :

    «Natelii»,»Datilia» и т.д.

    Вопрос : Это нечеткий поиск ?

    3.

    Я просто укажу — «все похожие».

    Вы то укажете …

    Но «кто-то сидящий внутри программы» должен указать числовой параметр , определяющий степень этой самой нечеткости . В примере п.2 такой числовой параметр равен 2.

    Reply
  46. Natalia

    (45) 😀 Я не то чтобы ради осуждения. Я просто к тому, что и в 7.7 и в 8 используются внешние средства, даже «самыми главными разработчиками».

    И это хорошо ))

    Семерка без возможности использования внешних средств вообще давно умерла бы. Для восьмерки полный отказ от внешних компонент был бы тоже путь к концу.

    Про использование полнотекстового поиска в восьмерке — все же — признаю — была не права — возможность нечеткого поиска все-таки есть — так что все не так плохо ))

    С сайта фирмы 1С:

    Есть возможность нечеткого поиска (буквы в найденных словах могут отличаться) с указанием порога нечеткости. Пример: указав в строке поиска слово «привет» и нечеткость 17 %, найдем все аналогичные слова с ошибками и без: «привет», «превет», «привед». (с)

    Насколько я понимаю, чтобы полноценно воспользоваться полнотекстовым поиском — необходимо поддерживать индекс поиска в актуальном состоянии? Т е задача поиска всех двойников может «осложниться» восстановлением индекса? Особенно если нужные на момент поиска поля не были включены в состав этого самого полнотекстового поиска и в общем случае там и не нужны?

    «Но «кто-то сидящий внутри программы» должен указать числовой параметр , определяющий степень этой самой нечеткости . В примере п.2 такой числовой параметр равен 2.»

    Не поняла мысли …. Ну параметр «похожести» — ну и что? StrMatch вполне поддерживает «степень похожести».

    Reply
  47. Ish_2

    (46)

    Именнно так.

    Для полнотекстового поиска в 8-ке индекс должен поддерживаться в актуальном состоянии. Необходимые реквизиты должны быть включены в индекс на уровне конфигуратора. Согласен , некоторые неудобства. Я согласен их терпеть и не устанавливать никакие ВК (пусть даже по отзывам великолепные).

    Для восьмерки полный отказ от внешних компонент был бы тоже путь к концу.

    Эээээ….Вы бы того , полегче на поворотах.

    При полном отказе от ВК работает великая подавляющая часть пользователей (та самая «тьма», к которой имею честь принадлежать).

    Извиняюсь. «Тьма» — это не «конец» !

    Reply
  48. Natalia

    (47) Для быстрого разгребания завалов — перестроить всю конфигурацию — ради полнотекстового поиска???

    Неееее. Лучше РАЗОВО внешняя компонента — легко и быстро.Она ведь не нужна постоянно. В семерке я тоже минимумом обхожусь.

    Reply
  49. Ish_2

    (47) «Перестроить всю конфигурацию».

    95% пользователей используют типовые конфигурации. А в них на реквизитах установлено свойство «Полнотекстовый поиск». Так что проблема надуманная.

    Если конфигурация нетиповая , то установить нужное свойство для реквизитов и запустить индексирование — труд небольшой.

    Дело вкуса , конечно. Но это лучше , чем ставить неизвестно что на свой компьютер.

    Reply
  50. Natalia

    (49) «Полнотекстовый поиск» в типовых — по всем реквизитам разве? По-моему «джентельменский минимум» — ради уменьшения времени индексирования… Ну да ладно

    Я тоже не очень сторонница внешних компонент, но иногда это действительно необходимость.

    Это как раз тот случай.

    Тем более что это не для «работы изо дня в день» и не для доступа к данным для записи

    А всего лишь внешние функции строковых переменных, остальное штатно. И редкие административные работы.

    Reply
  51. CheBurator

    (23) плохо, не найдет элемент с Wisky LTD. а с ВК — найдет…

    Reply
  52. Ish_2

    (51) Уел.

    Reply
  53. Ish_2

    (52) Передумал : нет, не уел.

    Специализированное решение , разумеется, эффективнее общего.

    Грубо говоря , на любой Like всегда найдется свой Whisky .

    Отсюда любители «кустарных» парсеров делают радостный вывод :

    время «самопальных» ВК еще не прошло !

    Уместить весь алгоритм поиска в одну символьную строку и употребить Like в запросе —

    смотрится ущербно , скучно и неинтересно.

    Reply
  54. Abadonna

    (13)

    regsvr32 с админскими правами

    я обычно просто выношу нужную командную строку на ярлычок и запускаю его «от имени администратора»

    Ой, мамо! А юзверей 40 и все не в терминале. А потом еще инженер, гад, винду переставлял и прорегить забыл 😥 Плавали — знаем! 😉

    Reply
  55. Natalia

    (54) Я просто рассказала, как я решаю проблему для себя. Даже наверное кому-то этим помогла.

    А Вы как боретесь со своими 40 юзерами и гадами инженерами?

    Reply
  56. Aleksey_3

    (55) vkloader?

    Reply
  57. Natalia

    (56) С vkloader на Win 7 какие-то проблемы были, наспех не получилось, потом разбираться не стала.

    Но (54) немножко иронией было — если уж критикуете — то критикуйте конструктивно.

    Reply
  58. Abadonna

    (57)

    то критикуйте конструктивно.

    и (55)

    Конструктивно? Да сколько угодно! Варианты:

    1. Убить гада-инженера (но это больно уж просто)

    2. http://infostart.ru/public/15861/

    3. http://infostart.ru/public/59436/ — и сама зверь штука 😉 и метод RunAs есть

    Чего-то более конструктивного уже нагловато-то бы было просить, а? 😀

    Reply
  59. Aleksey_3

    (57) Дома стоит вин 7, проблем нет

    На работе вин 8, только из-за нее пришлось прикрутить эту длл. Правда справедливости ради нужно отметить, что пришлось несколько релизов сменить, прежде чем удалось запустить ее нормально.

    Reply
  60. Natalia

    (58) это уже конструктивнее )))

    когда у меня будет гад-инженер — то он скорее всего останется жив )))

    а пока я все же просто с ярлычка «от имени администратора» — мне пока хватает и этого

    Reply
  61. nicxxx

    (13) не работает. надо в c:windowssystem32 положить 2 файла mfc71.dll и msvcr71.dll

    только после этого strmatch.dll смогла зарегиться

    Reply
  62. nicxxx

    бага в бух 7.7 рел 517, спр Контрагенты, ползунок на 0%:

    Для А = 1 По СколькоОтбирать Цикл

    {V:BASE7LYASKINEXTFORMS\_TRIFLEDUBLFIND.ERT(1031)}: Операции сравнения на больше-меньше допустимы только над значениями совпадающих базовых типов (число, строка, дата)

    Reply
  63. mosAdm

    (0)StrMatch.dll битая оказалась, брал здесь http://infostart.ru/public/15765/

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *