Округление цен

Материал из GB wiki
Перейти к: навигация, поиск

Расчет цен и сумм товарных документов в ГБ

В базе данных хранится следующая информация по ценам и суммам товарных документов:

  • Поле PriceList таблицы Goodies содержит цену товарной строчки без всех налогов и затрат.
  • Поле Price таблицы Goodies содержит цену товарной строчки, в которую включены всех налоги и затраты.
  • Поле TotalSum таблицы Documents содержит сумму документа, полученную путем суммирования Price*Quantity по всем товарным строчкам.

Эти поля связаны следующим соотношением:

Price = RoundPrice( PriceList * Tax + ExpSum )
PriceList = RoundPrice( Price )
TotalSum = ∑(Price* Quantity)

Здесь:

  • RoundPrice – правила округления для Price и PriceList. Определяются следующими параметрами:
  1. Поле PriceRough в таблице T$Document_Types задает точность округления для документов данного типа. Если оно равно 0 – округление делается по правилам для валюты, которые хранятся в таблице Currencies.
  2. Функция SETPRICEROUNDING также позволяет изменять правила округления для Price и PriceList. Эта функция может быть использована в воздействии договора или в предусловиях.
  3. Цены считаются таким образом, чтобы получились круглые цифры для Суммы без НДС, Суммы НДС, Всего с НДС (см. Округление)
  • Tax – налог для данного товара, типа операции и собственной фирмы, либо из серии
  • ExpSum – сумма затрат, выпадающая на данную строчку в соответствии с правилами разнесения затрат для данного типа документов.

Эта информация является избыточной, поэтому возможны ситуации, когда цифры в полях Price и PriceList не соответствуют друг другу.

Для устранения несоответствий служит команда «пересчитать цены» в открытом документе. При этом все цифры пересчитываются в соответствии со правилами округления, в результате чего может измениться общая сумма документа. Можно попытаться подогнать ее под исходную, изменяя цены, но нельзя гарантировать, что это вообще возможно.

Округление

Одна из цен (Price либо PriceList) всегда округляется до точности, заданной в типе документа. По умолчанию это - цена без НДС (PriceList). Также при помощи SETPRICEROUNDING можно сделать, чтобы округлялись обе эти цены.

Ряд сумм в документе всегда округляется в соответствии с точностью валюты документа. Это:

  • Сумма без НДС (PriceList*Quantity)
  • Сумма НДС (PriceList*Quantity*Tax/100)
  • Всего с НДС (Price*Quantity)

Примеры

Пример 1

В типе документа указано округление цен 0 (по валюте). Валюта рубль, округление до 2 знаков. Круглая цена - без НДС.

Пытаемся выписать товар с НДС=18%, 4 штуки по 165,25

PriceList = 165,25/1,18 = 140,0423728813559 - округляется до 140,04
Сумма без НДС = 140,04*4 = 560,16
Сумма НДС = 560,16*18/100 = 100,8288 - округляется до 100,83
Сумма с НДС = 560,16 + 100,83 = 660,99

Пример 2

Те же исходные данные, но в типе документа ставим точность 6 знаков

PriceList = 165,25/1,18 = 140,0423728813559 - округляется до 140,042373
Сумма без НДС = 140,042373*4 = 560,169492 - округляется до 560,17
Сумма НДС = 560,17*18/100 = 100,8306 - округляется до 100,83
Сумма с НДС = 560,17 + 100,83 = 661,00

Пример 3

Исходные данные из примера 1, но в предусловиях документа при помощи SETPRICEROUNDING задаем округление для цены с НДС

PriceList = 165,25/1,18 = 140,0423728813559 - НЕ округляется
Сумма без НДС = 140,0423728813559*4 = 560,1694915254236 - округляется до 560,17
Сумма НДС = 560,17*18/100 = 100,8306 - округляется до 100,83
Сумма с НДС = 560,17 + 100,83 = 661,00