Всем привет. Делал отчет, СКД, объеденяет 3 запроса. В кратце - документы реализации за определенный период, табличная часть, подтягиваем курс валюты на дату документа реализации (2ой запрос), и определенную цену на дату документа (3ий запрос) для каждой номеклатуры. Жутко тупит даже при маленьком периоде (до 5 документов). Подскажите, где оптимизировать, или как переделать для более быстрой работы.
1С:Предприятие 8.3, Управление торговлей для Беларуси, редакция 3.4
П.С. Я самоучка, просьба тапками не кидать, заранее большое спасибо откликнувшимся.
---
что-то вроде такого
все одним запросом
можно поиграться индексацией по периоду

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

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    &НачалоПериода КАК Период,
    КурсыВалютСрезПоследних.Курс КАК Курс
    ПОМЕСТИТЬ КурсыВалют
    ИЗ
    РегистрСведений.КурсыВалют.СрезПоследних(&НачалоПериода {(&НачалоПериода)}, Валюта = &ВалютаКурса) КАК КурсыВалютСрезПоследних

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    КурсыВалют.Период,
    КурсыВалют.Курс
    ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
    ГДЕ
    КурсыВалют.Валюта = &ВалютаКурса
    И КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    &НачалоПериода КАК Период,
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    ПОМЕСТИТЬ ЦеныНоменклатуры
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    &НачалоПериода {(&НачалоПериода)},
    ТипЦен = &ВидЦеныЗакупки
    И Номенклатура В
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    Товары.Номенклатура
    ИЗ
    Товары)) КАК ЦеныНоменклатурыСрезПоследних

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    ЦеныНоменклатуры.Период,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена
    ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
    ЦеныНоменклатуры.ТипЦен = &ВидЦеныЗакупки
    И ЦеныНоменклатуры.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И ИСТИНА В
    (ВЫБРАТЬ ПЕРВЫЕ 1
    ИСТИНА
    ИЗ
    Товары
    ГДЕ
    ЦеныНоменклатуры.Номенклатура = Товары.Номенклатура)

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВложенныйЗапрос.НачалоДня КАК НачалоДня,
    МАКСИМУМ(КурсыВалют.Период) КАК Период
    ПОМЕСТИТЬ КурсыВалютПериод
    ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    Товары.НачалоДня КАК НачалоДня
    ИЗ
    Товары КАК Товары) КАК ВложенныйЗапрос
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
    ПО ВложенныйЗапрос.НачалоДня >= КурсыВалют.Период

    СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.НачалоДня

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВложенныйЗапрос.НачалоДня КАК НачалоДня,
    ВложенныйЗапрос.Номенклатура,
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
    ПОМЕСТИТЬ ЦеныНоменклатурыПериод
    ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    Товары.Номенклатура КАК Номенклатура,
    Товары.НачалоДня КАК НачалоДня
    ИЗ
    Товары КАК Товары) КАК ВложенныйЗапрос
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура
    И ВложенныйЗапрос.НачалоДня >= ЦеныНоменклатуры.Период

    СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.НачалоДня,
    ВложенныйЗапрос.Номенклатура

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Товары.НомерСтроки,
    Товары.Номенклатура,
    Товары.Количество,
    Товары.Цена,
    Товары.СуммаСНДС,
    Товары.ДокументРеализации,
    Товары.Проведен,
    Товары.ВалютаДокумента,
    Товары.СуммаДокумента,
    Товары.СкладДокумента,
    Товары.Дата,
    ЕСТЬNULL(КурсыВалют.Курс, 0) КАК Курс,
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК ЦенаЗакупки
    ИЗ
    Товары КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалютПериод КАК КурсыВалютПериод
    ПО Товары.НачалоДня = КурсыВалютПериод.НачалоДня
    ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
    ПО (КурсыВалютПериод.Период = КурсыВалют.Период)
    ЛЕВОЕ СОЕДИНЕНИЕ ЦеныНоменклатурыПериод КАК ЦеныНоменклатурыПериод
    ПО Товары.Номенклатура = ЦеныНоменклатурыПериод.Номенклатура
    И Товары.НачалоДня = ЦеныНоменклатурыПериод.НачалоДня
    ЛЕВОЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО (ЦеныНоменклатурыПериод.Период = ЦеныНоменклатуры.Период)
    И (ЦеныНоменклатурыПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура)
```
---
Первую таблицу нельзя из РН, какого-нибудь, получить? Связи с параметрами всегда медленно работают.
---
Кстати начало дня от даты попробуйте
---
1) Кстати начало дня от даты попробуйте Так а надо? Что цены, что курсы у них периодичность день.
---
Вот поэтому и надо. В параметр передается с секундами и срезы формируются с секундами, вместо одного в день. Если несколько документов в день должно помочь.
---
араметр передается с секундами и срезы формируются с секундами, вместо одного в день. Если несколько документов в день должно помочь. Буду пробовать. Дату документа в НачалоДня оборачивать?
---
Точнее в НачалоПериода
---
Точнее в НачалоПериода А точно не все равно? Ведь количество переданных дат останется неизменным, просто они будут без секунд.
---
Ну на другой стороне увидят повторяющиеся значения и выполнят меньше запросов, но это только если документов в день больше чем 1.
---
а с какой целью делается через 3 запроса, а не через 1?
---
Ну.. . Так показалось проще. Знания по теме запросов пока на невысоком уровне.
---
СрезПоследних на каждую дату
---
попробуйте первый запрос такой

```1c
    ВЫБРАТЬ
    РеализацияТоваровУслугТовары.НомерСтроки КАК НомерСтрокиВДокументе,
    РеализацияТоваровУслугТовары.Номенклатура КАК НоменклатураВДокументе,
    РеализацияТоваровУслугТовары.Количество КАК КоличествоВДокументе,
    РеализацияТоваровУслугТовары.Цена КАК ЦенаВДокументе,
    РеализацияТоваровУслугТовары.СуммаСНДС КАК СуммаСНДСВДокументе,
    Док.Ссылка КАК ДокументРеализации,
    Док.Проведен КАК Проведен,
    Док.Валюта КАК ВалютаДокументаРеализации,
    Док.СуммаДокумента КАК СуммаДокументаРеализации,
    Док.Склад КАК СкладДокументаРеализации,
    Док.Дата КАК ДатаДокументаРеализации
    ИЗ
    Документ.РеализацияТоваровУслуг Док
    левое соединение
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    по Док.ссылка = РеализацияТоваровУслугТовары.ссылка
    ГДЕ
    Док.Дата между &НачПерДок и &КончПерДок
    //и Док.Проведен
```
---
почему левое соединение, а не внутреннее??
и в чем оптимизация, если это все 1с сделает под капотом
---
Спасибо, но по времени выполнения нет изменений. 3ий запрос если убрать - летает, опой чувствую там что-то не так
---
нужно все засунуть в один запрос
как вариант
создать таблицу цен с отбором по номенклатуре и периоду
создать таблицу валют с отбором по периоду
в таблицу реализаций добавить период начало дня
соединить таблицу цен и реализаций по дате и номенклатуре
соединить таблицу валют и реализаций по дате
соединить 3 последние таблицы
будет работать быстро ;))
---
Это пока сложновато для меня(( Пойду учить матчасть)
---
что-то вроде такого
все одним запросом
можно поиграться индексацией по периоду

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

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    &НачалоПериода КАК Период,
    КурсыВалютСрезПоследних.Курс КАК Курс
    ПОМЕСТИТЬ КурсыВалют
    ИЗ
    РегистрСведений.КурсыВалют.СрезПоследних(&НачалоПериода {(&НачалоПериода)}, Валюта = &ВалютаКурса) КАК КурсыВалютСрезПоследних

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    КурсыВалют.Период,
    КурсыВалют.Курс
    ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
    ГДЕ
    КурсыВалют.Валюта = &ВалютаКурса
    И КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    &НачалоПериода КАК Период,
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    ПОМЕСТИТЬ ЦеныНоменклатуры
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    &НачалоПериода {(&НачалоПериода)},
    ТипЦен = &ВидЦеныЗакупки
    И Номенклатура В
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    Товары.Номенклатура
    ИЗ
    Товары)) КАК ЦеныНоменклатурыСрезПоследних

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    ЦеныНоменклатуры.Период,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена
    ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
    ЦеныНоменклатуры.ТипЦен = &ВидЦеныЗакупки
    И ЦеныНоменклатуры.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И ИСТИНА В
    (ВЫБРАТЬ ПЕРВЫЕ 1
    ИСТИНА
    ИЗ
    Товары
    ГДЕ
    ЦеныНоменклатуры.Номенклатура = Товары.Номенклатура)

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВложенныйЗапрос.НачалоДня КАК НачалоДня,
    МАКСИМУМ(КурсыВалют.Период) КАК Период
    ПОМЕСТИТЬ КурсыВалютПериод
    ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    Товары.НачалоДня КАК НачалоДня
    ИЗ
    Товары КАК Товары) КАК ВложенныйЗапрос
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
    ПО ВложенныйЗапрос.НачалоДня >= КурсыВалют.Период

    СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.НачалоДня

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВложенныйЗапрос.НачалоДня КАК НачалоДня,
    ВложенныйЗапрос.Номенклатура,
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
    ПОМЕСТИТЬ ЦеныНоменклатурыПериод
    ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    Товары.Номенклатура КАК Номенклатура,
    Товары.НачалоДня КАК НачалоДня
    ИЗ
    Товары КАК Товары) КАК ВложенныйЗапрос
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура
    И ВложенныйЗапрос.НачалоДня >= ЦеныНоменклатуры.Период

    СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.НачалоДня,
    ВложенныйЗапрос.Номенклатура

    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Товары.НомерСтроки,
    Товары.Номенклатура,
    Товары.Количество,
    Товары.Цена,
    Товары.СуммаСНДС,
    Товары.ДокументРеализации,
    Товары.Проведен,
    Товары.ВалютаДокумента,
    Товары.СуммаДокумента,
    Товары.СкладДокумента,
    Товары.Дата,
    ЕСТЬNULL(КурсыВалют.Курс, 0) КАК Курс,
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК ЦенаЗакупки
    ИЗ
    Товары КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалютПериод КАК КурсыВалютПериод
    ПО Товары.НачалоДня = КурсыВалютПериод.НачалоДня
    ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
    ПО (КурсыВалютПериод.Период = КурсыВалют.Период)
    ЛЕВОЕ СОЕДИНЕНИЕ ЦеныНоменклатурыПериод КАК ЦеныНоменклатурыПериод
    ПО Товары.Номенклатура = ЦеныНоменклатурыПериод.Номенклатура
    И Товары.НачалоДня = ЦеныНоменклатурыПериод.НачалоДня
    ЛЕВОЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО (ЦеныНоменклатурыПериод.Период = ЦеныНоменклатуры.Период)
    И (ЦеныНоменклатурыПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура)
```
---
Офигенно, спасибо. Теперь буду разбираться как это работает))
---
попробуйте в третьем запросе отбор по Вид цены из секции Где в отбор вирт.таблицы переместите.
---
е от Вроде немного ускоряет. Потестирую