Деление на 0 в отчете Ведомость товаров по складам

1. _Vanda_ 11.01.17 15:48 Сейчас в теме
В отчете Ведомость товаров по складам возникает ошибка: деление на ноль 0.
Сам отчет проверила, там где есть деление есть проверка на 0:
ВЫБОР
	КОГДА &ЕдиницыКоличества = 0
		ТОГДА ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток
	КОГДА &ЕдиницыКоличества = 1
		ТОГДА ВЫБОР
				КОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов <> 0
					ТОГДА ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток / ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов
				ИНАЧЕ 0
			КОНЕЦ
КОНЕЦ
Показать

Больше деления нигде нет, отчет в консоли выполняется без ошибок.
данная ошибка выходит при любых настройках, при любом периоде. Кэш чистили. В отладчике по ошибке не останавливается.
С чем это может быть связано? Или как найти источник проблемы?
+
По теме из базы знаний
Найденные решения
14. _Vanda_ 12.01.17 08:02 Сейчас в теме
Вопрос решился. Сохранила отчет как внешний и запустил в отладке. Поругался на справочник единиц измерения,нужно было заполнить кратность для килограммов: 1кг=1кг.
SeregaSC; rinkorpa; ander_; alex_bitti; Ганс; +5
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. starik-2005 3036 11.01.17 17:04 Сейчас в теме
(1)
КОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов <> 0


КОГДА ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов, 0) <> 0
+
15. ice-net 19 12.01.17 09:06 Сейчас в теме
(6)
КОГДА ЕСТЬNULL(ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов, 0) <> 0


В данном случае, проверка на NULL - абсолютно лишняя операция, т.к. соединений быть не должно (99%), а Номенклатура (99%) не может быть NULL,
но если уж (вдруг есть соединение) и добавлять, то вот так (при условии, что реквизит КоэффициентЕдиницыДляОтчетов у ном-ры тип число:
ВЫБОР
      КОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура Есть NULL 
             Тогда 0
      Иначе
             ЕстьNULL(ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток,0) / ТоварыНаСкладахОстаткиИОбороты.Номенклатура.КоэффициентЕдиницыДляОтчетов
КОНЕЦ


ПС: И в Запросе NULL+5 = NULL
(12) ПС2.
реквизит числового типа = null
Априори, такого не может быть! Реквизит числового типа = числу, но никак не NULL! NULL- Это отдельный тип!
+
16. spacecraft 12.01.17 09:11 Сейчас в теме
(15)
Априори, такого не может быть! Реквизит числового типа = числу, но никак не NULL! NULL- Это отдельный тип!

Реквизиту числового типа можно присвоить Null. Другое дело, что Null в данном случае приведется к 0.
+
18. ice-net 19 12.01.17 09:28 Сейчас в теме
(16)
Вы хоть сами понимаете, что пишите? Реквизиту числового типа можно присвоить только значение числового типа!

Другое дело, что в коде, если вы говорите о коде, платформа автоматически преобразует патыется преобразовать пустые значения(типа NULL, неоперделено и любые другие не подходящие типы типа ссылки на справочник или документ) к Значению(в случае удачи, например Булево = 54515; //Истина), Пустому значению(Число = Справочники.Номенклатура.ПустаяСсылка(); // 0).

Т.е.
Реквизит = NULL абсолютно то же самое, что и Реквизит = неопределено, аналогично и Реквизит = ПустоеЗначениеТакогоЖеТипа.

Возвращаясь к вашей фразе, повторюсь, Реквизиту числового типа можно НЕ ВОЗМОЖНО присвоить Null, его можно только "обнулить"(привести к пустому значению данного типа) этой операцией
Прикрепленные файлы:
+
19. spacecraft 12.01.17 09:43 Сейчас в теме
(18)
Реквизиту числового типа можно НЕ ВОЗМОЖНО присвоить Null, его можно только "обнулить"(привести к пустому значению данного типа) этой операцией

как бы это не называлось...
Хорошо, если Вы так дотошны до буквы, тогда при присваивании Null, он автоматически приведется к 0.
Или будите спорить, что операция Реквизит = Null это не факт присваивания?
Реквизит = NULL абсолютно то же самое, что и Реквизит = неопределено, аналогично и Реквизит = ПустоеЗначениеТакогоЖеТипа.

А вот с этим я никогда и не спорил. Домыслы?
+
20. ice-net 19 12.01.17 09:49 Сейчас в теме
(19)
А вот с этим я никогда и не спорил. Домыслы?

пример)
Хорошо, если Вы так дотошны до буквы

Просто это принципиально разные вещи.

Согласитесь, если Вам скажут "Я реквизиту присвоил NULL, обработай в запросе только строки с NULL отдельно.."
Звучит очень не однозначно..
+
22. spacecraft 12.01.17 10:08 Сейчас в теме
(20)
Согласитесь, если Вам скажут "Я реквизиту присвоил NULL, обработай в запросе только строки с NULL отдельно.."
Звучит очень не однозначно..

Вот мое сообщение, которое было воспринято неоднозначно:
"Априори, такого не может быть! Реквизит числового типа = числу, но никак не NULL! NULL- Это отдельный тип!"

Реквизиту числового типа можно присвоить Null. Другое дело, что Null в данном случае приведется к 0.

Присвоить Null это операция Реквизит = Null. И он сразу же приводится к 0. Ничего более. Это совсем не означает, что там будет храниться Null.
+
23. spacecraft 12.01.17 10:23 Сейчас в теме
(20) я даже больше скажу.
В С++ допустима такая операция:
int a = NULL;

Она так же сделает приведение. И переменная а будет равна 0.
+
24. starik-2005 3036 12.01.17 15:23 Сейчас в теме
(23) там NULL - это определенная константа. Но, обычно, было не NULL, а nil - системная константа, равная нулю.

https://habrahabr.ru/post/165021/
На самом деле, в контексте указателей применим как NULL, так и 0, ввиду того что первый — не более чем макрос-обёртка для второго:
#define NULL ((void *)0)

Однако не следует использовать NULL в качестве замены 0 в тех местах, где ноль — алгебраическое значение:
int c = b*a;
if (c != NULL) {
printf("Neither b nor a is equal to 0\n");
}
+
2. comptr 31 11.01.17 16:01 Сейчас в теме
СКД? А в вычисляемых полях деление есть? А в ресурсах в поле "Выражение"?
+
3. пользователь 11.01.17 16:02
Сообщение было скрыто модератором.
...
4. ice-net 19 11.01.17 16:08 Сейчас в теме
Сдается мне, ошибка не в этом фрагменте (146%), а в каком-нибудь поле форматирования или в доп. полях или еще где.. раз уж в консоли все гуд.
_Vanda_; +1
5. Ганс 11.01.17 16:37 Сейчас в теме
Свой отчёт посмотрите в консоле отчётов и там же увидите какой отчёт выполняется и поймёте где идёт ошибка!
+
7. starik-2005 3036 11.01.17 17:04 Сейчас в теме
(5)
в консоле отчётов
в консоли
+
8. Ганс 11.01.17 17:33 Сейчас в теме
(7) Спасибо!)


