Имя: Пароль:
1C
1С v8
Поиск данных по похожим словам
, , , , , , ,
0 ХочуСпец
 
20.09.11
08:58
Доброе утро
Пользуюсь встроенной обработкой "Поиск и замена дублирующихся элементов".
В частности, произвожу поиск по похожим словам в справочнике Контрагенты. Этот справочник имеет 80 000 записей. Поиск происходит оч долго, по моим подсчетам около 15-20 дней. Может есть какой нибудь другой механизм? Или же выгружать все записи в Excel и производить поиск уже в нем с помощью какого либо механизма? Киньте идею
спасибо
1 Rizhij_Nikitos
 
20.09.11
09:09
Не настаиваю пользоваться моей идея и она может быть глупой. а как появилась цифра 15-20 дней? 80 000 элементов? Можно циклом сделать так, для начала выбираешь все элементы это по времени займет секунд 5-10 не более.
Потом в этой выборке организовываешь цикл следующим образом:

Элемент = Берем ПервыйЭлемент из выборки;
Пока Выборка.Следующий() Цикл
Элемент = Выборка Тогда {Твои действия замены}
// После того как с этим элементов прошал все элементы берешь следующий с которым не было действий  и прогоняешь уже по тем где не было действий, и так далее пока все выборку не прошел на проверку всех элементов, с каждым новым проходом количество проходимых элементов должно уменьшаться, как минмум на 1 элемент и более.
КонецЦикла;
2 Rizhij_Nikitos
 
20.09.11
09:09
Ну как то так, надеюсь вы поняли меня.
3 ХочуСпец
 
20.09.11
09:11
(1) цифра получилась из следующих соображений:
за 30 часов было выполнено около 5 процентов
4 ХочуСпец
 
20.09.11
09:12
(1) типовая обработка разбивает наименование на слова и по каждому из них производит поиск в базе
5 butterbean
 
20.09.11
09:15
(4) а тебе реально нужно найти такие дубли??
6 ХочуСпец
 
20.09.11
09:16
(5) реально
н-р, ЗАО Нева и Нева ЗАО является одним и тем же контрагентом
7 butterbean
 
20.09.11
09:20
(6) ну можно например сделать свою с похожим алгоритмом, только с фильтром по словам типа ЗАО, ООО и т.п.
8 ХочуСпец
 
20.09.11
09:21
(7) я привел всего лишь частный пример ) различия могут быть разные
9 Rizhij_Nikitos
 
20.09.11
09:21
а ты не пробывал стандартной функцией искать строку в подстроке, используя мой цикл.попробуй.
10 vmv
 
20.09.11
09:23
1. с мобильника всегда так долго, попробуй запустить обработку с нормального сервака
11 ХочуСпец
 
20.09.11
09:25
(10) как вариант можно попробовать
мой аппарат 2.4 Ггц, 2 Гб памяти
проблема в том, что сервак загружать нельзя (
12 zender
 
20.09.11
09:28
(0) напиши обработку использующие регулярные выражения
13 ХочуСпец
 
20.09.11
09:29
(12) а поподробнее
14 Eugeneer
 
20.09.11
09:29
(0) а слабо просмотреть типовую и оптимизировать? Там мождно все оптимизировать что сделает все за 10 минут
15 ХочуСпец
 
20.09.11
09:30
(14) если бы знал как не спрашивал
на мой взгляд типовая уже должна быть оптимизированной
16 YF
 
20.09.11
09:30
(0)а еще может быть:

ЗАО Невская косметика и ЗАО Невск-ая косметика ...
17 Septera
 
20.09.11
09:31
(6) ваще жесть, откуда ноги растут у таких Контрагентов?
18 ХочуСпец
 
20.09.11
09:31
(16) да и такое может вполне быть
19 Eugeneer
 
20.09.11
09:32
(15) это ты заблуждаешся..Я за 12 лет убедился что она не может быть оптимизированной.
20 ХочуСпец
 
20.09.11
09:33
(17) вообще общая база из 80 000 контрагентов получилась из слияния в нее 7 баз, а общего регламента по вводу контрагентов для пользователей не было
21 ХочуСпец
 
20.09.11
09:33
(19) да может и заблуждаюсь и как по вашему можно ее оптимизировать?
22 YF
 
20.09.11
09:34
(18) следовательно проще дать бухам разгребать - пусть точно укажут. например создадут группы в справочнике, по каждому настоящему контрагенту, а в нее дубли все положат
23 Сергей Д
 
20.09.11
09:35
Хехе :) На Оракле когда-то делал процедуру, вычисляющую степень совпадения строк.
24 ХочуСпец
 
