Имя: Пароль:
1C
1C 7.7
v7: Как искать в справочнике ? Есть ли что-то типо % LIKE % ?
, ,
0 sysadminlk
 
23.11.13
16:48
Есть справочник контрагенты. Там есть поле реквизит Адрес

Как с можно искать?

Например есть адрес:
5 мкр. дом 6  кв.52
Я хочу в строке поиска обработки забить
5 6 52
и чтоб мне выдало где встречается одновременно 5 6 52, по идее в списке будет нужный мне адрес

Или вот еще адрес: Московская ул. дом 162  кв.9
Я хочу написать в поиске Московс 162 9

И чтоб в результате был нужный мне адрес.

Как реализовать?
1 ДенисЧ
 
23.11.13
16:49
1с++
2 Диманыч
 
23.11.13
17:01
Используй функцию Найти("где ищем","что ищем")
3 Диманыч
 
23.11.13
17:05
(1) TSQL
4 sysadminlk
 
23.11.13
17:05
Она долго ищет
5 Холст
 
23.11.13
17:09
6 Диманыч
 
23.11.13
17:12
(4) А тебе насколько быстрее нужно, для быстрого поиска создаются индексы. Или оптимизация
7 Aleksey
 
23.11.13
17:12
(4) 1sqlite
8 sysadminlk
 
23.11.13
17:13
Я щас вот так сделал.
Но хочется быстрее искать.

Справочник 200000 записей.

Процедура НайтиЭл()
    Ра = Разобрать(Врег(СловоПоиска));
    Если Ра.КоличествоСтрок() < 2 Тогда
        Предупреждение("Нужно хотябы два слова",3);
        Возврат;
    КонецЕсли;
    СписокРезультатов = СоздатьОбъект("СписокЗначений");
    Спр = СоздатьОбъект("Справочник.Абоненты");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        НетЭтогоСлова = 0;
        Ра.ВыбратьСтроки();
        Пока Ра.ПолучитьСтроку() = 1 Цикл
            Адрес = Врег(Спр.АДРЕС);
            Если Найти(Адрес,Ра.Слово) = 0 Тогда
                НетЭтогоСлова = 1;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если НетЭтогоСлова=1 Тогда
            Продолжить;
        КонецЕсли;
        СписокРезультатов.ДобавитьЗначение(Спр.ТекущийЭлемент(),Спр.АДРЕС);        
    КонецЦикла;
    Выб="";
    СписокРезультатов.СортироватьПоПредставлению();
    Если СписокРезультатов.ВыбратьЗначение(Выб,"Результат поиска",,20)=1 Тогда
        Сообщить(ТипЗначенияСтр(Выб));
    КонецЕсли;
КонецПроцедуры    // НайтиЭл
9 Aleksey
 
23.11.13
17:13
(5) там юзается 1с++ (1cpp.dll.) о которой тебе еще в (1) сказали
10 Диманыч
 
23.11.13
17:24
(8) Делай через запрос

В запросе условие  с фунцией поиска работает быстрее
11 Холст
 
23.11.13
20:10
(9) не путай меня с ТС
12 Guk
 
23.11.13
20:20
(0) переходите на восьмерку. там есть полнотекстовый поиск...
13 ДенисЧ
 
23.11.13
20:48
(12) восьмёрка - сырое неделанное подели.
14 sysadminlk
 
24.11.13
15:24
Пока еще актуально.
15 КонецЦикла
 
24.11.13
15:28
(8) Тебе по двум словам, которые есть одновременно надо искать? По любому вхождению?
16 sysadminlk
 
24.11.13
15:32
по всем словам сразу
17 КонецЦикла
 
24.11.13
15:34
По вхождению?

нашлось

вася пупкин лимитед
киндзадза астрероид инк

набрано

ас кин

так?
18 sysadminlk
 
24.11.13
15:37
да
19 GreyK
 
24.11.13
15:47
(17) Простым запросом делал?
20 Пенза58
 
24.11.13
15:51
(0) Создать доп поле в которое при заполнении адреса будет заносится:5 6 52
21 КонецЦикла
 
24.11.13
16:04
(18) Самое простое и тупое - сделать like 2 раза, первый раз запихнув во временную таблицу :)
(19) По-разному делал
22 Mikeware
 
25.11.13
11:41
23 КонецЦикла
 
25.11.13
11:47
Ему по двум фрагментам сразу надо
24 ОдинСерый
 
25.11.13
11:49
(0) гыыыы
за яйки вешать надо тех кто адрес так делает.
программист ты или где? надо отдельно улица дом кв и искать будет по трем полям.
25 Mikeware
 
25.11.13
11:49
(23) на верхней картинке - по двум (точнее, хоть по скольки)
а на нижней - по контрагенту (класс почти один и тот же).
лень картинки скриншотить...
26 Builder
 
25.11.13
11:55
Делал без ВК, принцип такой:
Раскладываем строку на несколько.
Делаем запрос по каждой строке через условие "И".
В базе SQL на справочнике номенклатуры 90 тыс ищет 1-2 сек.
Как то так:

    СтрПоиска = нрег(СокрЛП(СтрокаПоиска));
    
    ТекстУсловия="";
    
    Для К=1 По 100 цикл
        Н=Найти(СтрПоиска," ");
        Если Н=0 Тогда
            Слово=СокрЛП(СтрПоиска);
            Если ПустаяСтрока(Слово)=0 Тогда
                ТекстУсловия = ТекстУсловия+"
                |Условие("""+Слово+""""+ " в нрег(Наименование));";
            КонецЕсли;
            Прервать;
        КонецЕсли;
        Слово=СокрЛП(Сред(СтрПоиска,1,Н-1));
        СтрПоиска = Сред(СтрПоиска,Н+1);
        Если ПустаяСтрока(Слово)=0 Тогда
            ТекстУсловия = ТекстУсловия+"
            |Условие("""+Слово+""""+ " в нрег(Наименование));";
        КонецЕсли;
    КонецЦикла;
    
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Наименование = Справочник.Товары.Наименование;
    |ТекущийЭлемент = Справочник.Товары.ТекущийЭлемент;
    |Группировка ТекущийЭлемент без групп;
    |Без итогов;";
    ТекстЗапроса = ТекстЗапроса + ТекстУсловия+"
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

27 ОдинСерый
 
25.11.13
12:30
(26)
раскладывать ничего не надо надо просто делать справочник улиц, его даже и делать не надо он должен быть и так если у вас есть зарплата то там выгрузка в пенсионный там даже справочник свой жесткий был КЛАДР.. вы даже похоже этого не знаете спецы млин.
28 Mikeware
 
25.11.13
13:09
(27) речь может идти не обязательно об адресном справочнике.
29 Builder
 
25.11.13
14:48
(27) Это к чему было? Причем тут улицы?
30 Масянька
 
25.11.13
14:55
(26) Похоже на поиск в инете :) Следующий шаг - web-броузер на 1С :))))))
(29) Ну, не понял человек, чего надо :))))
31 Mikeware
 
25.11.13
14:57
(30) "на 1с" не делаи, а вот "в 1с" - делали
32 sysadminlk
 
25.11.13
16:01
(22) ощень нама интересно как такое сделать...
33 Mikeware
 
26.11.13
07:48
(32) с учетом "Возникла необходимость закрыть исходный код конфигурации.
Продаю конфигурацию и не хочу чтоб ее изменяли без меня." - могу продать. :-)
Закон Брукера: Даже маленькая практика стоит большой теории.