Добрый день!

Помогите пожалуйста написать запрос-
Есть справочник номенклатура, есть регистр сведений в котором вводиться некоторая числовая информация на Группу Номенклатур, требуется в 1 запросе выбрать количество из документа чтобы эта номенклатура входила в в группу номенклатур из того регистра сведений, тоесть допустим есть у нас в регистре информация
гр1- 10 шт
гр2-20 шт
требуется пройтись по документам и посмотреть сколько продано по гр1, по гр2 и тд , причем гр1 не факт что это родитель, могут быть подпапки
такой запрос не работает =(((

```1c
    ВЫБРАТЬ
    ПланыМенеджеров.Номенклатура КАК НоменклатураПлан,
    ПланыМенеджеров.ПоНоменклатуре,
    ПланыМенеджеров.Количество КАК КоличествоПлан,
    ПланыМенеджеров.Менеджер КАК МенеджерПлан,
    ВложенныйЗапрос.КоличествоФакт
    ИЗ
    РегистрСведений.ПланыМенеджеров КАК ПланыМенеджеров
    Левое СОЕДИНЕНИЕ (ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Количество КАК КоличествоФакт,
    РеализацияТоваровУслугТовары.Номенклатура КАК НоменклатураФакт,
    РеализацияТоваровУслугТовары.Ссылка.Контрагент.ОсновнойМенеджерПокупателя КАК КонтрагентОсновнойМенеджерПокупателяФакт
    ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары) КАК ВложенныйЗапрос
    ПО (ВложенныйЗапрос.НоменклатураФакт В (ПланыМенеджеров.Номенклатура))
    ГДЕ
    ПланыМенеджеров.ПоНоменклатуре = ИСТИНА
```
Запрос план выводит а факт нет =(

написать связь в Иэрархии с вложенным запросом недает=(
---
Получилось только самому сформировать таблицу и передать ее как объект в скд, вот код

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь; // отключаем стандартный вывод отчета - будем выводить программно
    // Получаем настрокий отчета, в т.ч. период
    Настройки = КомпоновщикНастроек.ПолучитьНастройки(); // Получаем настройки отчета
    ПараметрПериод = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы.Найти("Период").Значение;
    ДатаНач=НачалоМесяца(ПараметрПериод.ДатаНачала);
    ДатаКон=ПараметрПериод.ДатаОкончания;

    //
    ТзВо=Новый ТаблицаЗначений;
    ТзВо.Колонки.Добавить("ПланК");
    ТзВо.Колонки.Добавить("ПланН");
    ТзВо.Колонки.Добавить("ФактК");
    ТзВо.Колонки.Добавить("Менеджер");

    Запрос=Новый Запрос;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ПланыМенеджеров.Количество,
    | ПланыМенеджеров.Номенклатура,
    | ПланыМенеджеров.Менеджер
    |ИЗ
    | РегистрСведений.ПланыМенеджеров КАК ПланыМенеджеров
    |ГДЕ
    | ПланыМенеджеров.ПоНоменклатуре = ИСТИНА
    | И ПланыМенеджеров.Период = &ДатаНач";

    Запрос.УстановитьПараметр("ДатаНач", ДатаНач);

    Результат = Запрос.Выполнить();

    ВыборкаПлан = Результат.Выбрать();

    Пока ВыборкаПлан.Следующий() Цикл

    Запрос = Новый Запрос;
    Запрос.Текст =

    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | СУММА(Продажи.Количество) КАК Количество
    |ИЗ
    | РегистрНакопления.Продажи КАК Продажи
    | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | ЗначенияСвойствОбъектов.Значение КАК МенеджерСВ,
    | ЗначенияСвойствОбъектов.Объект КАК Объект
    | ИЗ
    | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    | ГДЕ
    | ЗначенияСвойствОбъектов.Свойство.Наименование = "Ответственный менеджер") КАК ВложенныйЗапрос
    | ПО Продажи.ДоговорКонтрагента = ВложенныйЗапрос.Объект
    |ГДЕ
    | Продажи.Период МЕЖДУ &ДатаНач И &ДатаКон
    | И Продажи.Номенклатура В ИЕРАРХИИ(&ПланН)
    | И ВложенныйЗапрос.МенеджерСВ = &Менеджер
    | И Продажи.Номенклатура.Признак.Код = "000000001"";

    //быстрее не заработало
    //"ВЫБРАТЬ РАЗРЕШЕННЫЕ
    //| СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество
    //|ИЗ
    //| РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Месяц, ) КАК ПродажиОбороты
    //| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    //| ЗначенияСвойствОбъектов.Значение КАК МенеджерСВ,
    //| ЗначенияСвойствОбъектов.Объект КАК Объект
    //| ИЗ
    //| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    //| ГДЕ
    //| ЗначенияСвойствОбъектов.Свойство.Наименование = "Ответственный менеджер") КАК ВложенныйЗапрос
    //| ПО ПродажиОбороты.ДоговорКонтрагента = ВложенныйЗапрос.Объект
    //|ГДЕ
    //| ВложенныйЗапрос.МенеджерСВ = &Менеджер
    //| И ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&ПланН)
    //| И ПродажиОбороты.Номенклатура.Признак.Код = "000000001"";

    Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
    Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
    Запрос.УстановитьПараметр("Менеджер", ВыборкаПлан.Менеджер);
    Запрос.УстановитьПараметр("ПланН", ВыборкаПлан.Номенклатура);

    Результат = Запрос.Выполнить();

    ВыборкаФакт = Результат.Выбрать();

    Пока ВыборкаФакт.Следующий() Цикл
    НоваяСТрока=ТзВо.Добавить();
    НоваяСТрока.ПланК=ВыборкаПлан.Количество;
    НоваяСтрока.ПланН=ВыборкаПлан.Номенклатура;
    НоваяСТрока.ФактК=ВыборкаФакт.Количество;
    НоваяСтрока.Менеджер=ВыборкаПлан.Менеджер;
    КонецЦикла;

    КонецЦикла;

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; // Создаем данные расшифровки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; // Создаем компоновщик макета
    // Инициализируем макет компоновки используя схему компоновки данных
    // и созданные ранее настройки и данные расшифровки
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    // Скомпонуем результат
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;// Передаем таблицу "ЖурТаб" в процессор компоновки
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, Новый Структура("ТзВО", ТзВо),
    ДанныеРасшифровки);

    ДокументРезультат.Очистить();

    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    КонецПроцедуры
```

запрос на количество из регистра продажи работает не очень быстро, и получается отчет выводиться медленно, есть у кого какие идеи, как увеличить производительность?
---
делай соединение по .Родитель = Группа ИЛИ .Родитель.Родитель = Группа ИЛИ .Родитель.Родитель.Родитель = Группа ИЛИ .Родитель.Родитель.Родитель.Родитель = Группа ИЛИ .Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = Группа ИЛИ ...
---
Спасибо!! Вроде работает, что-то тупил =(
Получилось:

```1c
    ВЫБРАТЬ
    ПланыМенеджеров.Номенклатура КАК НоменклатураПлан,
    МАКСИМУМ(ПланыМенеджеров.Количество) КАК КоличествоПлан,
    ПланыМенеджеров.Менеджер КАК МенеджерПлан,
    СУММА(ВложенныйЗапрос.КоличествоФакт) КАК КоличествоФакт
    ИЗ
    РегистрСведений.ПланыМенеджеров КАК ПланыМенеджеров
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    СУММА(РеализацияТоваровУслугТовары.Количество) КАК КоличествоФакт,
    РеализацияТоваровУслугТовары.Номенклатура КАК НоменклатураФакт,
    РеализацияТоваровУслугТовары.Ссылка.Контрагент.ОсновнойМенеджерПокупателя КАК КонтрагентОсновнойМенеджерПокупателяФакт
    ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

    СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслугТовары.Номенклатура,
    РеализацияТоваровУслугТовары.Ссылка.Контрагент.ОсновнойМенеджерПокупателя) КАК ВложенныйЗапрос
    ПО (ВложенныйЗапрос.НоменклатураФакт В (ПланыМенеджеров.Номенклатура)
    ИЛИ ВложенныйЗапрос.НоменклатураФакт.Родитель В (ПланыМенеджеров.Номенклатура)
    ИЛИ ВложенныйЗапрос.НоменклатураФакт.Родитель.Родитель В (ПланыМенеджеров.Номенклатура)
    ИЛИ ВложенныйЗапрос.НоменклатураФакт.Родитель.Родитель.Родитель В (ПланыМенеджеров.Номенклатура))
    И ПланыМенеджеров.Менеджер = ВложенныйЗапрос.КонтрагентОсновнойМенеджерПокупателяФакт
    ГДЕ
    ПланыМенеджеров.ПоНоменклатуре = ИСТИНА

    СГРУППИРОВАТЬ ПО
    ПланыМенеджеров.Номенклатура,
    ПланыМенеджеров.Менеджер
```

Как думаете, корректно все?
---
Я бы переписал с временной таблицей. И В ИЕРАРХИИ будет работать.
---
Каким образом можно это сделать с временной таблицей? Ведь мы заранее не знаем на какую группу получать результат?
---
Вот тут есть несколько идей:
Соединение в запросе, сравнение (В ИЕРАРХИИ)
---
Через процедуры понятное дело можно что угодно нагородить, мне требовалось в 1 запросе это сделать без обработки результата( как я и писал в вопросе)
---
Задача так и не решена, требуется сделать отчет на скд
в 1 запросе получаю группу номенклатуры и число, во 2 запросе необходимо получить количество по группе которую получили из предыдущего запроса, с условием в иерархии....как можно это реализовать?
---
Получилось только самому сформировать таблицу и передать ее как объект в скд, вот код

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь; // отключаем стандартный вывод отчета - будем выводить программно
    // Получаем настрокий отчета, в т.ч. период
    Настройки = КомпоновщикНастроек.ПолучитьНастройки(); // Получаем настройки отчета
    ПараметрПериод = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы.Найти("Период").Значение;
    ДатаНач=НачалоМесяца(ПараметрПериод.ДатаНачала);
    ДатаКон=ПараметрПериод.ДатаОкончания;

    //
    ТзВо=Новый ТаблицаЗначений;
    ТзВо.Колонки.Добавить("ПланК");
    ТзВо.Колонки.Добавить("ПланН");
    ТзВо.Колонки.Добавить("ФактК");
    ТзВо.Колонки.Добавить("Менеджер");

    Запрос=Новый Запрос;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ПланыМенеджеров.Количество,
    | ПланыМенеджеров.Номенклатура,
    | ПланыМенеджеров.Менеджер
    |ИЗ
    | РегистрСведений.ПланыМенеджеров КАК ПланыМенеджеров
    |ГДЕ
    | ПланыМенеджеров.ПоНоменклатуре = ИСТИНА
    | И ПланыМенеджеров.Период = &ДатаНач";

    Запрос.УстановитьПараметр("ДатаНач", ДатаНач);

    Результат = Запрос.Выполнить();

    ВыборкаПлан = Результат.Выбрать();

    Пока ВыборкаПлан.Следующий() Цикл

    Запрос = Новый Запрос;
    Запрос.Текст =

    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | СУММА(Продажи.Количество) КАК Количество
    |ИЗ
    | РегистрНакопления.Продажи КАК Продажи
    | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | ЗначенияСвойствОбъектов.Значение КАК МенеджерСВ,
    | ЗначенияСвойствОбъектов.Объект КАК Объект
    | ИЗ
    | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    | ГДЕ
    | ЗначенияСвойствОбъектов.Свойство.Наименование = "Ответственный менеджер") КАК ВложенныйЗапрос
    | ПО Продажи.ДоговорКонтрагента = ВложенныйЗапрос.Объект
    |ГДЕ
    | Продажи.Период МЕЖДУ &ДатаНач И &ДатаКон
    | И Продажи.Номенклатура В ИЕРАРХИИ(&ПланН)
    | И ВложенныйЗапрос.МенеджерСВ = &Менеджер
    | И Продажи.Номенклатура.Признак.Код = "000000001"";

    //быстрее не заработало
    //"ВЫБРАТЬ РАЗРЕШЕННЫЕ
    //| СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество
    //|ИЗ
    //| РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Месяц, ) КАК ПродажиОбороты
    //| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    //| ЗначенияСвойствОбъектов.Значение КАК МенеджерСВ,
    //| ЗначенияСвойствОбъектов.Объект КАК Объект
    //| ИЗ
    //| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    //| ГДЕ
    //| ЗначенияСвойствОбъектов.Свойство.Наименование = "Ответственный менеджер") КАК ВложенныйЗапрос
    //| ПО ПродажиОбороты.ДоговорКонтрагента = ВложенныйЗапрос.Объект
    //|ГДЕ
    //| ВложенныйЗапрос.МенеджерСВ = &Менеджер
    //| И ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&ПланН)
    //| И ПродажиОбороты.Номенклатура.Признак.Код = "000000001"";

    Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
    Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
    Запрос.УстановитьПараметр("Менеджер", ВыборкаПлан.Менеджер);
    Запрос.УстановитьПараметр("ПланН", ВыборкаПлан.Номенклатура);

    Результат = Запрос.Выполнить();

    ВыборкаФакт = Результат.Выбрать();

    Пока ВыборкаФакт.Следующий() Цикл
    НоваяСТрока=ТзВо.Добавить();
    НоваяСТрока.ПланК=ВыборкаПлан.Количество;
    НоваяСтрока.ПланН=ВыборкаПлан.Номенклатура;
    НоваяСТрока.ФактК=ВыборкаФакт.Количество;
    НоваяСтрока.Менеджер=ВыборкаПлан.Менеджер;
    КонецЦикла;

    КонецЦикла;

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; // Создаем данные расшифровки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; // Создаем компоновщик макета
    // Инициализируем макет компоновки используя схему компоновки данных
    // и созданные ранее настройки и данные расшифровки
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    // Скомпонуем результат
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;// Передаем таблицу "ЖурТаб" в процессор компоновки
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, Новый Структура("ТзВО", ТзВо),
    ДанныеРасшифровки);

    ДокументРезультат.Очистить();

    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    КонецПроцедуры
```

запрос на количество из регистра продажи работает не очень быстро, и получается отчет выводиться медленно, есть у кого какие идеи, как увеличить производительность?
---
Убрать запрос в цикле - 100% быстрее будет работать).
И убрать вложенный запрос в соединении.
И обращаться к виртуальной таблице регистра с указанием параметров виртуальной таблицы вместо обращения к физической таблице и конструкции ГДЕ.

Да тут вообщем то не паханое поле для оптимизации)
---
SPID, а каким образом тогда мне получить данные? почитайте пожалуйста тему и не стоит давать советы абстрактные, покажите как решить данную задачу быстрее, в этом то и проблема нельзя передать в запрос готовые списки, ну или я не знаю как это сделать
---
Без конфигурации сложно набросать запрос. По вашему коду получилось что то типа:

```1c
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ПланыМенеджеров.Количество,
    | ПланыМенеджеров.Номенклатура,
    | ПланыМенеджеров.Менеджер
    |ПОМЕСТИТЬ ПланыМенеджеров
    |ИЗ
    | РегистрСведени.йПланыМенеджеров КАК ПланыМенеджеров
    |ГДЕ
    | ПланыМенеджеров.ПоНоменклатуре = ИСТИНА
    | И ПланыМенеджеров.Период = &ДатаНач
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ЗначенияСвойствОбъектов.Значение КАК МенеджерСВ,
    | ЗначенияСвойствОбъектов.Объект КАК Объект
    |ПОМЕСТИТЬ ЗначенияСвойств
    |ИЗ
    | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    | ЗначенияСвойствОбъектов.Свойство.Наименование = "Ответственный менеджер"
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ПланыМенеджеров.Менеджер КАК Менеджер,
    | ПланыМенеджеров.Номенклатура КАК Номенклатура,
    | ПланыМенеджеров.Количество КАК Количество,
    | ЗначенияСвойств.Объект КАК Объект
    |ПОМЕСТИТЬ ПланСДоговорами
    |ИЗ
    | ПланыМенеджеров КАК ПланыМенеджеров
    | ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияСвойств КАК ЗначенияСвойств
    | ПО ПланыМенеджеров.Менеджер = ЗначенияСвойств.МенеджерСВ
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ПланСДоговорами.Менеджер КАК Менеджер,
    | ПланСДоговорами.Номенклатура КАК Номенклатура,
    | ПланСДоговорами.Количество КАК КоличествоПлан,
    | Продажи.КоличествоОборот КАК КоличествоФакт
    |ИЗ
    | ПланСДоговорами КАК ПланСДоговорами
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(
    | &ДатаНач,
    | &ДатаКон,
    | ,
    | Номенклатура В ИЕРАРХИИ
    | (ВЫБРАТЬ
    | ПланСДоговорами.Номенклатура
    | ИЗ
    | ПланСДоговорами КАК ПланСДоговорами)
    | И ДоговорКонтрагента В
    | (ВЫБРАТЬ
    | ПланСДоговорами.Объект
    | ИЗ
    | ПланСДоговорами КАК ПланСДоговорами)) КАК Продажи
    | ПО ПланСДоговорами.Номерклатура = Продажи.Номенклатура
    | И ПланСДоговорами.Объект = Продажи.ДоговорКонтрагента";
```

Условие по по коду и группировку только нужно добавить в последний запрос.
---
SPID, к сожалению данный запрос факт не показывает, и даже так выполняется по времени столкоже сколько и моя функция =(
---
И еще забыл добавить проверку на null

```1c
    ЕстьNull(Продажи.КоличествоОборот,0) КАК КоличествоФакт
```
---
Странно что факт не показывает. Видимо где то соединение не верное или условие, попробуйте посмотреть в эту сторону.
Замер производительности делали? Время выполнение запроса равно сумме времени выполнений вашего запроса в цикле?
---
на секундомере засекал, моя работает 11 сек ваш запрос в консоли 10 сек..с учетом отрисовки примерно одинаково будет
где соединение посмотреть примерно?
---
Cool_vsi, В последнем и предпоследнем запросе. Прогоните их в консоле запросов - посмотрите что каждый запрос возвращает. Предпоследний должен вернуть всех ваших менеджеров с планами и договорам (ЗначенияСвойств.Объект - как я понял тут договор хранится). Последний запрос к предпоследниму добавляет данные РН по равенству номенклатуры и договора.
Так же можно попробовать убрать условие вирт таблицы

```1c
    Номенклатура В ИЕРАРХИИ
    (ВЫБРАТЬ
    | ПланСДоговорами.Номенклатура
    | ИЗ
    | ПланСДоговорами КАК ПланСДоговорами)
    | И ДоговорКонтрагента В
    | (ВЫБРАТЬ
    | ПланСДоговорами.Объект
    | ИЗ
    | ПланСДоговорами КАК ПланСДоговорами)
```
---
думаю проблема в
```1c
    и ПланСДоговорами.Номенклатура = Продажи.Номенклатура
```
 в планах храниться ГРуппа номенклатур, в регистре продаж элементы номенклатуре, собственно в этом то и главная проблема
---
Cool_vsi, о, логично - мой косяк. Тогда все же в соединение придется делать вложенный запрос(
---
Для увеличения производительности можно (нужно) добавить ВЫРАЗИТЬ в случаях с составными типами. Например

```1c
    ПО ПланыМенеджеров.Менеджер = Выразить(ЗначенияСвойств.МенеджерСВ КАК Справочник.НазваниеВашегоСправочника)

    Выразить(ЗначенияСвойствОбъектов.Свойство КАК Справочник.НазваниеВашегоСправочника).Наименование = "Ответственный менеджер"
```

Проанализировать количество данных в соединениях и добавить необходимые индексы.
Попробовать убрать условия с обращением к данным через "несколько точек".
Далее, если более глубоко копать, то посмотреть план запроса на стороне СУБД у уже на основании этого делать выводы и оптимизацию.

А вообще 10-15 секунд на формирование отчета может и нормально (если отчет выводит кучу данных), тут уж все зависит от целевых показателей.