Имя: Пароль:
1C
1С v8
Непонятное поведение платформы при выполнении отчета на СКД
0 slafor
 
11.05.21
18:58
Есть доработанный отчет на СКД в 1С:Рознице. Там есть такой фрагмент запроса:

    СУММА(ВЫБОР
            КОГДА Продажи.КоличествоОборот = 0
                ТОГДА Продажи.СтоимостьОборот
            КОГДА Продажи.КоличествоОборот > 0
                ТОГДА ВЫРАЗИТЬ(Продажи.СтоимостьОборот - ВЫБОР
                            КОГДА Себест.СуммаРасход ЕСТЬ NULL
                                    И Себест.КоличествоРасход ЕСТЬ NULL
                                ТОГДА 0
                            ИНАЧЕ Себест.СуммаРасход / Себест.КоличествоРасход
                        КОНЕЦ * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))
            КОГДА Продажи.КоличествоОборот < 0
                ТОГДА ВЫРАЗИТЬ(Продажи.СтоимостьОборот - ВЫБОР
                            КОГДА Себест.СуммаПриход ЕСТЬ NULL
                                    И Себест.КоличествоПриход ЕСТЬ NULL
                                ТОГДА 0
                            ИНАЧЕ Себест.СуммаПриход / Себест.КоличествоПриход
                        КОНЕЦ * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))
        КОНЕЦ) КАК ВаловаяПрибыль

Выполняется без ошибок. При переносе этого кода в другой запрос, НЕ на СКД, в некоторых случаях отчет останавливается с ошибкой: "Деление на 0 значения типа Numeric ".

Ладно, разобрался, вставил вот такое дополнение:

КОГДА Себест.КоличествоРасход <> 0
ТОГДА Себест.СуммаРасход / Себест.КоличествоРасход
ИНАЧЕ 0

то же самое сделал и для Себест.КоличествоПриход.

хотя она перед этим и проверяет Себест.КоличествоРасход на NULL, но, видимо, для нее это NULL и 0 - это разные понятия (хотя где-то здесь на форуме и прочитал, что для системы в запросе это одно и то же).

Итог: отчет работает без ошибок, НО выдает разные результаты с отчетом на СКД. Не всегда, процентов в 10-ти от всего итогового списка. И как подсказывает мне интуиция, это именно из-за тех случаев, где в Себест.КоличествоПриход или Себест.КоличествоРасход стоит 0.

Вопрос такой: почему в СКД работает, а в обычном запросе - нет? Встречался ли кто-нибудь с такой проблемой?
И может ли быть так, что результаты получаются неправильными именно из-за того, что СКД игнорирует "нулевые" значения при делении, если они стоят в знаменателе?
1 ДенисЧ
 
11.05.21
19:08
"для нее это NULL и 0 - это разные понятия"

Внезапно, да? )))

Это ОЧЕНЬ разные понятия.
2 slafor
 
11.05.21
19:19
(1) Ну я-то знаю, что разные, но где-то прочитал, что ИМЕННО для запросов эти понятия одинаковы. Хотя и не поверил, поэтому и сделал сравнения с нулём.

Вопрос в другом - в СКД-то это сравнения с нулём нету, а ошибки не возникает...
3 ДенисЧ
 
11.05.21
19:26
Ту книгу, где прочитал - сожги, пепел разотри в пыль и рассей над Селезнёвкой.
Сайт - в чёрные списки и устрой массировованную ддос-атаку.
4 Chameleon1980
 
11.05.21
19:34
а где ещё кроме запросов в 1с ты понятие null встречал?
5 slafor
 
11.05.21
21:04
(4) Ну хорошо, тут я не прав. Но это не суть вопроса )

Меня больше интересует, почему код

КОГДА Продажи.КоличествоОборот > 0
      ТОГДА ВЫРАЗИТЬ(Продажи.СтоимостьОборот - ВЫБОР
                       КОГДА Себест.СуммаРасход ЕСТЬ NULL
                                    И Себест.КоличествоРасход ЕСТЬ NULL
                          ТОГДА 0
                          ИНАЧЕ Себест.СуммаРасход / Себест.КоличествоРасход
                      КОНЕЦ * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))

не работает в обычном отчете без СКД, а в отчете на СКД работает, а вот код

КОГДА Продажи.КоличествоОборот > 0
      ТОГДА ВЫРАЗИТЬ(Продажи.СтоимостьОборот - ВЫБОР
                       КОГДА Себест.СуммаРасход ЕСТЬ NULL
                                    И Себест.КоличествоРасход ЕСТЬ NULL
                          ТОГДА 0
                          КОГДА Себест.КоличествоРасход <> 0
                               ТОГДА Себест.СуммаРасход / Себест.КоличествоРасход
                               ИНАЧЕ 0 КОНЕЦ
                           КОНЕЦ * Продажи.КоличествоОборот КАК ЧИСЛО(15, 2))

рааботает в обычном отчете. Ведь конструкцией на проверку Себест.КоличествоРасход ЕСТЬ NULL я уже проверил КоличествоРасход на NULL, а значит, и на 0 тоже.
6 slafor
 
11.05.21
21:07
(+5) Торопился, поэтому не дописал: читать как "ТОГДА 0 ИНАЧЕ КОГДА Себест.КоличествоРасход <> 0 ТОГДА" далее все правильно
7 Ненавижу 1С
 
гуру
11.05.21
21:26
Ведь конструкцией на проверку Себест.КоличествоРасход ЕСТЬ NULL я уже проверил КоличествоРасход на NULL, а значит, и на 0 тоже

Нет, а почему на 0 тоже, а не на 42 тоже?
8 slafor
 
11.05.21
22:49
(7) Тоже согласен.

Но в запросе на СКД нет проверки на 0, а ошибка не вылезает.
9 slafor
 
11.05.21
22:51
В общем, для того, чтобы не обсуждать набивший уже оскомину NULL ) , поставлю вопрос иначе:

Почему при попытке деления на 0 в СКД отчет не прерывается с ошибкой, а тот же запрос, выполняемый отдельно (т.е. без СКД) - прерывается?
10 Cthulhu
 
11.05.21
23:04
у тебя в веточне вотетой глк который ты засунул в текст запроса своими собственными руками:
КОГДА Себест.СуммаРасход ЕСТЬ NULL И Себест.КоличествоРасход ЕСТЬ NULL ТОГДА 0
ИНАЧЕ Себест.СуммаРасход / Себест.КоличествоРасход КОНЕЦ
т.е. у тебя при Себест.СуммаРасход ЕСТЬ NULL ИЛИ Себест.КоличествоРасход ЕСТЬ NULL - делаеттся попытка совершить арифметическое действие с NULL и числом, которое порождает ошибку.
11 Ненавижу 1С
 
гуру
12.05.21
07:05
(10) делаеттся попытка совершить арифметическое действие с NULL и числом, которое порождает ошибку

Нет. Такие действия не порождают ошибку
12 Ненавижу 1С
 
гуру
12.05.21
07:06
(9) данные несколько разные наверное. Или в скд это поле не используется в настройках и компоновщик его выкинул из конечного запроса
13 slafor
 
12.05.21
15:55
(12) Запустил тот же отчет в консоли запросов - та же ошибка. Поставил галку "Остановка по ошибке" - и выяснил, что если запускать отчет на СКД в том же периоде, в котором возникает ошибка, срабатывает Попытка-Исключение, и берутся стандартные настройки. Что это значит, я не пойму...

Да и это не главное ) . Обойти "деление на 0" я могу, но непонятно, почему итоговые данные могут меняться. Запросы одинаковые что в отдельном отчете, что в отчете на СКД. Почти все совпадают, но вот именно, что почти. В некоторых случаях себестоимость различается. Редко - ну, может, в 2-х месяцах за полгода (у меня в отчете идет разбивка по месяцам).

Где можно поискать?
14 slafor
 
12.05.21
16:02
(+) Добавлю к "Редко - ну, может, в 2-х месяцах за полгода" - на самом деле, могу делать разбивку и по дням. Тут вообще все забавно - по всем датам себестоимость совпадает, а вот 20.12.2019 - различается по одному из складов на 80 рублей, хоть ты тресни. А запросы абсолютно одинаковые, типа "копи-паст", взял из СКД даже то, что мне не нужно было...
15 hhhh
 
12.05.21
16:50
(14) запросы разные. Потому в скд надо смотреть результирующий запрос. Который после применения всех настроек.
16 slafor
 
12.05.21
17:11
(15) А не подскажете, как можно посмотреть результирующий запрос?
17 slafor
 
12.05.21
18:40
(15) В общем, нашел статью https://infostart.ru/1c/articles/1222743/

В модуле отчета в процедуре ПриКомпоновкеРезультата вставил строки:

СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Сообщить(СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос);

И ничего нового - запрос точно такой же, какой я и задал. Наверное, что-то не так делаю?

Дело в том, что мне нужно узнать помесячно себестоимость за год плюс вытащить в результат строку с данными за весь предыдущий год (для сравнения) Уж очень не хочется идти таким путем: в цикле, через вызов схемы компоновки этого СКД, через разные компоновщики и процессор вывода результата компоновки... Во-первых, не понимаю самой сути того, что делаю, что само по себе неприятно, а во-вторых, помесячно такой отчет будет выполняться быстро, а вот за год - может и полчаса делаться...
18 slafor
 
12.05.21
21:31
(+17) Кстати, вот такой вопрос.

Решил все-таки попробовать использовать ранее созданный макет СКД и измерить его производительность. Оказалось, что за 12 месяцев, если каждый месяц обрабатывать отдельно (01.01.2020-31.01.2020, 01.02.2020-29.02.2020 и т.д.), он выполняется достаточно быстро:
"Время начала: 12.05.2021 21:18:00
Время окончания: 12.05.2021 21:22:25". Минут 5, не больше.

А вот если сразу установить период - год (с  01.01.2020 по 31.12.2021) то он может работать часа полтора. Почему так может быть?

Отчет дописан из типового до меня. Это отчет Валовой прибыли, только себестоимость там берется из новых регистров партоннного учета, а не рассчитывается программно.

Понимаю, что можно просто вызывать его в цикле по месяцам, а потом банально суммировать, но... хотелось бы понять, где собака зарыта! )
19 slafor
 
12.05.21
21:33
(+18), пардон, конечно, не " (с  01.01.2020 по 31.12.2021)", а " (с  01.01.2020 по 31.12.2020)).
20 hhhh
 
12.05.21
23:11
(17) не, это вообще не то.
21 hhhh
 
12.05.21
23:12
наверно надо рыть "Консоль СКД"
22 НоваяВолна
 
13.05.21
05:06
(0) у тебя нет особой беды. Проверил на NULL и 0 и все... Вот помню я ковырял портянку запроса которая в консоли выдавала правильный результат, а в СКД не так выстраивала группировки и всего в одной строке выдавала ошибочные данные. Долго ковырялся, пока это нашел.