Имя: Пароль:
1C
1С v8
ЕстьNULL как правильно использовать в запросе...
,
0 Samir
 
20.06.13
09:25
Никак не соображу как правильно использовать ЕстьNULL в запросе...

Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    СУММА(-ХозрасчетныйОбороты.СуммаОборотКт) КАК ВыручкаВозврат,
                  |    СУММА(-(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)) КАК ВыручкаНДСВозврат,

Иногда ВыручкаВозврат и ВыручкаВозвратНДС - NULL

Как правильно применить в запросе ЕстьNULL?
1 cw014
 
20.06.13
09:26
Смотря что ты хочешь
2 XLife
 
20.06.13
09:26
СУММА(ЕстьNULL(ВыручкаВозврат,0))
СУММА(-(ЕстьNULL(ХозрасчетныйОбороты.СуммаОборотКт,0) - ЕстьNULL(ХозрасчетныйОбороты.СуммаНУОборотКт,0)))
3 Ёпрст
 
20.06.13
09:27
ну дык, ЕстьNull(Вася,0)
4 Samir
 
20.06.13
09:28
Запрос иногда возвращает NULL, далее я суммирую возвраты
но при суммировании он пишет, что не может быть преобразовано в число
5 Samir
 
20.06.13
09:35
Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    СУММА(-(ЕстьNULL(ХозрасчетныйОбороты.СуммаОборотКт,0))) КАК ВыручкаВозврат,


Все равно не может быть преобразовано в число
6 Ёпрст
 
20.06.13
09:36
а весь текст то покажи
7 Samir
 