(6) А дано ли деление на null даёт ошибку деления на "0"? )
+
9. spacecraft 11.01.17 17:37 Сейчас в теме
(8)
А дано ли деление на null даёт ошибку деления на "0"? )

Если тип числовой, то Null приводится к 0. Это было всегда.
+
10. Ганс 11.01.17 17:45 Сейчас в теме
(9) Где приводится? В запросе? В СКД?
+
11. spacecraft 11.01.17 17:47 Сейчас в теме
(10) конкретно тут - в математических операциях.
+
12. Ганс 11.01.17 18:26 Сейчас в теме
(11) вы серьёзно хотите сказать что null + 5 даст вам 5 на выходе?!?!?
+
13. spacecraft 11.01.17 18:44 Сейчас в теме
(12) не null + 5, а реквизит числового типа = null.
Есть реквизит числового типа Ревизит1.
То такой код даст 5:
Реквизит1 = Null;
Сообщить(Реквизит1 + 5);


Правда не уверен, что это работает в запросе. Там другая механика.
С запросом скорее всего не сработает. Тут согласен.
+
17. Ганс 12.01.17 09:25 Сейчас в теме
(13) С таким же успехом можно написать:
Реквизит1 = "Какая-нибудь чушь"
Сообщить(Реквизит1 + 5);

При условии что Реквизит1 имеет тип число, увидим на экране 5))
+
21. spacecraft 12.01.17 10:03 Сейчас в теме
(17) Вот пример:
Реквизит1 = "3" 
Сообщить(Реквизит1 + 5); 

Увидим на экране: 8
Все же происходит приведение?
Вот и с Null тоже самое.
+
14. _Vanda_ 12.01.17 08:02 Сейчас в теме
Вопрос решился. Сохранила отчет как внешний и запустил в отладке. Поругался на справочник единиц измерения,нужно было заполнить кратность для килограммов: 1кг=1кг.
SeregaSC; rinkorpa; ander_; alex_bitti; Ганс; +5
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот