Имя: Пароль:
1C
1С v8
Какой код более оптимизированный?
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) Группировку убрал сразу, ее конструктор зачем-то поставил, группировка только по Номенклатура
Все остальное требования заказчика