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

Остатки(&ТекДата, Номенклатура В (&Номенклатура))

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

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

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