Имя: Пароль:
1C
1C 7.7
v7: Как облегчить поиск в номенклатуре 1с? (режим пользователя)
,
0 rikko999
 
25.03.17
14:49
В программе 1с Торговля и Склад работаю на складе бытовой техники. В базе содержится инфа по товарам. В поле наименование товара прописан и производитель товара, и серия и название и доп. числовые характеристики. И нет определенного порядка что первое что второе что третьеи т.д. Т.е. вначале может идти как производитель, так и серия, так и др. характеристики. Например:
1)asus eee pc ноутбук 1225b 4 кг
2)ноутбук 3кг asus eee pc X101CH
И проблема в том что поиск в номенклатуре чувствителен к порядку слов в запросе. Например если вбить в поиске: ноу%4%asus%ee%122% (напоминаю знак процента при поиске заменяет любое количество любых символов) - ничего не будет найдено. Поэтому иногда очень тяжело найти товар в базе.
Вопрос: как можно облегчить поиск? Может есть какие -то еще операторы облегчающие поиск как %? Такие чтоб позволяли искать без соблюдения порядка слов?
Или вообще другие варианты? Что думаете?
1 Aleksey
 
25.03.17
14:54
разбивать на строки и искать через и
2 Aleksey
 
25.03.17
15:01
РазбиваемаяСтрока = "ноу asus ee 122"

РазбиваемаяСтрока=СтрЗаменить(СокрЛП(стрПоиска)," ",РазделительСтрок);
текст="SELECT id [Товар :Справочник.Номенклатура] FROM Товары WHERE isfolder=2 and ismark <> '*'";    

Для Индекс=1 По СтрКоличествоСтрок(РазбиваемаяСтрока) Цикл
   Слово=СтрПолучитьСтроку(РазбиваемаяСтрока,Индекс);
   Если ПустоеЗначение(Слово)=0 Тогда
      текст=текст+" AND (descr LIKE '%"+Слово+"%')";
   КонецЕсли;
КонецЦикла;

тз=запрос.ВыполнитьЗапрос(текст);

P.S. код для 1CSqlite, запрос уже сам поправишь под свои нужды
3 vcv
 
25.03.17
15:29
Много раз видел в магазинах бытовой техники, что продавец не ищет товар, а берёт ценник с товара и сканирует штрихкод. Это если покупатель пальцем тычет "вот это". Или, если покупатель просит подобрать на компьютере, делает как обычно организовано на сайтах - открывает раздел, указывает критерии поиска типа производителя и вперёд глазами по результатам поиска.

Вы бы уточнили, какая именно версия 1С. Пишете "Торговля и склад", однако в типовой 1С никогда в жизни не было поиска с метасимволами типа "ноу%4%asus%ee%122%".
4 rikko999
 
25.03.17
15:55
Aleksey, это же режим пользователя, а не режим конфигурации. Я так понял вы предложили код нового поиска? Не думаю что там есть доступ к коду конфигурации. Да наверно и не разрешат мне что-то менять в конфигурации...

vcv, вы правы я навскидку  написал название. В понедельник уточню.

Я вот нашел кажется решение:
оператор РЯДОМ/n (NEAR/[+/-]n) поиск данных, содержащих в одном реквизите указанные слова с учетом морфологии на расстоянии n слов между словами. Знак указывает, в каком направлении от первого слова будет искаться второе слово (+ (плюс) – после первого; - (минус) – до первого слова). Если знак не указан, то будут найдены данные, содержащие указанные слова на дистанции n слов друг от друга. Порядок слов не имеет значения.

Примеры:
фен РЯДОМ/3 воздух – будут найдены данные, в которых слово воздух находится на расстоянии не более трех слов до или после слова фен.

Что думаете? И кст этот оператор работает в любой версии 1с?
5 Djelf
 
25.03.17
16:10
(4) Без доступа к коду ничего не получится.
В режиме пользователя на 99.99% ничего тут не изменить.

В (3) правильно подмечено - подобный синтаксис не используется в стандартных конфигурациях 1с.
Но если используется "%" то это скорее всего прямой запрос с like и в (2) самое простое решение.
Хотя возможно в коде тупой перебор таблицы и имитация like.

