Имя: Пароль:
1C
1С v8
Поиск по артикулу по коду или произвольный запрос ?
0 r1000
 
13.04.23
10:13
Есть обработка загрузки цен от поставщика. Код поставщика сейчас сделан доп.реквизитом номенклатуры.
соответственно при загрузке поиск элемента выполняется таким запросом:
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        |ГДЕ
        |    НоменклатураДополнительныеРеквизиты.Свойство = &СвойствоКод
        |    И НоменклатураДополнительныеРеквизиты.Значение = &КодПоставщика";
    
    Запрос.УстановитьПараметр("КодПоставщика", КодПоставщика);
    Запрос.УстановитьПараметр("СвойствоКод",     
    ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "КодНоменклатурыФактум_dd991e61e7784241998ae778c4944c8a"));
    
    РезультатЗапроса = Запрос.Выполнить();

Смущает то, что запрос выполняется долго. Когда в файле 30 тыс строк - на этой операции тратиться основное время.
Вопрос: если код поставщика перенести в артикул элемента номенклатуры, или даже в код номенклатуры и искать НайтиПоРеквизиту() или НайтиПоКоду() это будет быстрей ?
1 magicSan
 
13.04.23
10:16
(0) нахрена делать запрос дял каждой строчки?
2 Прапорщик
 
13.04.23
11:09
(1) +1
(0) У вас запрос в цикле.
Вариантов ускорения немного. И все сводятся к уходу от запроса в цикле.
Первый. Полностью переписать обработку, отказавшись от построчного перебора.
Второй. Оставить построчный перебор, но поиск в допреквизитах делать не внутри цикла, а перед его выполнением.
Выгрузить из таблицы в массив колонку со значением кода поставщика.
Сделать запрос.

Запрос = Новый Запрос;
Запрос.Текст =
  "ВЫБРАТЬ
  |    НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
  |    НоменклатураДополнительныеРеквизиты.Значение КАК КодПоставщика
  |ИЗ
  |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
  |ГДЕ
  |    НоменклатураДополнительныеРеквизиты.Свойство = &СвойствоКод
  |    И НоменклатураДополнительныеРеквизиты.Значение В (&МассивКодовПоставщиков)";
Запрос.УстановитьПараметр("МассивКодовПоставщиков", МассивКодовПоставщиков);
Запрос.УстановитьПараметр("СвойствоКод",    
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "КодНоменклатурыФактум_dd991e61e7784241998ae778c4944c8a"));
РезультатЗапроса = Запрос.Выполнить();

Далее либо выгрузить результат запроса в таблицу значений (можно проиндексировать её по полю "КодПоставщика") и внутри цикла искать номенклатуру в этой таблице.
Либо в самом запросе поместить результат во временную таблицу и использовать её как источник для запросов внутри цикла.

Вариант с переносом кода поставщика в артикул элемента номенклатуры или в код номенклатуры я бы рассматривать не стал. По целому ряду причин.
Во-первых, ускорится то оно ускорится, но не факт, что сильно.
Во-вторых, эти поля могут понадобиться вам самим. Даже если сегодня они вам не нужны и пользователи мамой клянутся, что никогда в жизни не понадобятся.
Во-третьих, никто не даст гарантии, что завтра у вас появится множество поставщиков и надо будет хранить коды для каждого. Кстати в этом плане идея с хранением в допреквизитах - не лучшая.
В-четвёртых, в любой момент может появиться соотношение один ко многим, когда одна номенклатура в вашем справочнике соответствует нескольким номенклатурам поставщика (часто встречается, когда детализация учёта номенклатуры по характеристикам различна - поставщик делит номенклатуру по размерам/цветам/материалам/... на разные позиции, а у вас это всё одна номенклатура с разными характеристиками, или наоборот).
В двух последних случаях (множество поставщиков и соотношение один ко многим) можно различными путями проблему обойти, оставив хранение кода в допреквизитах. Но если код поставщика в артикуле или в коде элемента, то придётся связываться с переносом этих данных оттуда.
3 mikecool
 
13.04.23
11:13
(0) все будет быстрее, если ты ищешь по индексируемому полю и ессно не в цикле