20.06.13
09:39
ВыручкаВозврат = 0;    


Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    СУММА(-(ЕстьNULL(ХозрасчетныйОбороты.СуммаОборотКт,0))) КАК ВыручкаВозврат,
                  |    СУММА(-(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)) КАК ВыручкаНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиПлатные
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслПлВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиДополнительные
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслДопВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиПрочие
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслПрочВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &УслугиПрочие
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК УслПрочВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &КамераХранения
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК КамераХраненияВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &РеализацияТовара
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК РеализацияТовараВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &Прочие
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК ПрочиеВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиПлатные
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслПлНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиДополнительные
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслДопНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиПрочие
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслПрочНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &УслугиПрочие
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК УслПрочНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &КамераХранения
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК КамераХраненияНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &РеализацияТовара
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК РеализацияТовараНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &Прочие
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК ПрочиеНДСВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиКосметология
                  |                ТОГДА -ХозрасчетныйОбороты.СуммаОборотКт
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслКосмВозврат,
                  |    СУММА(ВЫБОР
                  |            КОГДА ВложенныйЗапросВидУслуг.ВидУслуг = &МедуслугиКосметология
                  |                ТОГДА -(ХозрасчетныйОбороты.СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт)
                  |            ИНАЧЕ 0
                  |        КОНЕЦ) КАК МедУслКосмНДСВозврат
                  |ИЗ
                  |    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачПериода, &КонПериода, Регистратор, Счет В ИЕРАРХИИ (&Счет90_01_1), , Организация = &Организация, КорСчет В ИЕРАРХИИ (&Счет76_06), ) КАК ХозрасчетныйОбороты
                  |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                  |            ЗначенияСвойствОбъектов.Значение КАК ВидУслуг,
                  |            Номенклатура.Ссылка КАК Ссылка
                  |        ИЗ
                  |            Справочник.Номенклатура КАК Номенклатура
                  |                ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                  |                ПО (ВЫБОР
                  |                        КОГДА ЗначенияСвойствОбъектов.Свойство = &ВидУслуг
                  |                            ТОГДА Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
                  |                        ИНАЧЕ ЛОЖЬ
                  |                    КОНЕЦ)) КАК ВложенныйЗапросВидУслуг
                  |        ПО ХозрасчетныйОбороты.Субконто3 = ВложенныйЗапросВидУслуг.Ссылка";
   Запрос.УстановитьПараметр("Организация",Организация);
   Запрос.УстановитьПараметр("НачПериода",НачПериода);
   Запрос.УстановитьПараметр("КонПериода",КонецДня(КонПериода));
   Запрос.УстановитьПараметр("Счет76_06", ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПокупателямиИЗаказчиками);
   Запрос.УстановитьПараметр("Счет90_01_1",ПланыСчетов.Хозрасчетный.ВыручкаНеЕНВД);
   //Запрос.УстановитьПараметр("НомерКвитанции",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("№ квитанции"));
   //Запрос.УстановитьПараметр("НомерТерминала",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("№ терминала"));
   //Запрос.УстановитьПараметр("НомерZОтчета",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("№ Z-отчета"));
   //Запрос.УстановитьПараметр("НомерККМ",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("№ ККМ"));
   Запрос.УстановитьПараметр("ВидУслуг",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Вид услуг"));
   Запрос.УстановитьПараметр("МедуслугиПлатные",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Медуслуги платные"));
   Запрос.УстановитьПараметр("МедуслугиДополнительные",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Медуслуги дополнительные"));
   Запрос.УстановитьПараметр("МедуслугиПрочие",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Медуслуги прочие"));
   Запрос.УстановитьПараметр("УслугиПрочие",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Услуги прочие"));
   Запрос.УстановитьПараметр("КамераХранения",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Камера хранения"));
   Запрос.УстановитьПараметр("РеализацияТовара",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Реализация товара"));
   Запрос.УстановитьПараметр("Прочие",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Прочие"));
   Запрос.УстановитьПараметр("МедуслугиКосметология",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Медуслуги косметология"));
   Запрос.УстановитьПараметр("МедуслугиПлатные",Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Медуслуги платные"));
   Выборка = Запрос.Выполнить().Выбрать();
   Если Выборка.Следующий() Тогда
       ОбластьСтрокаВозвратов = Макет.ПолучитьОбласть("СтрокаВозвратов");
       ОбластьСтрокаВозвратов.Параметры.Заполнить(Выборка);
       ТабДокумент.Вывести(ОбластьСтрокаВозвратов);
       ВыручкаВсего = ВыручкаВсего - Выборка.ВыручкаВозврат;    

И на этом этапе ступор....
8 EvgeniuXP
 
20.06.13
09:40
(4) отфильтруй :)
9 Ёпрст
 
20.06.13
09:41
(7) у тя там NULL никогда не будет..
10 Ёпрст
 
20.06.13
09:41
ошибка в другом месте
11 Галахад
 
гуру
20.06.13
09:44
Почему isnull только в одном месте? А в другие Пушкин засовывать будет?
12 Samir
 
20.06.13
09:50
(11) Туда тоже можно, но для начала нужно с этой проблемой разобраться, а уже по образу и подобию с другими...
13 Ёпрст
 
20.06.13
09:51
(12) заремь все поля запроса, оставь верхнее и смотри.

Я хреново знаю за снеговик, но разве ВТ табличка Обороты может возвращать NULL в ресурсах ?!
п..ц тогда
14 zak555
 
20.06.13
09:53
(7) в общем случае ВыручкаВозврат <> сумме всем СуммаОборотКт - ХозрасчетныйОбороты.СуммаНУОборотКт
15 Ненавижу 1С
 
гуру
20.06.13
09:55
может, так  как группировок нет, то вполне может быть NULL, если выборка пустая, учите ребята SQL
16 Samir
 
20.06.13
09:56
(15) база на SQL
17 Ненавижу 1С
 
гуру
20.06.13
09:56
(16) какая разница, поведение общее
18 Ёпрст
 
20.06.13
09:57
(15) ? с х..ли ?
19 Samir
 
20.06.13
09:57
может не в запросе, а в переборке результатов поставить какое-нить условие типа если Null тогда выборка.следующий()
20 Samir
 
20.06.13
09:58
Причем эта ошибка вылезла за 1 день, за все остальные отчет отрабатывает. Это была суббота и возвратов не было
21 Ёпрст
 
20.06.13
09:58
и причем тут группировки, если ВТ и так свёрнута, а унутри - обычный select и Sum унутри, которая априори null не выдаст
22 Галахад
 
гуру
20.06.13
09:59
Консоль запросов для кого придумали?
Ну или выгрузи результат запроса в ТЗ и посмотри.
23 Ненавижу 1С
 
гуру
20.06.13
09:59
(18) да, да, учи ))
24 Ненавижу 1С
 
гуру
20.06.13
10:00
(0) убери ото всюду суммирование и увидишь, что при случае NULL у тебя будет пустая выборка
25 Samir
 
20.06.13
10:00
(21) Смотрю в отладчике, действительно все параметры Null
26 Samir
 
20.06.13
10:00
Ибо возвратов не было. Редкое явление, но стряслось
27 Ёпрст
 
20.06.13
10:01
(23) лень профайлер открывать,чтобы посмотреть, че там летит при обращении к ВТ Обороты, но знание sql тут не при чем.
28 Ненавижу 1С
 
гуру
20.06.13
10:02
(27) как раз при том:

SELECT SUM(X) --тут будет NULL
FROM T
WHERE 1=0
29 Ёпрст
 
20.06.13
10:04
(28) согласен
30 Samir
 
20.06.13
10:06
А что мне подскажите?
31 Ёпрст
 
20.06.13
10:07
(30) естьnull втыкать во все обращения к ресурсам
ХозрасчетныйОбороты
32 Ёпрст
 
20.06.13
10:31
(28) но с другой стороны, могли бы и в ВТ воткнуть сразу:

select ISNULL(sum(Х),0)
where 1=0

:)
33 Ненавижу 1С
 
гуру
20.06.13
10:43
(32) не могли, тогда бы ВТ выдавала абсолютно все записи: есть остатки, нет остатков, что не есть хорошо
34 Ёпрст
 
20.06.13
10:44
(33) Ну и скуль тут как бэ не причем,

select
Sum(null+10)

прекрасно отработает в скуле..
35 Ёпрст
 
20.06.13
10:45
тут проблема в 1с-ине, раз она "не может быть преобразовано в число"
36 Ёпрст
 
20.06.13
10:46
(33) а на счет остатков - там тупо having стоит на результат..
37 Ненавижу 1С
 
гуру
20.06.13
10:47
(34) и че?
(35) непонятно
(36) а целом, что получается?
38 Ненавижу 1С
 
гуру
20.06.13
10:47
ИМХО, не надо ничего городить, достаточно нормально юзать запросы
39 Ёпрст
 
20.06.13
10:48
(37) ну как че ? виновата 1с-ина, которая хз как транслирует функцию сумма, раз она не может переварить это:
sum(null+10)
40 Steini
 
20.06.13
10:51
Подытожим:
известное дело, когда в запросе одни лишь СУММА(), и таблица пустая, то вернется NULL.

Решение проблемы: использовать еще раз ЕСТЬNULL: ЕСТЬNULL(СУММА(),0) ну или программно вне запроса то же самое.
41 Ёпрст
 
20.06.13
10:51
Вообще, странная ошибка, учитывая, что

выбрать Сумма(null + 1) работает в консоли запросов.
42 Ненавижу 1С
 
гуру
20.06.13
10:59
(39) у меня может
43 Ёпрст
 
20.06.13
11:12
(42) ну вот и хз, чего за ошибка тогда "не может быть преобразовано в число", раз (41) работает
44 Ненавижу 1С
 
гуру
20.06.13
11:25
(43) ошибка у него не в запросе, а в использовании его результата:

ВыручкаВсего = ВыручкаВсего - Выборка.ВыручкаВозврат;

естественно с NULL операции в самом коде недопустимы
45 Ёпрст
 
20.06.13
11:25
(44) ну вот и я про то, что в запросе писать естьNull не надо
:)
46 Ненавижу 1С
 
гуру
20.06.13
11:27
(45) надо ))
лучше естьNULL вместо того чтобы в коде проверять на NULL
47 Ёпрст
 
20.06.13
11:34
уел
48 Ненавижу 1С
 
гуру
20.06.13
11:37
(47) хватит меня троллить! ))
49 Ёпрст
 
20.06.13
12:03
(48) не-не-не .. я еще не всё про нулл и неопределенно понял
:)
2 + 2 = 3.9999999999999999999999999999999...