Очень часто я слышал за свою консультационную деятельность: «Ваша Scala/iScala не умеет считать!». Давайте разберёмся, кто на самом деле не умеет считать.
Во-первых, Scala или iScala не моя, а Ваша 🙂
Во-вторых, считать, скорее всего не умеет тот, кто подымает этот вопрос, а Scala или iScala вообще ни причём и я готов пояснить это на конкретных примерах
Начнём с того, что если ваша компания что-то продаёт с НДС со ставкой 20% и цена продаваемого товара без НДС не кратна 50 копейкам (или 60 копейкам с учётом НДС), то округлений или коллизий как в примерах ниже просто невозможно избежать. Важно лишь понимать это, тогда и не будет вопросов про то, кто не умеет считать. Даже если у вас цены без НДС кратны 50 копейкам, но вы используете дробные единицы измерения, т.е., например, не штуки, которые предполагают целые количества, а, например, метры, килограммы или литры, то это также приводит к округлениям. Если не верите, проделайте эксперимент в Экселе.
Давайте разберём конкретный пример. Предположим, что у нас цены продажи содержат НДС, предположим также, что параметры округления установлены следующим образом (везде 0, т.е. округления не делаются). Тогда мы получим примерно следующую картину:
Округление цены за единицу | Округление по строке | Округление НДС по строке | Округление итогов | Округление итогов НДС | |||
0.00 | 0.00 | 0.00 | 0.00 | 0.00 | |||
Реальные значения | |||||||
№ строки | Цена с НДС (справочно) | Цена без НДС | Кол-во | Итого без НДС | НДС % | Итого НДС | Итого с НДС |
1 | 123.45 | 102.875 | 678.901 | 69841.940375 | 20% | 13968.388075 | 83810.32845 |
2 | 234.56 | 195.4666667 | 123.456 | 24131.5328 | 20% | 4826.30656 | 28957.83936 |
ИТОГО | 802.357 | 93973.473175 | 18794.694635 | 112768.16781 |
В то же время в документе, например, в накладной или счёте на оплату это будет выглядеть следующим образом (цены и все суммы отображаются с точностью до копейки, но в то же время на самом деле являются неокругленными. В этом случае возникает недоумённый возглас подобный описанному в самом верху страницы). Пользователь забывает о том, что базовой является цена с учётом НДС и просто берёт отображаемую цену без НДС, умножает её на количество и сравнивает с отображаемой суммой без НДС. И она не совпадает:
Отображается | Ожидается из отображаемой цены без НДС | |||||||||
№ строки | Цена с НДС (справочно) | Цена без НДС | Кол-во | Итого без НДС | НДС % | Итого НДС | Итого с НДС | Итого без НДС | Итого НДС | Итого с НДС |
1 | 123.45 | 102.88 | 678.901 | 69841.94 | 20% | 13968.39 | 83810.33 | 69845.33 | 13969.07 | 83814.40 |
2 | 234.56 | 195.47 | 123.456 | 24131.53 | 20% | 4826.31 | 28957.84 | 24131.94 | 4826.39 | 28958.33 |
ИТОГО | 802.357 | 93973.47 | 18794.69 | 112768.17 | 93977.27 | 18795.46 | 112772.73 |
А что будет, если изменить параметры округления для итогов по строке?
Округление цены за единицу | Округление по строке | Округление НДС по строке | Округление итогов | Округление итогов НДС | ||||||
0.00 | 0.01 | 0.01 | 0.00 | 0.00 | ||||||
Реальные значения | ||||||||||
№ строки | Цена с НДС (справочно) | Цена без НДС | Кол-во | Итого без НДС | НДС % | Итого НДС | Итого с НДС | |||
1 | 123.45 | 102.875 | 678.901 | 69841.94 | 20% | 13968.39 | 83810.33 | |||
2 | 234.56 | 195.4666667 | 123.456 | 24131.53 | 20% | 4826.31 | 28957.84 | |||
ИТОГО | 802.357 | 93973.47 | 18794.70 | 112768.17 | ||||||
Отображается | Ожидается из отображаемой цены без НДС | |||||||||
№ строки | Цена с НДС (справочно) | Цена без НДС | Кол-во | Итого без НДС | НДС % | Итого НДС | Итого с НДС | Итого без НДС | Итого НДС | Итого с НДС |
1 | 123.45 | 102.88 | 678.901 | 69841.94 | 20% | 13968.39 | 83810.33 | 69845.33 | 13969.07 | 83814.40 |
2 | 234.56 | 195.47 | 123.456 | 24131.53 | 20% | 4826.31 | 28957.84 | 24131.94 | 4826.39 | 28958.33 |
ИТОГО | 802.357 | 93973.47 | 18794.70 | 112768.17 | 93977.27 | 18795.46 | 112772.73 |
Как видим изменилось не особо, просто реальные значения в итогах по строке стали равны отображаемым в соответствующих столбцах. Но недоуменные восклицания при этом не уйдут 🙂
Может быть тогда стоит округлить до целой копейки цену без НДС?
Можно попробовать:
Округление цены за единицу | Округление по строке | Округление НДС по строке | Округление итогов | Округление итогов НДС | ||||||
0.01 | 0.01 | 0.01 | 0.00 | 0.00 | ||||||
Реальные значения | ||||||||||
№ строки | Цена с НДС (справочно) | Цена без НДС | Кол-во | Итого без НДС | НДС % | Итого НДС | Итого с НДС | |||
1 | 123.45 | 102.88 | 678.901 | 69845.33 | 20% | 13969.07 | 83814.40 | |||
2 | 234.56 | 195.47 | 123.456 | 24131.94 | 20% | 4826.39 | 28958.33 | |||
ИТОГО | 802.357 | 93977.27 | 18795.46 | 112772.73 | ||||||
Отображается | Ожидается из отображаемой цены без НДС | |||||||||
№ строки | Цена с НДС (справочно) | Цена без НДС | Кол-во | Итого без НДС | НДС % | Итого НДС | Итого с НДС | Итого без НДС | Итого НДС | Итого с НДС |
1 | 123.45 | 102.88 | 678.901 | 69845.33 | 20% | 13969.07 | 83814.40 | 69845.33 | 13969.07 | 83814.40 |
2 | 234.56 | 195.47 | 123.456 | 24131.94 | 20% | 4826.39 | 28958.33 | 24131.94 | 4826.39 | 28958.33 |
ИТОГО | 802.357 | 93977.27 | 18795.46 | 112772.73 | 93977.27 | 18795.46 | 112772.73 |
Теперь, вроде бы всё отлично. Вот только тот, кто привык восклицать теперь будет говорить, что если умножить цену с НДС на количество, то не получится то, что отображается в столбце «Итого с НДС»
А оно и не может так получиться, так как либо мы говорим, что все цифры «пляшут» относительно цены без НДС, либо относительно цены с НДС и округлений не избежать и iScala здесь ни причём, смотрите самый верх страницы, а если вы думаете иначе, то советую посчитать на калькуляторе. Ну, или на счётах 🙂
Кстати, все примеры сделаны не в Scala/iScala, а в Excel’е и я даже не пытаюсь говорить, что воспроизвожу логику работы iScala, я просто выстраиваю определённую логику. Если угодно, простую математическую, я бы даже сказал, арифметическую 🙂