20.09.11
09:35
(22) к сожалению это исключено, им как раз нужно выдать группы по похожим словам
25 ХочуСпец
 
20.09.11
09:36
может поможет обновление индекса?
26 YF
 
20.09.11
09:37
(24) Сами навводили -сами пусть и разгребают - 1, а то ты выдашь группы похожих - они и смотреть не будут, а потом скажут, что это ты так сделал и поэтому у них остатки из разных контрагннтов слились в одного ...
27 Septera
 
20.09.11
09:37
(19) только надо отличать "быть оптимизированной" и "иметь различные функции" для поиска, нужно функционал расширять...
28 Septera
 
20.09.11
09:37
(20) за такое слияние руки надо оторвать...
29 ХочуСпец
 
20.09.11
09:38
(28) кому? ) база готовится для РИБ, необходимо синхронизировать по возможности этих контрагентов
30 ХочуСпец
 
20.09.11
09:39
(26) полностью согласен, но ...
31 Septera
 
20.09.11
09:48
(29) вот за это РИБ я и не люблю
32 zender
 
20.09.11
09:57
33 Rizhij_Nikitos
 
20.09.11
10:04
(30) а ты что хочешь удалить похожих контрагентов и оставить одного?
34 ХочуСпец
 
20.09.11
10:05
решил воспользоваться полнотекстовым поиском
т.е. переберать контрагентов и для каждого производить поиск данных

(30) да
35 Rizhij_Nikitos
 
20.09.11
10:20
Ладно скажи,а че тебе не правится мой вариант смотри, берешь первым элемент разбиваешь на слова, и гонишь по цилу, если есть совпадение по всем словам, удаляешь что совпало идешь дальше, далее берешь второй элемент, который остался после форматирования тоже идешь до конца всех оставшихся элементов, с каждым проходом ты уменьшаешь количество элементов, то время исполнения идет быстрее, думаю все это будет сделано минут за 15 не более, и то 15 это много я примерно такое правда стркои из 3 слов были, все делалось для 40к ( но не в 1С, а в Delphi), и прям не успевал чай сделать )
36 ХочуСпец
 
20.09.11
10:23
(35) по словам не даст информативного результата
здесь еще должна быть нечеткость
н-р, "СтройИнвест" и "Строй-инвест" могут являться одним и тем же контрагентом
37 Sereja
 
20.09.11
10:23
(0) А Сравнивать всех пацанов по УНН не прокатит ? УНН ведь уникален
38 aleks-id
 
20.09.11
10:29
у нас один умелец так запустил обработочку... в результате совершенно разный товар с похожим наименованием слился в один. отголоски этого зоопарка доносятся даже сейчас, спустя 1.5 года после увольнения умельца...
39 ХочуСпец
 
20.09.11
10:34
(37) нет по ИНН и КПП не прокатит, не во всех контрагентах заполнен ИНН и КПП
40 Eugeneer
 
20.09.11
10:46
Сделай интерактивную форму
41 Eugeneer
 
20.09.11
10:48
Сделай свою обработку полнотекстового поиска
http://subsystems.ru/upload/iblock/151/1514f70aca2de02b772b52da447bcfdf.png

Выводишь таблицу. показывает все что нашла. По каждому контрагенту все совпадения. Все черточки и прочее можно игнорировать.

Все работает путем раскладывания наименований на слова.
Ограничить выборку достаточно легко по алгоритмам.
42 Eugeneer
 
20.09.11
10:48
Еще контрагентов легко обрабатывать по ИНН.
43 ХочуСпец
 
20.09.11
10:49
(41) да я так и решил сделать (34)
спс
44 Eugeneer
 
20.09.11
10:49
(39) так оцени. сколько таких. Может получится что 85 процентов сработает по ИНН, а это уже дохрена.

Короче надо действовать логическими методами и методом исключений.
45 Eugeneer
 
20.09.11
10:51
Все разнообразие будет сложно написать полностью автоматом. Все может получится методом исключений. 85 по ИНН, остальные полнотекстовым поиском, остаток который никак - ручками.
46 ХочуСпец
 
20.09.11
10:59
(45) да по ИНН было неплохо, но эти суки (пользователи) как оказалось нового контрагента создавали путем копирования, не меняя ИНН. Руки бы поотрывать
47 Eugeneer
 
20.09.11
11:00
Пипец конечно. Ну что те сказать. Пусть руками все делают.
48 Septera
 
20.09.11
11:06
(46) ага... все таки немного прав я был в (28) =)))
49 Ткачев
 
20.09.11
11:52
Функция РазбитьНаименование(Наим)
   
   Наимен = СокрЛП(Наим);
   Масс = Новый Массив;
   Стр = Найти(Наимен, " ");
   Пока Стр <> 0 Цикл
       Масс.Добавить(Лев(Наимен, Стр - 1));
       Наимен = Сред(Наимен, Стр + 1);
       Стр = Найти(Наимен, " ");
   КонецЦикла;
   Масс.Добавить(Наимен);
   Возврат Масс;
   
КонецФункции

Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
   
   Спр = Справочники.Номенклатура.Выбрать(,,,"Код");
   Запрос = Новый Запрос;
   КоличествоСловДляСовпадения = 0;
   Пока Спр.Следующий() Цикл
       Если Не Спр.ЭтоГруппа И Не Спр.ПометкаУдаления Тогда
           Запрос.УстановитьПараметр("Код", Спр.Код);
           Наименование = РазбитьНаименование(Спр.Наименование);
           КолВо = Наименование.Количество() - 1;
           Если КоличествоСловДляСовпадения = 0 Тогда
               КСДС = КолВо - 1;
           Иначе
               КСДС = КоличествоСловДляСовпадения;
           КонецЕсли;
           Для Аб = 0 По КолВо - КСДС - 1 Цикл
               Стр = "";
               Для Аа = 0 По КолВо - Аб Цикл
                   Стр = Стр + "    И Номенклатура.Наименование ПОДОБНО &Наим" + Аа + "
                   |";
                   Запрос.УстановитьПараметр("Наим" + Аа, "%" + Наименование.Получить(Аа) + "%");
               КонецЦикла;
               Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
               |    Номенклатура.Ссылка
               |ИЗ
               |    Справочник.Номенклатура КАК Номенклатура
               |ГДЕ
               |    Номенклатура.Код > &Код
               |    И Номенклатура.ПометкаУдаления = ЛОЖЬ
               |    //Строка
               |УПОРЯДОЧИТЬ ПО
               |    Номенклатура.Код";
               Запрос.Текст = СтрЗаменить(Запрос.Текст, "//Строка", Стр);
               Результат = Запрос.Выполнить().Выбрать();
               Если Результат.Следующий() Тогда
                   Сообщить(Спр.Код + " """ + Спр.Наименование + """ = " + Результат.Ссылка.Код + " """ + Результат.Ссылка.Наименование + """");
                   Прервать;
               КонецЕсли;                
           КонецЦикла;            
       КонецЕсли;
       ОбработкаПрерыванияПользователя();
   КонецЦикла;

КонецПроцедуры
50 Злопчинский
 
20.09.11
11:55
(41) индекс полнотекстового поиска обновляется сразу при вводе нового клиента или там два индекса вроде - один временный дл яоперативно введенных и потом переносится в полнотекстовый..?
51 Goggy
 
20.09.11
11:57
По ИНН сравни и остальных которые без ИНН обработкой руби своей, считай уже сутки сэкономил :)
52 Базис
 
naïve
20.09.11
12:12
В excel выгрузи, отсортируй по ИНН - увидишь дубли.
Запрети выбирать и создавать контрагента без ИНН, включи контроль уникальности ИНН, юзеры за месяц сами исправят базу, потом только одному дай право изменять записанных контрагентов.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн