• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Дайнеко
  • Дата начала
Д

Дайнеко

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

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

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

Дайнеко

Конкурс гениев. Хотел написать.

А запрос не подходит? Еще и прямой может быть.

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

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

vbs

Значит, в справочнике есть несколько элементов с одинаковым наименованием ?
Или я не понял проблему ?

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

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

... и даже ясно, почему

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

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

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

unknown181538

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

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

vitfil

Но стоит ли эффект затрат на освоение метода?
Поверь, оно того стоит. Если в результате поиска ВСЕГДА будет всего 1 элемент, лучше использовать параметризированный запрос, который будет запрягаться всего 1 раз, а потом выполняться часто и быстро. Например, при помощи такого запроса очень даже кошерно выводить, скажем, остатки в колонку в списке справочника.
 
P

puh14

Запрос может и быстро шарит, но очень медленно запрягает

Ну так по сути для скуля ВыбратьПоРеквизиту - это тоже запрос. ;-)

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

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

Дайнеко

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

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

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

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

unknown181538

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

vbs

Пришла в голову может быть глупая мысль.
А не работает ВыбратьПоРеквизиту("Наименование")? А то что ж оно обижено-то?
Так, вроде, Наименование и Код не являются реквизитами

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

Дайнеко

Собственно, кто ветеран, догадаться можно, но ...инвариантность в чем ?
Решения. Имею в виду, что новичок реализует первое пришедшее в голову решение, а специалист продумает несколько вариантов. И выберет лучший из них.

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

vbs

Не сочти занудством, но я бы, скорее, в данном контексте применил термин "поливариантность",
ибо "инвариантность" все же не совсем в тему
 
V

vbs

Занудство и лень - неотъемлемые качества для программиста
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!