Имя: Пароль:
1C
1С v8
NULL в результате запроса
0 PuhUfa
 
25.12.13
12:15
Простой запрос:

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

Задаю счет 51 и субконто по которому не было движений.
В результате запроса получаю СуммаОборотКт = NULL
Что не так?
1 1Сергей
 
25.12.13
12:17
Почему не пользуешься параметрами виртуальной таблицы?
2 Maxus43
 
25.12.13
12:17
условия в параметры, по соседству организации, и будет у тебя пустой результат запроса. Да и щас собственно должен быть пустой
3 PuhUfa
 
25.12.13
12:20
(1) там просто потом будут разные фильтры в зависимости от условий. это пока черновик
(2) я тоже так думал, но:
Результат = Запрос.Выполнить();
Результат.Пустой() = Ложь
4 1Сергей
 
25.12.13
12:23
(3) ты ведь в 0 не весь запрос показал, правда?
5 1Сергей
 
25.12.13
12:23
там, наврено, соединения есть...
6 vicof
 
25.12.13
12:23
(3) агрегируется пустой результат запроса, видимо, поэтому и возникают NULLы, соответственно результат не пустой
7 vicof
 
25.12.13
12:24
(0) что консоль говорит?
8 PuhUfa
 
25.12.13
12:25
(4) ну если тебе так хочется -)

    Запрос = Новый Запрос();
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СУММА(ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотКт,0)) КАК СуммаОборотКт
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНач, &ДатаКон, , , , Организация = &Организация, , ) КАК ХозрасчетныйОбороты
    |ГДЕ
    |    ХозрасчетныйОбороты.Счет = &Счет";
    
    Запрос.УстановитьПараметр("ДатаНач",        ДатаНачала);
    Запрос.УстановитьПараметр("ДатаКон",        ДатаКонца);
    Запрос.УстановитьПараметр("Организация",    Организация);
    Запрос.УстановитьПараметр("Счет",            Детализация.Счет);
    
    Если Детализация.Счет = ПланыСчетов.Хозрасчетный.РасчетныеСчета Тогда
        Запрос.Текст = Запрос.Текст +
        "
        |    И ХозрасчетныйОбороты.Субконто2 = &Субконто2";
        
        Запрос.УстановитьПараметр("Субконто2",Детализация.Аналитика);
        
    ИначеЕсли Детализация.Счет = ПланыСчетов.Хозрасчетный.РасчетыСПодотчетнымиЛицами Тогда
        
    Иначе    
        
    КонецЕсли;    
    
    Результат = Запрос.Выполнить();
    ВТ = Результат.Выгрузить();
    Если Результат.Пустой() Тогда
        Возврат 0;
    Иначе    
        Выборка = Результат.Выбрать();
        Пока Выборка.Следующий() Цикл
            Возврат Выборка.СуммаОборотКт;
        КонецЦикла    
    КонецЕсли;
9 1Сергей
 
25.12.13
12:28
(8) а теперь сфотографируй, что у тебя в ВТ
10 GANR
 
25.12.13
12:28
(0) Скорее всего в выборку ДО группировки не попадает ни одной записи - нужно ставить еще одну проверку.

ЕСТЬNULL(СУММА(ЕСТЬNULL(ХозрасчетныйОбороты.СуммаОборотКт,0)),0)
11 vicof
 
25.12.13
12:30
(10) собственно (6)
12 Sabbath
 
25.12.13
12:31
(8) обманщик
13 PuhUfa
 
25.12.13
12:32
(10) так норм. спс.
(12) ??
14 Sabbath
 
25.12.13
12:33
(13) не показал весь запрос
15 mikecool
 
25.12.13
12:39
(6) емнип, агрегаты в 1с не должны возвращать нул
16 1Сергей
 
25.12.13
12:42
(15) агрегаты = виртуальные таблицы?
17 GenV
 
25.12.13
12:42
10+ еще способ: добавить в запрос (0) какую-нибудь группировку. Например "Счет", он все равно один.
18 Defender aka LINN
 
25.12.13
13:28
(2) Будет ровно то же самое
(0) Все так, а чего ты ждешь?
19 Ненавижу 1С
 
гуру
25.12.13
13:38
достаточно было:

ХозрасчетныйОбороты.СуммаОборотКт КАК СуммаОборотКт
20 WildSery
 
25.12.13
14:15
(10) Два isNULL это слишком. Достаточно наружного.
(15) Чепуха, агрегаты в любой СУБД могут возвращать NULL (кроме КОЛИЧЕСТВО()).