Плевое дело - найти товар по наименованию

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#1
Всем хорош и удал метод "НайтиПоНаименованию". Только в жизни не все так просто. Иногда нужно найти строку спр-ка по совпадению наименования и парочки реквизитов.
Когда проблема аналогична, но найти только по реквизитам, из них хоть один с признаком "Сортировка" я делаю "ВыбратьЭлементыПоРеквизиту". В цикле пробегаю по нескольким строкам (у них совпадает основной реквизит) и сравниваю остальные реквизиты. Получается быстро.
А как быть с наименованием? Только полный перебор всех строк справочника! Вот ж. :) !

Примечание: ВыбратьЭлементыПоРеквизиту("Наименование") не катит.

Вопрос не горячий, просто давно мучал а сейчас опять всплыл.
У кого есть идеи? Открываю конкурс геев.
 

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#3
Конкурс гениев. Хотел написать.

А запрос не подходит? Еще и прямой может быть.
Запрос однозначно проиграет, когда мне нужно раз 300 поискать товар. Запрос может и быстро шарит, но очень медленно запрягает. Механизм обычно нужен при импорте больших массивов. Поэтому как представлю, что все 300 раз сообщение "Выполняется запрос", так вздрогну. Я пишу не голословно, т.к. уже проверял поиск товара среди 50 тыс. строк. Время почти сопоставимо с полным перебором.

Добавлено: "Прямой", я так понимаю, это нестандартными ср-ми. Вот не знаком. Но стоит ли эффект затрат на освоение метода?
 

vbs

Well-Known Member
18.02.2007
1 708
3
Санкт-Петербург
#4
Значит, в справочнике есть несколько элементов с одинаковым наименованием ?
Или я не понял проблему ?

Если понял, то можно попробовать примерно следующее :
Код:
	STR = "Буженина"; 
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"
|NM = Справочник.Номенклатура.ТекущийЭлемент; 
|Name = Справочник.Номенклатура.Наименование;	 
|Condition (TrimAll(Name) = STR);	
|Группировка NM Без Групп;";
Запрос.Выполнить(ТекстЗапроса);
TZ = "";
Запрос.Выгрузить(TZ);
Вот такое точно работает (проверено, мин нет :) ).
Ну а дальше обойти табличку, сравнивая "боковые" реквизиты

Примечание: ВыбратьЭлементыПоРеквизиту("Наименование") не катит.
... и даже ясно, почему

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

Добавлено:
Запрос однозначно проиграет, когда мне нужно раз 300 поискать товар
Тогда можно попробовать при импорте сформировать список для условия, а потом уже одним запросом сформировать таблицу

Или еще вариант : создать из справочника ТЗ и в ней делать поиск
 

unknown181538

НеГуру
28.12.2008
1 417
0
30
Москва
#5
Но стоит ли эффект затрат на освоение метода?
Если критична производительность то стоит... Тем более, что запрос к справочнику - не сложно.
Но вот как он "запрягает" на малых объемах в цикле тоже надо смотреть.

Не ясна задача - зачем искать 300 раз? Почему тогда не сделать одним запросом?
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#6
Но стоит ли эффект затрат на освоение метода?
Поверь, оно того стоит. Если в результате поиска ВСЕГДА будет всего 1 элемент, лучше использовать параметризированный запрос, который будет запрягаться всего 1 раз, а потом выполняться часто и быстро. Например, при помощи такого запроса очень даже кошерно выводить, скажем, остатки в колонку в списке справочника.
 

puh14

Well-Known Member
11.07.2008
1 412
0
НеРезиновая
#7
Запрос может и быстро шарит, но очень медленно запрягает
Ну так по сути для скуля ВыбратьПоРеквизиту - это тоже запрос. ;-)

Так что те-же яйца, вид сбоку. Единственно что прямой запрос к скулю побыстрее будет

Как вариант шоб быстрее искало - делаешь список что надо проверить, делаешь прямой запрос к бд, результаты в временную таблицу и потом мелкозапросами к ней - записей мало, только те что надо.Будет быстро работать.
 

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#8
Извините, на день пропал в трудах.
Благодарю всех ответивших. Я не предполагал такого количества вариантов.
Все-таки повторю задание, кто-то не понял. При импорте массива товаров (я махнул аж 300) в справочник (50тыс, не меньше) программа должна проверить существование каждого товара по совпадению наименования (могут повторятся) и 2-3 реквизитов (и они не обязательны). Вот почему много поисков.

Главное, я хотел обратить внимание, насколько обижено Наименование по сравнению с методами реквизитов. Аналогичная проблема поиск только по реквизитам решилась бы легко.

Концептуально свожу предложения к след-му: одним запросом выбрать подходящие по наимен-ию товары (чуть больше 300) и далее работать с ними.

В моем конкурсе победили:
1 место - ветерану, за инвариантность
2 место - коллеге, за передовые технологии
3 место - Unknow, за оперативность
Vitfil - почетный приз за глубокомыслие
 

unknown181538

НеГуру
28.12.2008
1 417
0
30
Москва
#9
Благодарю всех ответивших. Я не предполагал такого количества вариантов.
Все-таки повторю задание, кто-то не понял. При импорте массива товаров (я махнул аж 300) в справочник (50тыс, не меньше) программа должна проверить существование каждого товара по совпадению наименования (могут повторятся) и 2-3 реквизитов (и они не обязательны). Вот почему много поисков.
Так ведь один тогда запрос напрашивается. А потом обходить выборку....
Главное, я хотел обратить внимание, насколько обижено Наименование по сравнению с методами реквизитов.
Пришла в голову может быть глупая мысль.
А не работает ВыбратьПоРеквизиту("Наименование")? А то что ж оно обижено-то?
 

vbs

Well-Known Member
18.02.2007
1 708
3
Санкт-Петербург
#10
Пришла в голову может быть глупая мысль.
А не работает ВыбратьПоРеквизиту("Наименование")? А то что ж оно обижено-то?
Так, вроде, Наименование и Код не являются реквизитами

1 место - ветерану, за инвариантность - что-то уместность этого красивого термина вызывает у меня сомнения.
Как ни вертел это слово, так и не догадался, за что же приз ?
Собственно, кто ветеран, догадаться можно, но ...инвариантность в чем ? :)
 

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#11
Собственно, кто ветеран, догадаться можно, но ...инвариантность в чем ?
Решения. Имею в виду, что новичок реализует первое пришедшее в голову решение, а специалист продумает несколько вариантов. И выберет лучший из них.

У нас в коллективе бывает обсуждаем выбор: сделать так или этак. И я тогда спрашиваю: знаете какое лучшее? Третье.
 

vbs

Well-Known Member
18.02.2007
1 708
3
Санкт-Петербург
#12
Не сочти занудством, но я бы, скорее, в данном контексте применил термин "поливариантность",
ибо "инвариантность" все же не совсем в тему