Запрос к бухгалтерскому регистру остатков выполняется больше секунды, хотя ничего крамольного в нем не вижу.

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

    СГРУППИРОВАТЬ ПО
    Остатки.Счет,
    Остатки.Субконто1,
    Остатки.Субконто2,
    Остатки.Субконто3,
    Остатки.Валюта,
    ВЫБОР
    КОГДА Остатки.Счет.Валютный = ИСТИНА
    ТОГДА Остатки.Валюта
    ИНАЧЕ НЕОПРЕДЕЛЕНО
    КОНЕЦ

    УПОРЯДОЧИТЬ ПО
    Остатки.Счет,
    Остатки.Субконто1,
    Остатки.Субконто2,
    Остатки.Субконто3,
    Валюта
```

При проведении документа "Возврат от покупателя" время выполнения этого запроса составляет 43% от общего. Можно ли что-либо сделать?
---
Короче где-то так:

```1c
    ВЫБРАТЬ
    Остатки.Счет,
    Остатки.Субконто1,
    Остатки.Субконто2,
    Остатки.Субконто3,
    Остатки.СуммаОстаток КАК СуммаОстаток,
    ЕСТЬNULL(Остатки.Валюта, НЕОПРЕДЕЛЕНО) КАК Валюта,
    Остатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
    &Период,
    Счет = &Счет,
    &ВидыСубконто,
    Организация = &Организация
    И Субконто1 = &Субконто1
    И Субконто2 = &Субконто2) КАК Остатки

    УПОРЯДОЧИТЬ ПО
    Остатки.Счет,
    Остатки.Субконто1,
    Остатки.Субконто2,
    Остатки.Субконто3,
    Валюта
```
---
ВЫРАЗИТЬ(СУММА(ВЫБОР
                КОГДА Остатки.СуммаОстаток ЕСТЬ NULL
                    ТОГДА 0
                ИНАЧЕ Остатки.СуммаОстаток
            КОНЕЦ) КАК ЧИСЛО) КАК СуммаОстаток,
Зачем данная конструкция? Null в остатках не будет
Также установите массив видов субконто.

Также сортировка по Счету, Субконто1, Субконто2 тоже лишние, вы их устанавливаете параметром, значит они будут однозначные. Можно их также в запрос не выбирать, если они устанавливаются параметром. Валютный ли счет можно узнать вне запроса, счет то есть. И да. группировки не нужны.
---
Права полные, RLS не используется?
---
RLS используется. Но фразы "разрешенные" в запросе нет.
---
я вижу что нет. А у пользователя есть полные права или нет?

Я столкнулся с диким падением производительности в простейших запросах в УТ из-за того, что 1с-ники "оптимизировали" rls под postgre sql.
Теперь с нетерпением жду обещанное исправление. Проявляется если у пользователя нет полных прав.
---
При замерах запускала под полными правами. А так, по разному. У нас в RLS действительно наворот. Платформа 8.2.18.102. Там по идее 1С ничего не мог "оптимизировать".
---
"Остатки.СуммаОстаток ЕСТЬ NULL" - NULLу тут неоткуда взяться. Это раз.
---
Операция СГРУППИРОВАТЬ выглядит совершенно лишней. Виртуальные таблицы РБ и РН сами агрегируют по выбранным в запросе ключевым полям.

Присоединяюсь к (3) и (4).

И такая сортировка вообще смысла не имеет, поскольку сортирует по числовым значениям ссылок.
---
Подозреваю, что нужны остатки по субконто с определенным типом. Используйте выражение Выразить( Остатки.Субконто1 Как Справочник.Номенклатура) или что оно там должно быть.
И да, конструкция типа "СУММА(ВЫБОР
                КОГДА Остатки.ВалютнаяСуммаОстаток ЕСТЬ NULL
                    ТОГДА 0
                ИНАЧЕ Остатки.ВалютнаяСуммаОстаток
            КОНЕЦ) " - полный бред.
---
Вместо

```1c
    "ВЫБОР
    КОГДА Остатки.Счет.Валютный = ИСТИНА
    ТОГДА Остатки.Валюта
    ИНАЧЕ НЕОПРЕДЕЛЕНО
    КОНЕЦ КАК Валюта"
