Поиск и замена дублирующихся элементов справочников, КОД ОТКРЫТ, для 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 не будет опубликован. Обязательные поля помечены *