Вход | Регистрация
 

Цикл в запросе

Цикл в запросе
Я
   user4fun
 
19.03.19 - 12:14
Уважаемые форумчане! Как убрать запрос из цикла ребят помогите.
        Для Каждого СтрТЧ из Объект.Товары Цикл    
            ЗапросЦенаОстаток = Новый Запрос;
            ЗапросЦенаОстаток.УстановитьПараметр("Номенклатура", СтрТЧ.Номенклатура);
            ЗапросЦенаОстаток.УстановитьПараметр("ТекДата", ТекущаяДата());
            ЗапросЦенаОстаток.Текст = "ВЫБРАТЬ
                                      |    ТоварыНаСкладахВПродажныхЦенахОстатки.Номенклатура,
                                      |    ТоварыНаСкладахВПродажныхЦенахОстатки.Цена,
                                      |    ТоварыНаСкладахВПродажныхЦенахОстатки.КоличествоОстаток * ТоварыНаСкладахВПродажныхЦенахОстатки.Цена КАК Сумма,
                                      |    ТоварыНаСкладахВПродажныхЦенахОстатки.ХарактеристикаНоменклатуры
                                      |ИЗ
                                      |    РегистрНакопления.ТоварыНаСкладахВПродажныхЦенах.Остатки(&ТекДата, ) КАК ТоварыНаСкладахВПродажныхЦенахОстатки
                                      |ГДЕ
                                      |    ТоварыНаСкладахВПродажныхЦенахОстатки.Номенклатура = &Номенклатура";                            
            Результат = ЗапросЦенаОстаток.Выполнить();
            Выборка = Результат.Выбрать();
            
            Пока Выборка.Следующий() Цикл
                Если СтрТЧ.Номенклатура = Выборка.Номенклатура И СтрТЧ.Цена <> Выборка.Цена И СтрТЧ.ХарактеристикаНоменклатуры = Выборка.ХарактеристикаНоменклатуры Тогда
                    СтрТЧ.Цена = Выборка.Цена;
                    СтрТЧ.Сумма = Выборка.Сумма;
                    Предупреждение("В связи с новой переоценкой, цена в " + СтрТЧ.Номенклатура + " изменена на новую", , "ПЕРЕОЦЕНКА")
                КонецЕсли;
            КонецЦикла;        
        КонецЦикла;
 
 
   palsergeich
 
1 - 19.03.19 - 12:15
Передавать массив номерклатуры в запрос и ограничить виртуальную таблицу.
   user4fun
 
2 - 19.03.19 - 12:17
(1) Напишите пожалуйста что значит ограничить виртуальную таблицу?
   Vakhrin
 
3 - 19.03.19 - 12:19
Это из какого теста? )
   lodger
 
4 - 19.03.19 - 12:19
сделать ЗапросЦенаОстаток перед циклом.
Остатки(&ТекДата, Номенклатура В (&Номенклатура)) 

Результат = ЗапросЦенаОстаток.Выполнить(); 
НеВыборка = Результат.Выгрузить(); 

Для Каждого СтрТЧ из Объект.Товары Цикл     
 СтрокаДанных = НеВыборка.Найти(СтрТЧ.Номенклатура);
Если СтрокаДанных = неопределено Тогда
// нет остатка, надо что-то свистнуть юзеру?

Конецесли
СтрТЧ.Цена = СтрокаДанных.Цена; 
                    СтрТЧ.Сумма = СтрокаДанных.Сумма;
   sqr4
 
5 - 19.03.19 - 12:23
(4) при большом размере ТЧ производительность данного алгоритма будет не многим быстрее
   palsergeich
 
6 - 19.03.19 - 12:24
(5) Вы замеряли? И на каких значениях?
Я могу сказать что при большой базе Ваш алгоритм будет работать минуты, а этот доли секунд.
   sqr4
 
7 - 19.03.19 - 12:25
(5) Какой мой?
   RomanYS
 
8 - 19.03.19 - 12:25
(5) при всей неоптимальности (4) будет НАмного быстрее (0) особенно на большом размере
   sqr4
 
9 - 19.03.19 - 12:25
(8) Согласен)
   Fish
 
10 - 19.03.19 - 12:25
Получать данные ТЧ плюс остатки одним запросом, и не парить мозг.
 
 Рекламное место пустует
   sqr4
 
11 - 19.03.19 - 12:26
Опять я в (5) не так выразился.
   OpKc
 
12 - 19.03.19 - 12:26
Лучше передать таблицу с номенклатурой, ценой и характеристикой и в запросе все условия сразу прописать. Там же условие ещё идёт при обработке результата запроса
"Если СтрТЧ.Номенклатура = Выборка.Номенклатура И СтрТЧ.Цена <> Выборка.Цена И СтрТЧ.ХарактеристикаНоменклатуры = Выборка.ХарактеристикаНоменклатуры Тогда"
Можно сразу сократить выборку.
   palsergeich
 
13 - 19.03.19 - 12:26
(7) перепутал Вас с автором, сорри
   Конструктор1С
 
14 - 19.03.19 - 12:27
Цена ещё и измерение? о_О
   Конструктор1С
 
15 - 19.03.19 - 12:29
А вообще, (0) просто ходячее пособие, как НЕ надо делать)
   OpKc
 
16 - 19.03.19 - 12:30
(15) ощущение, что и правда тест какой-то
   user4fun
 
17 - 19.03.19 - 13:33
Всем спасибо. Задача выполнена.
   xXeNoNx
 
18 - 19.03.19 - 13:41
(17) Боюсь даже представить...
   palsergeich
 
19 - 19.03.19 - 13:43
(18) да норм, я сегодня денежку заработал за то, что запрос поправил после аналогичного креакла (14)
   xXeNoNx
 
20 - 19.03.19 - 13:43
Представляем что документе 100 строк и все они в выборке, а тут бах и это:

Предупреждение("В связи с новой переоценкой, цена в " + СтрТЧ.Номенклатура + " изменена на новую", , "ПЕРЕОЦЕНКА")
   xXeNoNx
 
21 - 19.03.19 - 13:45
(19) ну норм..., че.., пусть продолжают продолжать тогда..
   xXeNoNx
 
22 - 19.03.19 - 13:46
(0) Для нормальных пацанов скинешь решение-то?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует