Имя: Пароль:
1C
1С v8
Как оптимизировать такой код?
, , ,
0 SherifSP
 
26.12.13
12:36
Нужно по каждому контрагенту, для каждого товара вычислить тип цены, чтобы в дальнейшем высчитать скидку на товар контрагенту. Запросы выполняются в считанные секунды, но поиск по выборке очень долго потому как в первом цикле 84 контрагента, а во втором цикле 1800 позиций товара, как можно оптимизировать такой код, тз все индексированы.

Процедура КнопкаВыполнитьНажатие(Кнопка)

    ТаблицаТП = СформироватьДанныеТП();
    ТаблицаНом = СформироватьНоменклатуру(ТаблицаТП);
    
    ОтклонениеНом = ОтклоненияПоНоменклатуре();
    ОтклонениеБренд = ОтклоненияПоБрендам();
    ОтклонениеПроизв = ОтклоненияПоПроизводителю();
    
    ЦеныКонтрагентов = ЦеныКонтрагентовТП();
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("ТП");
    ТЗ.Колонки.Добавить("Контрагент");
    ТЗ.Колонки.Добавить("ТорговаяТочка");
    ТЗ.Колонки.Добавить("Номенклатура");
    ТЗ.Колонки.Добавить("ТипЦены");
    ТЗ.Колонки.Добавить("ФиксированнаяЦена");
    
    Для Каждого СтрокаТП Из ТаблицаТП Цикл
        Для Каждого СтрокаНом Из ТаблицаНом Цикл
            СтрокаТЗ = ТЗ.Добавить();
            СтрокаТЗ.ТП = СтрокаТП.ТорговыйПредставитель;
            СтрокаТЗ.Контрагент = СтрокаТП.Контрагент;
            СтрокаТЗ.ТорговаяТочка = СтрокаТП.ТорговаяТочка;
            СтрокаТЗ.Номенклатура = СтрокаНом.Номенклатура;
            
            ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ЦеныКонтрагентов);
            Если ИскомаяСтрока.Количество() > 0 Тогда
                // Если Фиксированная цена найдена, отклонения не ищем
                СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен;
                СтрокаТЗ.ФиксированнаяЦена = ИскомаяСтрока[0].ФиксированнаяЦена;
            Иначе
                // Фиксированная цена явно не найдена, продолжаем поиски
                ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ОтклонениеНом);
                Если ИскомаяСтрока.Количество() > 0 Тогда
                    //Меняем тип цены для расчета прайсовой цены
                    СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен;
                Иначе
                    // Отклонение по номенклатуре не найдено продолжаем
                    ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ОтклонениеБренд);
                    Если ИскомаяСтрока.Количество() > 0 Тогда
                        СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен;
                    Иначе
                        // Отклонение по бренду не найдено продолжаем
                        ИскомаяСтрока = ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ОтклонениеБренд);
                        Если ИскомаяСтрока.Количество() > 0 Тогда
                            СтрокаТЗ.ТипЦены = ИскомаяСтрока[0].ТипЦен;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;        
    КонецЦикла;
    
КонецПроцедуры

Функция ПоискДанныхТЗ(СтрокаТП,СтрокаНом,ТЗ)
    
    Отбор = Новый Структура;
    Отбор.Вставить("Контрагент",СтрокаТП.Контрагент);
    Отбор.Вставить("Номенклатура",СтрокаНом.Номенклатура);
    Возврат ТЗ.НайтиСтроки(Отбор);
    
КонецФункции
1 Fragster
 
гуру
26.12.13
12:37
одним запросом все сделать
2 SherifSP
 
26.12.13
12:38
(1) Был такой запрос, очень долго отрабатывал, потому взялся переделывать весь механизм формирования
3 Fragster
 
гуру
26.12.13
12:40
(2) видимо, такой запрос был...
4 SherifSP
 
26.12.13
12:40
+(0) Сформированные данные записываются в xml и выгружаются на сервер агент+
5 Alex S D
 
26.12.13
12:40
сделать все одним НОРМАЛЬНЫМ запросом
6 SherifSP
 
26.12.13
12:40
Сейчас кину запрос
7 SherifSP
 
26.12.13
12:43
ТекстЗапроса = "ВЫБРАТЬ
    |    Отклонения.Контрагент,
    |    Отклонения.Товар,
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(СоответствиеТиповЦен.ТипЦены, 0) = 0
    |            ТОГДА Отклонения.ТипЦены
    |        ИНАЧЕ СоответствиеТиповЦен.ТипЦены
    |    КОНЕЦ КАК ТипЦены,
    |    Отклонения.ИтоговоеОтклонение КАК Отклонение
    |ПОМЕСТИТЬ ОтклоненияПокупателя
    |ИЗ
    |    (ВЫБРАТЬ
    |        ТоварыПоПокупателям.Контрагент КАК Контрагент,
    |        ТоварыПоПокупателям.Номенклатура КАК Товар,
    |        ОтклоненияПоНоменклатуре.ТипЦены КАК ТоварТипЦены,
    |        ОтклоненияПоНоменклатуре.Отклонение КАК ТоварОтклонение,
    |        ТоварыПоПокупателям.Бренд КАК Бренд,
    |        ОтклоненияПоБрендам.ТипЦены КАК БрендТипЦены,
    |        ОтклоненияПоБрендам.Отклонение КАК БрендОтклонение,
    |        ТоварыПоПокупателям.Производитель КАК Производитель,
    |        ОтклоненияПоПроизводителям.ТипЦены КАК ПроизводительТипЦены,
    |        ОтклоненияПоПроизводителям.Отклонение КАК ПроизводительОтклонение,
    |        ОтклоненияОбщие.Отклонение КАК Отклонение,
    |        ВЫБОР
    |            КОГДА ЕСТЬNULL(ОтклоненияПоНоменклатуре.ТипЦены, 0) <> 0
    |                ТОГДА ОтклоненияПоНоменклатуре.ТипЦены
    |            КОГДА ЕСТЬNULL(ОтклоненияПоБрендам.ТипЦены, 0) <> 0
    |                ТОГДА ОтклоненияПоБрендам.ТипЦены
    |            КОГДА ЕСТЬNULL(ОтклоненияПоПроизводителям.ТипЦены, 0) <> 0
    |                ТОГДА ОтклоненияПоПроизводителям.ТипЦены
    |            ИНАЧЕ ТоварыПоПокупателям.ТипЦены
    |        КОНЕЦ КАК ТипЦены,
    |        ВЫБОР
    |            КОГДА ЕСТЬNULL(ОтклоненияПоНоменклатуре.ТипЦены, 0) <> 0
    |                ТОГДА ОтклоненияПоНоменклатуре.Отклонение
    |            КОГДА ЕСТЬNULL(ОтклоненияПоБрендам.ТипЦены, 0) <> 0
    |                ТОГДА ОтклоненияПоБрендам.Отклонение
    |            КОГДА ЕСТЬNULL(ОтклоненияПоПроизводителям.ТипЦены, 0) <> 0
    |                ТОГДА ОтклоненияПоПроизводителям.Отклонение
    |            ИНАЧЕ ЕСТЬNULL(ОтклоненияОбщие.Отклонение, 0)
    |        КОНЕЦ КАК ИтоговоеОтклонение
    |    ИЗ
    |        (ВЫБРАТЬ
    |            Покупатели.Контрагент КАК Контрагент,
    |            ТоварыТП.Номенклатура КАК Номенклатура,
    |            СпрНоменклатура.Производитель КАК Производитель,
    |            СпрНоменклатура.Бренд КАК Бренд,
    |            Покупатели.ТипЦены КАК ТипЦены
    |        ИЗ
    |            ТоварыТП КАК ТоварыТП
    |                ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
    |                ПО ТоварыТП.Номенклатура = СпрНоменклатура.Ссылка
    |                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |                    МаршрутыТП.Контрагент КАК Контрагент,
    |                    МаршрутыТП.ТипЦены КАК ТипЦены
    |                ИЗ
    |                    МаршрутыТП КАК МаршрутыТП
    |                ГДЕ
    |                    МаршрутыТП.ТорговыйПредставитель = &ТорговыйПредставитель
    |                ) КАК Покупатели
    |                ПО (1 = 1)
    |        ГДЕ
    |            (НЕ СпрНоменклатура.ЭтоГруппа)) КАК ТоварыПоПокупателям
    |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.ТипЦены КАК ТипЦены,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение
    |            ИЗ
    |                РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних
    |            ГДЕ
    |                (ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия >= &ДатаВыгрузки
    |                        ИЛИ ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия = ДАТАВРЕМЯ(1, 1, 1))
    |                И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура ССЫЛКА Справочник.Номенклатура) КАК ОтклоненияПоНоменклатуре
    |            ПО ТоварыПоПокупателям.Номенклатура = ОтклоненияПоНоменклатуре.Номенклатура
    |                И ТоварыПоПокупателям.Контрагент = ОтклоненияПоНоменклатуре.Контрагент
    |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.ТипЦены КАК ТипЦены,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение
    |            ИЗ
    |                РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних
    |            ГДЕ
    |                (ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия >= &ДатаВыгрузки
    |                        ИЛИ ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия = ДАТАВРЕМЯ(1, 1, 1))
    |                И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура ССЫЛКА Справочник.Бренды) КАК ОтклоненияПоБрендам
    |            ПО ТоварыПоПокупателям.Бренд = ОтклоненияПоБрендам.Номенклатура
    |                И ТоварыПоПокупателям.Контрагент = ОтклоненияПоБрендам.Контрагент
    |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.ТипЦены КАК ТипЦены,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение
    |            ИЗ
    |                РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних
    |            ГДЕ
    |                (ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия >= &ДатаВыгрузки
    |                        ИЛИ ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.СрокДействия = ДАТАВРЕМЯ(1, 1, 1))
    |                И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура ССЫЛКА Справочник.Производители
    |                И ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Производители.ПустаяСсылка)) КАК ОтклоненияПоПроизводителям
    |            ПО ТоварыПоПокупателям.Производитель = ОтклоненияПоПроизводителям.Номенклатура
    |                И ТоварыПоПокупателям.Контрагент = ОтклоненияПоПроизводителям.Контрагент
    |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |                &БазовыйТипЦен КАК ТипЦеныНоменклатуры,
    |                ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры.Ссылка.Владелец КАК Производитель,
    |                ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры.Ссылка КАК ТипЦеныПроизводителя
    |            ИЗ
    |                Справочник.ТипыЦенНоменклатурыКонтрагентов.ТипыЦенНоменклатуры КАК ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры
    |            ГДЕ
    |                ТипыЦенНоменклатурыКонтрагентовТипыЦенНоменклатуры.ТипЦены = &БазовыйТипЦен) КАК БазовыйТипЦены
    |            ПО ТоварыПоПокупателям.Производитель = БазовыйТипЦены.Производитель
    |            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Контрагент КАК Контрагент,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Договор КАК Договор,
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Отклонение КАК Отклонение
    |            ИЗ
    |                РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних(&ДатаВыгрузки, ) КАК ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних
    |            ГДЕ
    |                ОтклоненияЦенНоменклатурыКонтрагентовСрезПоследних.Номенклатура = НЕОПРЕДЕЛЕНО) КАК ОтклоненияОбщие
    |            ПО ТоварыПоПокупателям.Контрагент = ОтклоненияОбщие.Контрагент) КАК Отклонения
    |        ЛЕВОЕ СОЕДИНЕНИЕ СоответствиеТиповЦен КАК СоответствиеТиповЦен
    |        ПО Отклонения.ТипЦены = СоответствиеТиповЦен.ТипЦеныКонтрагента
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
    |    ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦены,
    |    ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена КАК ФиксированнаяЦена
    |ПОМЕСТИТЬ ФиксированныеЦены
    |ИЗ
    |    ОтклоненияПокупателя КАК ОтклоненияПокупателя
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(
    |                &ДатаВыгрузки,
    |                СрокДействия >= &ДатаВыгрузки
    |                    ИЛИ СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
    |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |                МАКСИМУМ(ЦеныНоменклатурыКонтрагентовСрезПоследних.Период) КАК Период,
    |                ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦен,
    |                ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
    |                ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
    |            ИЗ
    |                РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(
    |                        &ДатаВыгрузки,
    |                        СрокДействия >= &ДатаВыгрузки
    |                            ИЛИ СрокДействия = ДАТАВРЕМЯ(1, 1, 1)) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
    |                    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыТП КАК ТоварыТП
    |                    ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура = ТоварыТП.Номенклатура
    |            
    |            СГРУППИРОВАТЬ ПО
    |                ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен,
    |                ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
    |                ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры) КАК ПоследниеЦены
    |            ПО ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен = ПоследниеЦены.ТипЦен
    |                И ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура = ПоследниеЦены.Номенклатура
    |                И ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры = ПоследниеЦены.ХарактеристикаНоменклатуры
    |                И ЦеныНоменклатурыКонтрагентовСрезПоследних.Период = ПоследниеЦены.Период
    |        ПО ОтклоненияПокупателя.Контрагент = ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен.Владелец
    |            И ОтклоненияПокупателя.Товар = ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ОтклоненияПокупателя.Контрагент КАК Контрагент,
    |    ОтклоненияПокупателя.Товар.Родитель КАК Группа,
    |    ОтклоненияПокупателя.Товар КАК Товар,
    |    ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
    |    ВЫРАЗИТЬ(ЕстьNull(ЦеныНоменклатуры.Цена,0) + ЕстьNull(ЦеныНоменклатуры.Цена,0) * ОтклоненияПокупателя.Отклонение / 100 КАК ЧИСЛО(12, 2)) КАК Цена,
    |    ВЫБОР
    |        КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ФиксированнаяЦена)
    |            ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаРозница
    |        КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗа1Литр100Спирта)
    |            ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаРозница * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) * ЕСТЬNULL(ОтклоненияПокупателя.Товар.СодержаниеСпирта, 0) / 100
    |        КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗаЕмкостьСКратностью07)
    |            ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаРозница * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) / 0.7
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК МинимальнаяЦенаРозница,
    |    ОтклоненияПокупателя.ТипЦены,
    |    ОтклоненияПокупателя.Отклонение,
    |    ЦеныНоменклатуры.Цена КАК ЦенаПоПрайсу,
    |    ВЫРАЗИТЬ(ЕстьNull(ФиксированныеЦены.ФиксированнаяЦена,0) КАК ЧИСЛО(12, 2)) КАК ФиксированнаяЦена,
    |    ЕСТЬNULL(ВЫРАЗИТЬ(ВидыУпаковки.ЦенаСНДС КАК ЧИСЛО(12, 2)), 0) КАК ЦенаТарыСНДС,
    |    ЕСТЬNULL(ВЫРАЗИТЬ(ВидыУпаковки.ЦенаБезНДС КАК ЧИСЛО(12, 2)), 0) КАК ЦенаТарыБезНДС,
    |    ВЫБОР
    |        КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ФиксированнаяЦена)
    |            ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаОпт
    |        КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗа1Литр100Спирта)
    |            ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаОпт * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) * ЕСТЬNULL(ОтклоненияПокупателя.Товар.СодержаниеСпирта, 0) / 100
    |        КОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.МетодикаРасчета = ЗНАЧЕНИЕ(Перечисление.МетодикиРасчетаМинимальнойЦены.ЦенаЗаЕмкостьСКратностью07)
    |            ТОГДА ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних.ЦенаОпт * ЕСТЬNULL(ОтклоненияПокупателя.Товар.ЕдиницаХраненияОстатков.Объем, 0) / 0.7
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК МинимальнаяЦенаОпт
    |ИЗ
    |    ОтклоненияПокупателя КАК ОтклоненияПокупателя
    |        ЛЕВОЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры
    |        ПО ОтклоненияПокупателя.Товар = ЦеныНоменклатуры.Номенклатура
    |            И ОтклоненияПокупателя.ТипЦены = ЦеныНоменклатуры.ТипЦены
    |        ЛЕВОЕ СОЕДИНЕНИЕ ФиксированныеЦены КАК ФиксированныеЦены
    |        ПО ОтклоненияПокупателя.Товар = ФиксированныеЦены.Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВидыУпаковки КАК ВидыУпаковки
    |        ПО ОтклоненияПокупателя.Товар.ВидУпаковки = ВидыУпаковки.ВидУпаковки,
    |    РегистрСведений.ШкалаМинимальныхЦенНаАлкогольнуюПродукцию.СрезПоследних КАК ШкалаМинимальныхЦенНаАлкогольнуюПродукциюСрезПоследних
    |ИТОГИ
    |ПО
    |    ОтклоненияПокупателя.Товар,ОтклоненияПокупателя.Контрагент
    |";
    
    //ТекстЗапроса = ТекстЗапросаДляВыгрузкиЦен();
    Возврат ТекстЗапроса;
