Имя: Пароль:
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 выгрузи, отсортируй по ИНН - увидишь дубли.
Запрети выбирать и создавать контрагента без ИНН, включи контроль уникальности ИНН, юзеры за месяц сами исправят базу, потом только одному дай право изменять записанных контрагентов.