|
Какой код более оптимизированный? | ☑ | ||
---|---|---|---|---|
0
Timekiller
16.01.13
✎
19:47
|
Добавляю я колонку с ценой (да не важно с чем), например, в подбор.
Соответственно есть определенный список номенклатуры, по которому надо запросить цену. Я считал, что правильнее будет поместить весь список в запрос, далее соединить его с характеристикой, и в последующем с регистром цен. Т.к. цены ставятся на характеристики, а список в подборе без характеристик. Взять максимальную цену (уже требование заказчика) из всех характеристик и перебором результата запроса вставить это в ячейки. Второй вариант изначально начать цикл Для Каждого Цикл и запрашивать цену для каждой номенклатуры, но мне кажется это совсем не айс. А теперь вопрос, как это сделать "по-джедайски"? Максимально оптимизированно. |
|||
1
Jstunner
16.01.13
✎
19:48
|
одним запросом
|
|||
2
ЧашкаЧая
16.01.13
✎
19:50
|
(1) + ПриПолученииДанных
|
|||
3
DrShad
16.01.13
✎
19:51
|
(1)+1
(2) сомнительно ибо как получить те 25-30 ссылок? |
|||
4
Jstunner
16.01.13
✎
19:52
|
(2) само-собой, в другом месте попросту не добудешь список номенклатуры
|
|||
5
H A D G E H O G s
16.01.13
✎
19:52
|
(3) Вот так вы и палитесь.
|
|||
6
Timekiller
17.01.13
✎
12:03
|
(1) (2) Как тут было сказано я все сделал, получилось все простенько, почему этот запрос выполняется.выгружается секунду, хотя там максимум 7 строк?
[code]ВЫБРАТЬ МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена) КАК Цена, ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта, ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры.Владелец ИЗ РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(, Валюта.Наименование = "руб.") КАК ЦеныНоменклатурыКонтрагентовСрезПоследних ГДЕ ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры.Владелец В(&МассивНоменклатуры) СГРУППИРОВАТЬ ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта, ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры.Владелец[/code] |
|||
7
acsent
17.01.13
✎
12:04
|
тормозить будет безбожно
|
|||
8
Timekiller
17.01.13
✎
12:05
|
(7) спасибо дорогой, уже заметил, как сделать, чтобы не тормозило?
|
|||
9
Maxus43
17.01.13
✎
12:07
|
Валюта.Наименование = "руб." :)
ссылку туда |
|||
10
Maxus43
17.01.13
✎
12:08
|
ХарактеристикаНоменклатуры.Владелец
= Номенклатура просто |
|||
11
Timekiller
17.01.13
✎
12:20
|
(10) Так у меня массив номенклатуры, мне тогда цикл придется делать и для каждой номенклатуры делать этот запрос. Как выяснилось ранее это не желательно
|
|||
12
shurikvz
17.01.13
✎
12:21
|
(11) Какой цикл? Полностью процедуру ПриПолученииДанных покажи.
|
|||
13
Maxus43
17.01.13
✎
12:21
|
(11) не вижу связи. в запросе ты сейчас выдёргиваешь имеено Номенклатура, только через ЖПО типа ХарактеристикаНоменклатуры.Владелец
|
|||
14
Timekiller
17.01.13
✎
12:38
|
Процедура СправочникНоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)
Перем Организация, Склад; СтруктураИсходныхПараметров.Вставить("РезультатПодборПоЗапросу", Неопределено); МассивНоменклатуры = Новый Массив; Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл Если ОформлениеСтроки.ДанныеСтроки.Набор = Истина Тогда Если ОформлениеСтроки.ДанныеСтроки.ПометкаУдаления Тогда ОформлениеСтроки.Ячейки.Картинка.УстановитьКартинку(мКартинкаНаборУдален); Иначе ОформлениеСтроки.Ячейки.Картинка.УстановитьКартинку(мКартинкаНабор); КонецЕсли; КонецЕсли; Если Не ОформлениеСтроки.ДанныеСтроки.ЭтоГруппа Тогда МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка); КонецЕсли; КонецЦикла; //МОЕ Если ПоказыватьЦену Тогда ЭлементыФормы.СправочникНоменклатура.Колонки.ЦенаРозничнаяК.Видимость = Истина; ПосчитатьЦену(МассивНоменклатуры, ОформленияСтрок); Иначе ЭлементыФормы.СправочникНоменклатура.Колонки.ЦенаРозничнаяК.Видимость = Ложь; КонецЕсли; //МОЕ ... // Продолжение стандартной процедуры в УТ 10.3 Процедура ПосчитатьЦену(МассивНоменклатуры, ОформленияСтрок) запрос2 = новый запрос; запрос2.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры); запрос2.Текст = "ВЫБРАТЬ | МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена) КАК Цена, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта, | ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры.Владелец |ИЗ | РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(, Валюта.Наименование = ""руб."") КАК ЦеныНоменклатурыКонтрагентовСрезПоследних |ГДЕ | ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры.Владелец В(&МассивНоменклатуры) | |СГРУППИРОВАТЬ ПО | ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры.Владелец, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта"; резулт = запрос2.Выполнить().Выгрузить(); Для Каждого СтрТаблицы Из ОформленияСтрок Цикл // Ищем номенклатуру в результате запроса, к которой будем ставить цену ТекНоменклатура = резулт.Найти(СтрТаблицы.ДанныеСтроки.Ссылка, "ХарактеристикаНоменклатурыВладелец"); // Проверка, если ее нет в запросе Если ТекНоменклатура = Неопределено Тогда Продолжить; КонецЕсли; // Ставим цену в значение ячейки СтрТаблицы.Ячейки.ЦенаРозничнаяК.Значение = ТекНоменклатура.Цена; //Сообщить(Стр.Цена); КонецЦикла; КонецПроцедуры |
|||
15
Maxus43
17.01.13
✎
12:41
|
ХарактеристикаНоменклатуры.Владелец
объясни нахрена так? просто Номенклатура В (&МассивНоменклатуры) и в выборке просто ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура |
|||
16
Maxus43
17.01.13
✎
12:42
|
СрезПоследних(, Валюта = &СсылкаНаВалюту)
|
|||
17
Maxus43
17.01.13
✎
12:43
|
И в чем логика получения Максимальной цены, а не последней?
|
|||
18
acsent
17.01.13
✎
12:43
|
писать для каждой номенклатуры максимальную цену, а не вычислять
|
|||
19
acsent
17.01.13
✎
12:44
|
(17) максимальной последней цены
|
|||
20
shurikvz
17.01.13
✎
12:51
|
(15) +
(16) + Отбор по номенклатуре перенести в параметры виртуальной таблицы + а где отбор по типу цен? |
|||
21
prog0101
17.01.13
✎
12:52
|
(0)замер производительности рулит
не нужно ничего переусложнять без оснований |
|||
22
shurikvz
17.01.13
✎
12:54
|
+ вот здесь
Если ПоказыватьЦену Тогда ЭлементыФормы.СправочникНоменклатура.Колонки.ЦенаРозничнаяК.Видимость = Истина; ПосчитатьЦену(МассивНоменклатуры, ОформленияСтрок); Иначе ЭлементыФормы.СправочникНоменклатура.Колонки.ЦенаРозничнаяК.Видимость = Ложь; КонецЕсли; Не надо каждый раз видимость колонки дергать. Условие ПоказыватьЦену оставить, но видимость переключать при изменении флажка (если ПоказыватьЦену это флажок). |
|||
23
Timekiller
17.01.13
✎
13:40
|
(15) Цены выставлены не на номенклатуру, а на характеристики, поэтому и вытаскивал через характеристики, сейчас попробую просто номенклатуру
|
|||
24
Timekiller
17.01.13
✎
13:46
|
Обработка.ПодборНоменклатуры.Форма.ОсновнаяФорма 2 162 резулт = запрос2.Выполнить().Выгрузить(); 1 0,847192 99,50
По замеру все равно сильно дохрена запрос выполняется, переделал как вы сказали: запрос2 = новый запрос; запрос2.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры); запрос2.УстановитьПараметр("СсылкаНаВалюту", Справочники.Валюты.НайтиПоКоду(810)); запрос2.Текст = "ВЫБРАТЬ | ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура, | МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена) КАК Цена |ИЗ | РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(, Валюта = &СсылкаНаВалюту) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних |ГДЕ | ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура В(&МассивНоменклатуры) | |СГРУППИРОВАТЬ ПО | ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта, | ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена"; резулт = запрос2.Выполнить().Выгрузить(); |
|||
25
shurikvz
17.01.13
✎
13:51
|
(24) А что насчет (20)?
Почему в запросе идет еще группировка по Цене? |
|||
26
Reset
17.01.13
✎
13:52
|
(24) А валюта разве измерение, а не ресурс?
|
|||
27
Reset
17.01.13
✎
13:54
|
И зачем ее выбирать, если по ней отбор на равенство?
|
|||
28
Lexusss
17.01.13
✎
14:00
|
(6) За такой код - убил бы!!!
Отбор по номенклатуре вставить внутрь скобок (параметров виртуальной таблицы). Туда же запихнуть условие на тип цен. Отбор по валюте снести к чертям! Ты последнюю цену, установленную в ЛЮБОЙ валюте, должен пересчитывать в нужную тебе валюту. А не игнорировать цены, установленные в долларах. МАКСИМУМ(Цена) СГРУППИРОВАТЬ ПО Цена - это еще тот шедевр! |
|||
29
Timekiller
17.01.13
✎
14:25
|
Вот теперь я вас люблю))
По сути проблема была в ГДЕ, вставил в параметры виртуальной таблицы стало гораздо приятнее. 0,008 по замерам. (28) Группировку убрал сразу, ее конструктор зачем-то поставил, группировка только по Номенклатура Все остальное требования заказчика |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |