Нечеткий поиск дублей в наименованиях элементов справочников

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

Испльзуются ВК:
1. «StrMatch.dll» для нечеткого сравнения строк. Автор: Ракунов Александр.
2. 1с++ http://www.1cpp.ru/
3. FormEx http://dorex.ru/?projects&formex

Порядок установки:
1. Если у вас нет в папке «{КаталогГдеУстановленаWindows}System32» файлов MFC71.dll и msvcr71.dll скопируйте их туда из прикрепленного архива «System32.rar» (необходимы для нечеткого поиска)
2. Распаковываем архив «Поиск.rar», открываем обработку «Поиск.ert».
Для тех, кто уже использует 1с++: Для корректной и полной работы обработки необходима ВК 1с++ 3.0 не ранее 22 апреля 2008 (находится в архиве, либо здесь: http://www.1cpp.ru/images/3/32/Icpp-latest.rar )!

Некоторые особенности работы:
Выбираем вид справочника, ставим процент совпадения, нажимаем «Начать сканирование».
После заполнения ТП возможно:
0. ПРЯМОЕ РЕДАКТИРОВАНИЕ значений ячеек в колонках «ЧтоМеняем» и «НаЧтоМеняем»!
1. Сортировать по любой колонке (по клику на колонке)
2. Перекидывать элементы местами в пределах одной строки (начинать тащить надо либо на колонке «ЧтоМеняем», либо «НаЧтоМеняем»)
3. Менять местами строки «тасканием».
4. Если выделить несколько строк («shift/ctrl + клик мыши», либо «shift + стрелки клавиатуры»), потом вызвать контекстное меню (правая кнопка мыши), можно перекинуть выбранные элементы в указанную группу. Перекидываются те элементы, над которыми вызвано контекстное меню, т.е. либо над «ЧтоМеняем» либо над «НаЧтоМеняем»
5. Отмеченные галочкой строки можно передать в стандартную обработку «Замену значений» по соот-ей кнопке.
6. Пометить на удаление элементы из колонки «ЧтоМеняем», отмеченные ранее «галочкой».
7. Помеченные на удаление отображаются зачеркнутым шрифтом.

В очередной раз благодарю: разработчиков компонент 1с++ ( http://www.1cpp.ru/ ), FormEx (http://dorex.ru/?projects&formex) и Ракунова Александра за прекрасную ВК «StrMatch», а также Мартынова Константина за красивую конфигурацию «СКАТ-Профессионал»( http://33lab.ru/v7_skat/index.shtml ) 😉

67 Comments

  1. JohnyDeath

    Основное назначение обработки — пропаганда 1с++ 😉

    Прямое редактирование значений ячеек ТабличногоПоля официально появилось только вчера. Также была добавлена возможность вывода нескольких картинок в одной колонке!

    Подробней здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1205929683/15#25

    Reply ↓
  2. cs25

    Классная штуковина. Плюсуем !!!

    Reply ↓
  3. 33lab

    Все класно — только есть маленькое предложение — проверять загружены ли компоненты (1С++ и FormEx) не через

    //Если ЗагрузитьВнешнююКомпоненту(Путь+»1cpp.dll»)=0 Тогда

    а через попытку проверки версии 1С++.. так как компоненты у меня например уже загружены а при открытии обработки выдается сообщение что «Не удалось загрузить компоненту» т.к. обработка вытается загрузить компоненты по указанному в коде пути.

    Reply ↓
  4. JohnyDeath

    (3) Спасибо. Перезалил. Кому неохота качть 700 кБ ради исправленных двух строчек, то заменитье процедуру ПриОткрытии() на эту:

    Код
    Процедура ПриОткрытии()
       Путь="";Имя="";
       РасположениеФайла(Путь,Имя);
       Попытка
          МетаИнфо=СоздатьОбъект("MetaInfoClasses");
          НомВер="";
          НомВерСтр=МетаИнфо.ПолучитьВерсию(НомВер);
          Если НомВер<"3.0.0.0" Тогда
             Предупреждение("Для корректной работы необходимо использовать 1с++ версии не ниже 3.0.0.0",30);
             СтатусВозврата(0);
             Возврат;
          КонецЕсли;
       Исключение
          Если ЗагрузитьВнешнююКомпоненту(Путь+"1cpp.dll")=0 Тогда
             Предупреждение("Не удалось загрузить 1c++ !",20);      
          КонецЕсли;
          Если ЗагрузитьВнешнююКомпоненту(Путь+"Formex.dll")=0 Тогда
             Предупреждение("Не удалось загрузить FormEx !",20);      
          КонецЕсли;
       КонецПопытки;
       
       Попытка      
          ЗагрузитьВнешнююКомпоненту(Путь+"StrMatch.dll");
          оПоиск = СоздатьОбъект("AddIn.StrMatchExtension");   
          оПоиск.ВесЧисел=1;
       Исключение
          Сообщение = "Не удалось загрузить компоненту ""StrMatch.dll""" + РазделительСтрок + "ВНИМАНИЕ! Компонента требует для работы mfc71.dll и msvcr71.dll, проверьте их наличие";
          Предупреждение(Сообщение, 10);
       КонецПопытки;
    КонецПроцедуры   // ПриОткрытии

    Показать полностью

    Reply ↓
  5. artbear

    (4) Опять не совсем точно.

    Загрузку ВК лучше проверять через создание какого-нибудь объекта ВК

    .

    Код
    Функция ЗагрузитьВК(ПутьДллФайла, ИмяОбъектаДляПроверки = "")
       Попытка
          лВремОбъект = СоздатьОбъект(ИмяОбъектаДляПроверки);
       Исключение                  
          Если ЗагрузитьВнешнююКомпоненту(ПутьДллФайла) = 0 Тогда
             Сообщить("Не удалось загрузить ВК "+ПутьДллФайла, "!!!");
             //Сообщить("  Тестирование завершилось неудачей", "!!!");
             Возврат 0;
          КонецЕсли;
       КонецПопытки;
       Возврат 1;
    КонецФункции

    Показать полностью

    Reply ↓
  6. JohnyDeath

    (5) Артур, а в чём неточность?

    Вот тут пытается создать объект:

    Код
    Попытка
          МетаИнфо=СоздатьОбъект("MetaInfoClasses"); 

    Показать полностью

    Но нам нужно ж не абы какую 1с++, а именно 3.0.0.0, поэтому дальше делаем проверку:

    Код
     НомВерСтр=МетаИнфо.ПолучитьВерсию(НомВер);
          Если НомВер<"3.0.0.0" Тогда 

    Показать полностью

    Хотя и 3.0.0.0 не абы какая нужна, но вы так и не договорились ставить билды на 3.0

    Или меня не туда понесло?

    Reply ↓
  7. JohnyDeath

    +(6) в 3.0 пока нет никаких новых объектов, которых не было бы в 2.5

    Reply ↓
  8. artbear

    (6) Да я про загрузку ФормЕкс говорю 🙂

    Ведь она также уже может быть загружена ? 🙂

    Причем версии также различаются 🙂

    Поэтому и привел универсальную функцию загрузки ВК

    Reply ↓
  9. CheBurator

    Зачет! +1

    Давно сам такую хотел сделать, ибо нужно часто…

    Езе бы прикрутить некоторое усовершенстование, типа на вход через параметры передаем «входной набор» (м.б. элемент справочника, м.б. строка+тип справочника+имя реквизита и т.д.) — на выходе получаем «выжимку» — т.е. похожее на входные данные — тогда 1С++ можно будет продуктивно заюзать вот здесь: http://infostart.ru/profile/174/projects/393/

    Reply ↓
  10. CheBurator

    «разработчиков компанент», «компанента» — это не от слова «компАния»… 😉

    Reply ↓
  11. JohnyDeath

    (9) мне пока не надо, поэтому: «кто хочет — пусть делает, всё открыто и доступно» 😉

    (10) принято

    Reply ↓
  12. adapter

    ну смотрю по функционалу и интерфейсу все как у меня. Только я свою обработку несколько лет назад сделал и без всяких внешних компонент. Поиск может выкидывать слова-паразиты, например ООО, ОАО в контрагентах, можно прерывать выполнение по esc с сохранением результатов. Код открытый, универсальная

    http://www.infostart.ru/profile/19126/projects/1732&ref=19126

    Reply ↓
  13. noprogrammer

    (12) Adapter — Единственное с чем можно согласится — так это с тем что ваша обработка не использует внешних компонент, так ведь весь смысл данной разработки в использование ВК 🙂 Использование ВК позволяет сделать интерфейс приятнее а скорость работы обработки быстрее (на порядок быстрее имхо)

    Reply ↓
  14. JohnyDeath

    (12) да, я видел твою обработку: приятная и без ВК. После того, как я не смог сделать следующее: поменять местами заменяемое с замещаемым, поменять один из заменяемых элементов, перетащить строку вверх, сортировать по различным колонкам и т.д. , решил написать вот это. К тому же, как заметил Костя, скорость работы намного выше! Попробуй. И я не понимаю, почему нельзя загрузить пару ВК?? Лучше сидеть на ущербном интерфейсе и со «встроенной» скоростью? П.С. да, интерфейс и пару идей подсмотрел у тебя 😉

    Reply ↓
  15. O-Planet

    (14) А мою по поиску и замене повторяющихся контрагентов видел? 😉

    Reply ↓
  16. JohnyDeath

    Нет, не видел. Покажи.

    Чем лучше?

    Reply ↓
  17. JohnyDeath

    (15) нда, Олег, посмотрел… А ты, видать на мою даже не взглянул. Если бы ты это сделал, то, как мне кажется, не задал бы такого вопроса.

    Reply ↓
  18. O-Planet

    Да я без умысла какого. Просто спросил и все. У тебя оно по-любому должно быть круче, потому что ВК хорошие используешь. Я — только стандартными средствами, кое-где приходится просто-таки измудряться. Собственно, меня моя устраивает. Периодически у разных клиентов с ее помощью чищу базенки и забираю мани.

    Reply ↓
  19. JohnyDeath

    Да я тож не злорадствовал. 😉

    ИМХО, самые большие минусы твоей обработки:

    1) не видать статус выполнения, т.е. сколько осталось до конца обработки;

    2) неужели ты чистил только «Контрагентов»?!

    Reply ↓
  20. DRY

    эх, жаль обработка некорректно работает с другими конфигами( Именно в том справочнике в котором есть дубли по кнопке «Начать сканирование» ничего не происходит. А так конечно крутая штука 😉 Спасибо.

    Reply ↓
  21. JohnyDeath

    (20) а можешь поподробнее? Пробывал на нескольких конфах — всё работает.

    Reply ↓
  22. DRY

    (21) Вообщем парадокс конечно, работает со всеми справочниками кроме одного, который как раз нужен.. объект вроде создаётся, но когда вызывается метод ВыбратьЭлементы() возвращается 0, хотя справочник точно заполнен. Это ошибка НЕ обработки! тут что-то другое, первый раз такое вижу..

    Reply ↓
  23. JohnyDeath

    (22) а он, случайно, не подчинен другому справочнику?

    Reply ↓
  24. DRY

    каюсь, подчинен 🙁

    Reply ↓
  25. DRY

    огромное спасибо за открытый код! теперь все работает 😉

    Reply ↓
  26. JohnyDeath

    На здоровье 😉

    Reply ↓
  27. Nastena

    СПАСИБО ОГРОМНОЕ!

    И от меня и от начальника ОК

    Reply ↓
  28. Evgeniy

    Обработка супер, но для полного счастия печати нехватает по дублям:(

    Reply ↓
  29. JohnyDeath

    (28) не проблема. Там же все данные в ТЗ хранятся. Нарисуй в каком виде тебе это видится и я прикручу. Если сделаешь мекетик-шаблон mxl вообще замечательно будет ( и тебе и мне 😉 )

    Reply ↓
  30. Evgeniy

    (29) Проблемы нет конечно, просто странно что до сих пор нет такой возможности.

    Ну значит счас внесу свой вклад в эту хорошую обработку:)

    Reply ↓
  31. Поручик

    Мдя, хороший пример того, что в восьмёрке можно реализовать штатными средствами без кучи ВК. Впрочем за классную работу плюс.

    Reply ↓
  32. ketr

    скажите пожалуйста, а если у меня 2 одинаковых контрагента (код разный, наименование одинаковое). По обоим были проводки — я смогу удалить одного из них, а на другого перекинуть все движения?

    Reply ↓
  33. JohnyDeath

    (32) Да, для этого существует обработка от 1С «RepVal.ert» (замена значений), которая вызывается по кнопке «Замена значений»

    Reply ↓
  34. Ёпрст

    (32) сможешь

    (31) что именно можно в 8-ке реализовать штатными средствами?

    Нечеткое сравнение строк ?

    Reply ↓
  35. JohnyDeath

    (31) кстати да, что в 8-ке можно реализовать штатными средствами?

    Reply ↓
  36. Поручик

    (34) Ёпрст! Не поверишь!

    В любой туповой конфе есть штатная обработка «Поиск и замена дублирущихся элементов» с настройкой уровня сходства слов и режимом поиска «По похожим словам».

    Reply ↓
  37. JohnyDeath

    (32) (в добавлении к вышесказанному)

    Эта обработка по сути и создавалась для таких вот случаев, когда Контрагент вроде бы один и тот же, а бухи создали две его копии и каждый выбирает в документах разного, а потом возмущаются: почему у нас не сходится баланс! 😀

    Reply ↓
  38. JohnyDeath

    (36) Хм.. надо будет посмотреть как там оно внутри.

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

    Reply ↓
  39. Поручик

    (35, 34), работает без кучи ВК.

    Reply ↓
  40. Ёпрст

    (36) не смотрел..ибо особо снеговиком не увлекаюсь..

    Reply ↓
  41. Ёпрст

    +40 Посмотрел.. Рекдостная гадость в снеговике..

    Reply ↓
  42. Ёпрст

    +41 «Молоток» и «Молоток красный» ужо никогда не найдет..

    Reply ↓
  43. swimdog

    Попробовал удалить лишнюю номенклатуру, совпадение 100%. Нашло много одинаковых элементов, но проставила их так, что repval отказался заменять, говоря что некоторые значения указаны несколько раз. Мне кажется можно сделать так: есть 3 одинаковых товара, для понятности назовем их майка(1), майка(2), майка(3). В первую колонку ставим майка(1), майка(2). Во вторую два раза майка(3). Таким образом repval ругаться не будет. В моем случае товары ставяться так: в первой колонке 2 раза майка(1), во второй майка(2) и майка(3). Программа естественно говорит о нецелесообразности двойной замены одного товара.

    П.С. Менять руками очень утомительно, так как номенклатура очень большая.

    П.С.(2) У меня есть переписанная версия для замены в операциях документов без перепроведения документов. Если надо, то могу прислать.

    Reply ↓
  44. JohnyDeath

    (43) Понимаешь, у тебя частный случай. И таких случаев можно придумать вагон. Поэтому о том что и чем заменять отдано на откуп пользователю. Я так понял, что у тебя в результате сверки получается примерно так:

    ЧтоМеняем | На что меняем

    ______________________________

    Майка(1) Майка(2)

    Майка(1) Майка(3)

    ты же хочешь видеть:

    ЧтоМеняем | На что меняем

    ______________________________

    Майка(1) Майка(3)

    Майка(2) Майка(3)

    Для этого просто тыкаешь в первой строке второй колонке (на Майке_2) и выбираешь Майку_3. Аналогично во второй строке первой колонке.

    Мне кажется, что не так уж и трудно.

    Reply ↓
  45. JohnyDeath

    Можно, конечно прикрутить что-то типа «буфера похожести» в виде отдельного списка. Будет работать примерно так: при активизации строки «Майка(1) Майка(2)» в этом буфере высвечивается элементы: Майка(1), Майка(2), Майка(3). Затем нужный нам элемент из этого буфера тащим в нужную нам колонку («ЧтоМеняем» либо «НаЧтоМеняем»).

    Других вариантов я пока не вижу.

    Reply ↓
  46. swimdog

    (44) руками делать не вариант, так как позиций очень много. А случай не частный. Для него достаточно чтобы одинаковых позиций было больше двух. У меня есть идея, если получиться — напишу.

    Reply ↓
  47. Altair777

    Справочник Контрагенты — очень много «ложных» срабатываний. Когда фамилии разные, а ИО одинаковые 🙂

    Reply ↓
  48. drako

    Отличная обработка и довольно шустро работает. Спасибо.

    Было бы еще неплохо добавить в таблицу дополнительное поле с реквизитом справочника, на выбор пользователя, кабы последнему было проще определиться в вопросе «дубль или не дубль». Например для контрагентов: «УНП».

    И еще полезна бы была кнопочка быстрой замены местами «что на что меняем».

    Еще раз спасибо за обработку.

    Reply ↓
  49. FIZIK

    Давно изобретаю велосипеды, жалею что не наткнулся раньше. Спасибо!

    Reply ↓
  50. snip

    100% совпадение номенклатуры ищет?

    и как со скоростью работы?

    если справочник номенклатуры порядка 10-12 тыся элементов?

    Reply ↓
  51. snip

    подскажите repval где можно взять?

    на диске ИТС имеется?

    Reply ↓
  52. JohnyDeath

    (50) Делал давно и с 7.7 уже практически не работаю, поэтому отвечаю «напамять».

    100 % совпадение вроде бы ищет, но она не совсем для этого была изначально, т.к. полное совпадение очень просто и намного быстрее найти прямым запросом (или на худой конец встроенным поиском по наименованию).

    На выборке в 10-12 тыс. проверить не могу. Лучше один раз скачайте и попробуйте.

    (51) repval — да, по-моему на ИТС-е должна быть

    Reply ↓
  53. post84d

    Ребята подскажите пожалуйста такая ситуация -В XP работает все нормально, а в Windows 7 не может загрузить компоненту StrMatch.dll. Библиотеки (StrMatch.dll, mfc71.dll и msvcr71.dll) скопированы как и в XP в system 32? папку Bin в Prog. Files и на всякий случай в Каталог ИБ. Все кто знает подскажите что может быть, буду очень признателен. Заранее всем спасибо.

    Reply ↓
  54. Ёпрст

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

    Reply ↓
  55. post84d

    (54) Ёпрст, спасибо большое за помощь! Выполняю команду regsvr32.exe mfc71.dll — выдает сообщение:

    «Модуль mfc71.dll загружен, но не удалось выполнить вызов DLLRegisterServer. Проверьте что mfc71.dll является правильным файлом Dll или OCX и повторить попытку.

    ОС- Windows 7 начальная, 32 разрядная. запускаю на нетбуке

    Reply ↓
  56. Ёпрст

    mfc71.dll — это что за зверь такой ?

    Reply ↓
  57. post84d

    (56) Ёпрст, Точно не могу сказать для чего именно это библиотека.. — без нее не будет работать StrMatch.dll В описании обработки по которой ведется обсуждение здесь:

    Порядок установки:

    1. Если у вас нет в папке «{КаталогГдеУстановленаWindows}System32» файлов MFC71.dll и msvcr71.dll скопируйте их туда из прикрепленного архива «System32.rar» (необходимы для нечеткого поиска)

    Reply ↓
  58. Ёпрст

    (57) регить вк нужно от имени лок. админа (или админа домена)

    можешь и ярлык создать с регистрацией и его запустить от имени админа.

    Reply ↓
  59. Ёпрст

    или cmd запустить от имени админа и там зарегить

    Reply ↓
  60. post84d

    (59) Ёпрст, Нет разумеется я регистрирую с Админскими правами. Вот и хотел спросить здесь, точно ли можно эти библиотеки применять в Windows 7? в XP работает все без нареканий. Если 100 % работают, то искать в другом месте- может конфликт какай то создается. Еще раз спасибо вам за отклик.

    Reply ↓
  61. proger1c81

    как ограничить поиск дублей? поясню: например у меня наименование состоит из 7 слов, разделенных пробелом. Эта обработка мне показывает дубли даже, когда совпадает только одно слово. Хотелось бы ограничить поиск дублей до различия только в одном двух знаках. Как это лучше сделать? заранее спасибо за ответ.

    Reply ↓
  62. JohnyDeath

    (61) «Похожесть» двух строк сравнивает ВК StrMatch.dll. Там наверное так зашито. Степенью похожестью игрались? Если да, то я тут ничем помочь не смогу. Да и 7.7 у меня уже нигде не осталось (

    Reply ↓
  63. proger1c81

    (62) (63) artbear, спасибо. Я так тоже подумал, что зашито.

    Reply ↓
  64. Anyxwar

    Товарищи,кто нибудь использовал данную библиотечку под 64 разрядную винду,к примеру 7,у меня ругается говорит что это версия для 32 разрядной винды?

    Reply ↓
  65. Sanario

    А почему бы не выложить все это одним файлом в архиве?

    Reply ↓
  66. JohnyDeath

    (66) это всё выкладывалось еще в те времена, когда небыло никаких инфо-денег. Попробую переложить. Но ВК StrMatch я где-то на просторах интернета находил. Наверное на проклубе.

    Reply ↓
  67. JohnyDeath

    (66) Добавил единый архив

    Reply ↓

Leave a Comment

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