Добрый день! Как-то странно, на мой взгляд, ведет себя запрос к регистру бухгалтерии при использовании функции "Сумма". Платформа 8.2.19.130 (УПП 1.3.110, но не в УПП дело).

Делаю запрос, в параметрах виртуальной таблицы указаны условия, по которым данных нет в базе. Вот "упрощение" запроса:

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

Все отрабатывает логично и хорошо, в выборке строк нет (консолью запросов смотрю).
Но как только в этот запрос добавляется группировка (суммирование), то вместо пустой выборки получается выборка из одной строки, в которой значения null.
Я не против даже этого, только мне бы хотелось как-то значения null привести к обычным нулям, в тексте запроса и видны мои попытки.

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

Вопросы:
1) Почему при добавлении агрегатной функции пустая выборка становится не пустой
2) как это победить
3) если это не победить, то можно ли эти null в запросе привести к числу
---
Все ЕСТЬNULL и ВЫРАЗИТЬ в этом запросе не нужны.
Вот так достаточно будет:

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

```1c
    ВЫБРАТЬ
    1 КАК Поле1
    ПОМЕСТИТЬ ВТ

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЕСТЬNULL(СУММА(ВТ.Поле1), 0) КАК Поле1
    ИЗ
    ВТ КАК ВТ
    ГДЕ
    ВТ.Поле1 > 1
```
---
Это фича. Причем не 1С. В MSSQL аналогичное поведение.
Просто нужно учитывать.
Добавьте условие
ИМЕЮЩИЕ НЕ .... ЕСТЬ NULL
---
Все ЕСТЬNULL и ВЫРАЗИТЬ в этом запросе не нужны.
Вот так достаточно будет:

```1c
    ВЫБРАТЬ
    ЕСТЬNULL(СУММА(ВЫБОР
    КОГДА ХозрасчетныйОбороты.Счет = &Сч6601
    И ХозрасчетныйОбороты.КорСубконто1 В (&СписокСчетов)
    ТОГДА ХозрасчетныйОбороты.СуммаОборотДт
    ИНАЧЕ 0
    КОНЕЦ), 0) КАК ВыплатаОсновногоДолга
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, , Счет В (&СчКредитов), &СубконтоДоговоры, Субконто1.ГосударственныйКонтракт = &ГосударственныйКонтракт, КорСчет = &Сч51, &СубконтоРасчетныеСчета) КАК ХозрасчетныйОбороты
```
---
о да, спасибо! помогло!
---
Спасибо за участие!
У меня потом все поля помещаются в возвращаемую структуру (с одноименными свойствами), поэтому дописка как ниже решила мои проблемы.
Хотелось, конечно, в запросе, но ИМЕЮЩИЕ НЕ .... ЕСТЬ NULL не пойдет, у меня что-то много таких полей, влом прописывать все.

```1c
    Выборка = Запрос.Выполнить().Выбрать ();
    Если Выборка.Следующий() Тогда
    ЗаполнитьЗначенияСвойств(Результат, Выборка);

    //приведем значения к нулям, в запросе для пустых данных этого не получается
    Для каждого ЭлСтр Из Результат Цикл
    Если ЭлСтр.Значение = null тогда
    Результат[ЭлСтр.Ключ] = 0;
    КонецЕсли;
    КонецЦикла;

    КонецЕсли;

    Возврат Результат;
```
---
Коллеги, вопрос вдогонку. Есть прниципиальная разница между синтаксисом написания агрегатной функции вместе с проверкой "ЕСТЬNULL", агрегировать ЕСТЬNULL, или поместить саму агрегатную функцию внутрь проверки на ЕСТЬNULL? Столкнулся с тем, что SonarQube на подобное написание:

```1c
    ЕСТЬNULL(Сумма(..., 0))
```
 ругается, хотя я всегда считал такое написание верным...
---
у вас тут скобочки неверно расставлены

```1c
    ЕСТЬNULL(Сумма(...), 0)
```

или вы хотели ?

```1c
    Сумма(ЕСТЬNULL(..., 0))
```
---
Вы абсолютно правы, конечно же надо так:

```1c
    ЕСТЬNULL(СУММА(...), 0)
```

В том и вопрос, как правильно? Как выше или:

```1c
    СУММА(ЕСТЬNULL(... , 0))
```
---
логично, что сначала просуммировали, потом преобразовали.
---
В консоли запросов если агрегируются проверенные на NULL поля - все равно выдается NULL в результате...
(10) то есть вариант
```1c
    ЕСТЬNULL(СУММА(...), 0)
```
 верный.