А вариантов навалом: перейти на regexp/pcre или искать с помощью strmatch http://catalog.mista.ru/public/237186/

Но все это потребует доступа к коду.
6 Aleksey
 
25.03.17
16:34
(4) В программе ТиС 7.7 нет ни % в поиски ни оператором рядом.
Либо мы говорим не про 1с, либо на лицо использование внешней компоненты
7 Djelf
 
25.03.17
17:20
(6) Чего это не про 1с и не про 7.7?
Если в таблице не 100500 записей то и такая гадость будет работать (~0.04мс времени поиска на запись).
"РЯДОМ" тоже не так уж и затратно по времени.

    тзНоменклатура=СоздатьОбъект("ТаблицаЗначений");
    тзНоменклатура.НоваяКолонка("Номенклатура");
    СтрШаблон= Врег(СокрЛП(ШаблонПоиска));
    сзШаблон = глРазложить(СтрШаблон,"%");
    СпрНоменклатура=СоздатьОбъект("Справочник.Номенклатура");
    СпрНоменклатура.ВыбратьЭлементы();
    Пока СпрНоменклатура.ПолучитьЭлемент() = 1 Цикл
        Наименование=Врег(СпрНоменклатура.Наименование);
        ВсеНайдено=0;
        Для ии=1 По сзШаблон.РазмерСписка() Цикл
            Позиция=Найти(Наименование,сзШаблон.ПолучитьЗначение(ии));
            Если Позиция=0 Тогда Прервать; КонецЕсли;
            Наименование=Сред(Наименование,Позиция);
            ВсеНайдено=ВсеНайдено+1;
        КонецЦикла;
        Если ВсеНайдено=сзШаблон.РазмерСписка() Тогда
            тзНоменклатура.НоваяСтрока();
            тзНоменклатура.Номенклатура = СпрНоменклатура.ТекущийЭлемент();
        КонецЕсли;
    КонецЦикла;
8 Злопчинский
 