8 Fragster
 
гуру
26.12.13
12:43
кстати, не раскрыта тема функций формирования ТЗ в начале. Они не тормозят?
9 Fragster
 
гуру
26.12.13
12:45
(7) все виртуальные таблицы во временные + отборы на них, это как минимум. + индексы по колонкам соединения
10 SherifSP
 
26.12.13
12:45
(8) Все данные по тз выбираются за 05 секунд, основная нагрузка по времени идет на поиск типа цены
11 Fragster
 
гуру
26.12.13
12:46
(9)+ подробнее смотреть влом
12 Maxus43
 
26.12.13
12:46
(9) все вложенные ты хотел сказать?
13 SherifSP
 
26.12.13
12:46
Запрос в итоге возвращает 1800000 строк
14 SherifSP
 
26.12.13
12:47
(13) это к (7) отрабатывает 6 минут с копейками
15 Fragster
 
гуру
26.12.13
12:47
(12) начать можно с виртуальных

(13) почему не 84*1800?
16 Maxus43
 
26.12.13
12:48
(14) для 1800000 строк - более менее ещё, ускоришь индексами и т.д., но не сильно. Объём сам по себе большой
17 Fragster
 
гуру
26.12.13
12:49
(16) у автора должно в итоге получиться минимум в 10 раз меньше
18 Alex S D
 
26.12.13
12:49
очевидно что там чето лишнее, не хватает отборо/соединений
19 SherifSP
 
26.12.13
12:49
(15) Хз не сильно разбирался, разбил запрос на тз, думал может так будит быстрее, но скорость на 5% увеличилась
20 SherifSP
 
26.12.13
12:51
+(19) думаю где то лишняя выборка данных
21 SherifSP
 
26.12.13
12:52
(16) Индексы на соединяемые поля в запросе?
22 Пеппи
 
26.12.13
12:54
(20) естественно, почему отбор ведется только по датам и типу цены? мельком глянула запрос
23 Пеппи
 
26.12.13
12:55
вижу- у вас только регисты сведений используются. Там так много данных?
24 SherifSP
 
26.12.13
12:55
(22) Поля контрагент и номенклатура не индексированы, если по ним делать отбор, только хуже будит, проверял
25 SherifSP
 
26.12.13
12:56
(23) Да
26 Пеппи
 
26.12.13
12:57
(24) ГДЕ убрать в параметры, быстрее будет
27 SherifSP
 
26.12.13
13:01
(26) Сейчас уберу
28 SherifSP
 
26.12.13
13:06
Метод найти строки дольше всего отрабатывает, как думаете метод найти с указанием искомой колонки быстрее отработал бы?
29 Пеппи
 
