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

Тема в разделе "1C и всё что с ней связано", создана пользователем Дайнеко, 27 апр 2011.

  1. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    А запрос не подходит? Еще и прямой может быть.
    Чего? :)
     
  3. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Конкурс гениев. Хотел написать.

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Значит, в справочнике есть несколько элементов с одинаковым наименованием ?
    Или я не понял проблему ?

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

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

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

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Если критична производительность то стоит... Тем более, что запрос к справочнику - не сложно.
    Но вот как он "запрягает" на малых объемах в цикле тоже надо смотреть.

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Поверь, оно того стоит. Если в результате поиска ВСЕГДА будет всего 1 элемент, лучше использовать параметризированный запрос, который будет запрягаться всего 1 раз, а потом выполняться часто и быстро. Например, при помощи такого запроса очень даже кошерно выводить, скажем, остатки в колонку в списке справочника.
     
  7. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Ну так по сути для скуля ВыбратьПоРеквизиту - это тоже запрос. ;-)

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

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

    Дайнеко Well-Known Member
    1C Team

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

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

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Так ведь один тогда запрос напрашивается. А потом обходить выборку....
    Пришла в голову может быть глупая мысль.
    А не работает ВыбратьПоРеквизиту("Наименование")? А то что ж оно обижено-то?
     
  10. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Так, вроде, Наименование и Код не являются реквизитами

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

    Дайнеко Well-Known Member
    1C Team

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Не сочти занудством, но я бы, скорее, в данном контексте применил термин "поливариантность",
    ибо "инвариантность" все же не совсем в тему
     
  13. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Ну ты зануда!
     
  14. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Занудство и лень - неотъемлемые качества для программиста
     
Загрузка...

Поделиться этой страницей