```

достаточно написать:

```1c
    ЕСТЬNULL(ХозрасчетныйОстатки.Валюта, Неопределено)
```
---
Про ГРУППИРОВАТЬ уже сказали.

Ещё хорошим тоном считается явно передавать виды субконто в параметр виртуальной таблицы.
---
Ещё хорошим тоном считается явно передавать виды субконто в параметр виртуальной таблицы. Параметр &Субконто "не про это", поэтому сомневаюсь, чтобы повысило производительность.
---
Помимо порядка еще типизирует субконто, так что повлияет.
---
, (21) да, типизация субконто не помешает точно. Сделаю. Спасибо.
---
А, если нужно только часть субконто по видам выводить (2 из 40), тогда, конечно, да.
---
Короче где-то так:

```1c
    ВЫБРАТЬ
    Остатки.Счет,
    Остатки.Субконто1,
    Остатки.Субконто2,
    Остатки.Субконто3,
    Остатки.СуммаОстаток КАК СуммаОстаток,
    ЕСТЬNULL(Остатки.Валюта, НЕОПРЕДЕЛЕНО) КАК Валюта,
    Остатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
    &Период,
    Счет = &Счет,
    &ВидыСубконто,
    Организация = &Организация
    И Субконто1 = &Субконто1
    И Субконто2 = &Субконто2) КАК Остатки

    УПОРЯДОЧИТЬ ПО
    Остатки.Счет,
    Остатки.Субконто1,
    Остатки.Субконто2,
    Остатки.Субконто3,
    Валюта
```
---
да, спасибо. Наверное где-то так. Ну и упорядочение наверное уберу, как в (6) советовали.
---
если добавить Автоупорядочивание (флажок в конструкторе), порядок будет по наименованиям, а не по гуидам. Сильно на быстродействии имхо не скажется.
---
+(14) Хотя для субконто автоупорядочивание может серьезно подвесить.
---
У нас по счету взаиморасчетов только 2 субконто. В результате запроса получим только одну строку. Думаю, что можно убрать упорядочивание.
---
Сильно на быстродействии имхо не скажется.Может очень сильно сказаться. Это практически то же самое, что делать соединение непосредственно по полям составного типа.
---
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &Период,
            Счет = &Счет,
            ,
            Организация = &Организация
                И Субконто1 = &Субконто1
                И Субконто2 = &Субконто2) КАК Остатки
Вижу у запроса параметры... Запрос совершенно случайно не в цикле выполняется для каждой строки документа возврата?
---
нет, конечно, не в цикле.
Это остатки по взаиморасчетам. Субконто там Контрагент и ДоговорКорагента.
---
С учетом всех советов получилось:

```1c
    ВЫБРАТЬ
    Остатки.Счет,
    Остатки.Субконто1,
    Остатки.Субконто2,
    ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК СуммаОстаток,
    ВЫБОР
    КОГДА Остатки.Счет.Валютный = ИСТИНА
    ТОГДА Остатки.Валюта
    ИНАЧЕ НЕОПРЕДЕЛЕНО
    КОНЕЦ КАК Валюта,
    ЕСТЬNULL(Остатки.ВалютнаяСуммаОстаток, 0) КАК ВалютнаяСуммаОстаток
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
    &Период,
    Счет = &Счет,
    &ВидыСубконто,
    Организация = &Организация
    И ПодразделениеОрганизации = &ПодразделениеОрганизации
    И флагБУ = &флагБУ
    И ФлагУУ
    И Субконто1 = &Субконто1
    И Субконто2 = &Субконто2) КАК Остатки
```

Время выполнения уменьшилось в 3 раза. Спасибо огромное всем!!!
---
ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК СуммаОстаток,
Уберите проверку на Null
---
Ok
---
всеж таки Субконто1 или Субконто2 да и вообще аналитику лучше указывать в начале условия потому как значений там наберется наверняка больше чем в Организация и прочем
---
думаете, что порядок влияет на скорость выполнения запроса?
---
я гарантирую это
---
Спасибо. Я учту.
---
Основная прелесть в ограничении видов субконто : &ВидыСубконто :)