26.12.13
13:06
(28) Найтистроки находит массив строк, а найти первую попавшуюся
30 SherifSP
 
26.12.13
13:08
(29) Дублирующих строк не будит, так как используется срез последних
31 bolobol
 
26.12.13
13:16
Всегда удивляюсь - проверить-то не быстрее, чем писать сам вопрос в форум?

И задачу вообще не понял: "Нужно по каждому контрагенту, для каждого товара вычислить тип цены". Тип цены как бы не цифра, чтобы её вычислить, значит есть какой-то алгоритм вычисления через некие показатели. И о них ни слова, ни о входящих данных ни слова, лишь о конечных: Контрагент, Товар, ВычисленныйТипЦены.

Как решать-то такую задачу? 00
32 MM
 
26.12.13
13:17
(0) В таблицах значений есть возможность создавать индексы. Но лучше всё же оптимизировать оригинальный запрос.
33 Полотенчик
 
26.12.13
13:24
(7) фу. блеванул
34 Леха Дум
 
26.12.13
13:29
(33) аналогично...
4 раза выборка РегистрСведений.ОтклоненияЦенНоменклатурыКонтрагентов.СрезПоследних
35 Kvestin
 
26.12.13
13:40
(7) Уберите все вложенные запросы во временные таблицы с индексацией по полям соединения как все тут и пишут. Это единственно верное решение (сами удивитесь насколько станет быстрее).
Если этого не сделать, то скуль будет строить неоптимальный план выполнения запроса.
Я только удивляюсь, почему сама 1С в своих конфигурациях активно использует эту выборку из вложенных. При этом везде говорится, что это зло.
36 Fragster
 
гуру
26.12.13
14:07
(35) потому что в 8.0 не было временных таблиц
37 Kvestin
 
26.12.13
14:17
(36) И я с вами бы согласился (и сам так думал).
Пока не нашел  в УПП 1.3 точно такой же запрос по партиям (с условием на вхождение во вложенный запрос), как в старенькой УТ 10.3.
38 Kvestin
 
26.12.13
14:18
При этом в БУ 1.6 написано все достаточно грамотно (все на что натыкался).
39 Fragster
 
гуру
26.12.13
14:19
(37) это потому что "работает - не чини"!
40 Kvestin
 
26.12.13
14:21
(39) :) Это конечно основная парадигма программирования - согласен с ней. Но я все-таки решил починить. Отчеты о розничных продажах стали проводиться бодрее раз в 60.
41 Fragster
 
гуру
26.12.13
14:26
(40) я знаю. я раз сто переписывал этот запрос.
42 SherifSP
 
26.12.13
14:29
Добился результата в 30 раз быстрее запроса выполняется код, поставил условие на таблицы по контрагенту и номенклатуре, данных вместо 8000 строк получается до 100, но на пол секунды дольше запросы выполняются
43 SherifSP
 
26.12.13
14:30
Так что не в оптимизации кода было дело, а в количестве данных