25.03.17
17:51
у меня есть для файловой базы поиск как в (2) на SQLite
еще есть типа как в (7)

    Запрос = СоздатьОбъект("Запрос");

    РазбиваемаяСтрока     = ПодСтрокаПоиска;    
    РазбиваемаяСтрока    = СтрЗаменить(РазбиваемаяСтрока,"'","");
    РазбиваемаяСтрока    = СтрЗаменить(РазбиваемаяСтрока,"""","");
    РазбиваемаяСтрока     = СтрЗаменить(СокрЛП(РазбиваемаяСтрока)," ",РазделительСтрок);
    
    ТекстЗапроса ="
    |Без Итогов;
    |ТекущийЭлемент = Справочник.*.ТекущийЭлемент;" +
    РеквизитПоиска + " = Справочник.*." + РеквизитПоиска + ";
    |Группировка ТекущийЭлемент Без Упорядочивания Без Групп;";
    
    Для Индекс = 1 По СтрКоличествоСтрок(РазбиваемаяСтрока)
    Цикл Слово = ВРег(СтрПолучитьСтроку(РазбиваемаяСтрока,Индекс));
        
        Если  ПустоеЗначение(Слово)=1
        Тогда Продолжить;
        КонецЕсли;    
        ТекстЗапроса = ТекстЗапроса+"
        |Условие(Найти(ВРег(" + РеквизитПоиска + "),"""+Слово+""")>0);";
    КонецЦикла;
    
    ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"*",ВидСправочника);
    
    //_время1 = _GetPerformanceCounter();
    Если  Запрос.Выполнить(ТекстЗапроса) = 0
    Тогда Возврат;
    КонецЕсли;
    //Сообщить((_GetPerformanceCounter()-_время1)/1000);
9 Злопчинский
 
25.03.17
17:53
(0) если доступа к конфигуратору нет - то не смертельно
внешняя обработка с полем для ввода и ищет...
главное чтобы обработку можно было открыть
10 Хилый
 
25.03.17
17:57
(0) Навести порядок в базе, привести наименование к общему шаблону, новый товар заводить согласно новому шаблону - не предлагать?
11 Aleksey
 
25.03.17
18:27
(7) описание рядом это из языка запросов полнотекстового поиска в данных,который в 8-ке. А в сабже речь про 7-ку
12 Web00001
 
25.03.17
18:34
Не знаю про какую торговлю говорит ТС, в УТ10.3 при поиске номенклатуры спецсимволы типа "%" экранируются и не приносят такого эффекта на который рассчитывает ТС.
13 Web00001
 
25.03.17
19:46
(12)тьху 77 же, ну..
14 Djelf
 
25.03.17
20:43
(8) Для файловой в 1sqlite прикольнее regexp. Как то так http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/863#863

Вот интересно - егаис научил юзверей читать xml, что нужно сделать чтобы они научились regexp?
15 Злопчинский
 
25.03.17
20:58
не, регексп это вылом мозга
16 Злопчинский
 
25.03.17
20:58
там думать надо.
иксемель можно тупо читать.
а регексп - пофиг.
17 rikko999
 
25.03.17
22:16
Вот про внешнюю обработку это интересно. Я про это не знал пока тут не написали. Это получается типа как отдельный скрипт, который можно запустить в любом конфиге?
Но я совсем не знаком с яп 1С. Поэтому займусь этим когда время будет. Увы сейчас запара...((
18 Злопчинский
 
25.03.17
22:47
(17) да.
если только одмин не закрыл права всякие.
может получиться так, что я тебе пришлю обработку, а ты ее запустить не сможешь, т.к. просто достучаться не сможешь
.
проверил у себя - работает ли поиск как ты писал, работает...
https://www.screencast.com/t/sTMuqVMFS
19 rikko999
 
26.03.17
13:34
(18) но у тебя на скрине в поиск введено без операторов, которые я писал. Или ты про другое?
Да и вообще удивительно что оно у тебя дало результаты. Ведь такие результаты можно получить только если ввести с оператором ПОДОБНО(%): дос%20
20 rikko999
 
26.03.17
13:36
(18) и проверь пожалуйста оператор РЯДОМ
21 Злопчинский
 
26.03.17
14:09
(19) нет никакого подобно
Это простая 7.7
Рядом штатно тоже нет, но реализовать можно штатно, но думаю это лишнее
22 Aleksey
 
26.03.17
14:21
(19) Ты точно уверен чтоу тебя ТиС, а не Управление Торговлей

Подобно и рядом это из 8-ки. Может все таки у тебя Управления торговлей 11 с включенным полнотекстовым поиском?
23 rikko999
 
26.03.17
14:58
(21) (22) Мужики, если честно то не знаю я точно. В понедельник на работе узнаю точно. Но оператор % точно работает, как я и показал в примере. Мы только так и ищем, если еще и полным названием писать, то оптовики сбегут от нас пока дождутся...
24 АгентБезопасной Нацио
 
27.03.17
11:16
25 Fragster
 
гуру
27.03.17
11:19
надо кого-то заставить принять стандарт наименования номенклатуры и поставить срок по приведению справочника к этому стандарту
26 Fragster
 
гуру
27.03.17
11:19
назначить исполнителя и ответственного
27 Злопчинский
 
27.03.17
11:21
(24) ага, давно такую хрень собираюсь у себя впилить, но все руки не доходят...
напомните ссылочку, где расписано как это поставить ? (где-то на ИСе есть)
28 АгентБезопасной Нацио
 
27.03.17
11:22
(25) одно другому не мешает... можно и стандарт, и поиск нормальный.
да,кстати, ищут чаще всего "под диктовку покупателя". еще и покупателя заставишь стандарт вопросов выучить? :-)
хотя если сделать шаблон для ввода номенклатуры, и ввод только через шаблон - будет гораздо проще
29 АгентБезопасной Нацио
 
27.03.17
11:23
(27) а я тебе в скайп скидывал.
на инфосране этого нету..
30 АгентБезопасной Нацио
 
27.03.17
11:26
мне больше интересно, как это у ТС организовано...
и точно ли у него ТиС...
31 Fragster
 
гуру
27.03.17
11:28
(28) продавцы должны знать этот стандарт и должны быть транслятором от покупателя в 1с, иначе нафиг они нужны? поставьте терминалы самообслуживания, как в юлмарте.
32 Aleksey
 
27.03.17
11:29
(27) а оно разве на дбф работает? Там вроде бы скульные запросы
33 АгентБезопасной Нацио
 
27.03.17
11:30
(32) работает
34 Злопчинский
 
27.03.17
11:33
(30) точно ТиС, дбф-ная
35 Злопчинский
 
27.03.17
11:35
(25) потом стандарт на стандарт... ;-) стандарт именования кастрюлю - такой, а стандарт именования мелких прчиндалов - такой.
если стандарт написать обобщающими словами - то львиная доля "манагеров" его не поймет.. у них голова другим забита... ;-)
36 АгентБезопасной Нацио
 
27.03.17
11:36
(35) можно конструктор (нк, или помощник) формирования наименваний использовать...
37 АгентБезопасной Нацио
 
27.03.17
11:37
(34) прикольно. никогда не прробовал в строке подбора вилдкарты использовать...
38 Масянька
 
27.03.17
11:38
(0) Порядок в базе:
1. группы номенклатуры. Например: группа "Ноуты", подгруппы "Asus", "Toshiba" и пр. И только в группе "ноутбук 3кг asus eee pc X101CH".
2. стандарт наименования. Например: наименование - ноут, производитель - asus, модель - eee pc X101CH, далее - всяко-разно - 3 кг.
Дело долгое, тяжелое, но только когда сделаешь - станет легче. И намного.
39 АгентБезопасной Нацио
 
27.03.17
11:39
(27) а там тебе в скайп стукнулся.... если потерял - маякни
40 АгентБезопасной Нацио
 
27.03.17
11:42
(38) порядок может быть разным. может по типу номенклатуры (ноут, моноблок, монитор.. ), а может и по производителю (Тобиша-Акайва-Фунайва-Сонни-Панасонец-итд), может по группе наценки (элитка-середняки-ширпотреб-слив). и все порядки имеют право на существование...
41 Злопчинский
 
27.03.17
11:47
(37) да и я никогда не использую. Откуда они там работать будут ЕСЛИ ЭТО ЯВНО НЕ ПРОПИСАНО В КОДЕ?
42 Злопчинский
 
27.03.17
13:50
для дбф у меня работает вот такая фиговина
.
        База         = СоздатьОбъект("OLEDBData");
                RS = База.Соединение("
                |Provider=VFPOLEDB.1;
                |Null = Yes;
                |Exclusive = No;
                |SourceType = DBF;
                |Data Source=" + КаталогИБ() + ";
                |Mode=ReadWrite;
                |Extended Properties="""";
                |User ID="""";
                |Password="""";
                |Mask Password=False;
                |Collating Sequence=MACHINE;  
                |DSN=""""");
                //Это ВАЖНО !!! соединение Collating Sequence=MACHINE
                Запрос = База.СоздатьКоманду();
.

но не работает
.
ODBCDatabase = СоздатьОбъект("ODBCDatabase");
ЗапросДБФ = СоздатьОбъект("ODBCRecordSet");
          
СтрокаПодключения = "DRIVER=Microsoft Visual FoxPro Driver;Deleted=Yes;Null=Yes;Collate=RUSSIAN;"+
      "Exclusive=No;SourceType=DBF;SourceDB="+КаталогИБ();

Результат = ODBCDatabase.Соединение(СтрокаПодключения);
.
для ODBC надо что-то отдельное для VFP ставить? или какие-то настройки в системе не сделаны?
.
oledb ставился через VFPOLEDBSetup.msi (или vfpoledb.exe - не помню, но наверное это одно и то же)
43 Злопчинский
 
27.03.17
14:11
ODBC даже сразу и не найти влегкую.. ладно. сисадмину задачу поставил - сделает...
44 Злопчинский
 
28.03.17
14:53
Админ поставли ОДБЦ, впилил класс поиска-выбора как на картинках выше (выбор контрагента в ведомости), но вряд ли это сильно будет востребовано
45 АгентБезопасной Нацио
 
28.03.17
15:08
(44) на картинках выше - выбор номенклатуры. а выбор контры вот:
http://s42.radikal.ru/i097/1510/04/dcdc83c1b9fa.jpg
http://s019.radikal.ru/i600/1510/9f/7745e6037784.jpg