Округление скидок в 1С 8.3: от функции Окр до строки документа
Содержание
Округление скидки задаётся не в самом документе продажи, а в двух местах: в карточке вида цены (настройка Округление) и в карточке скидки (наценки). На уровне платформы за округление отвечает функция Окр(Число, Разрядность, Режим) — она и даёт тот результат, который вы видите в колонке «Цена» и «Сумма».
Главная причина «копеечных» расхождений — скидка округляется по каждой строке отдельно, а итог документа при этом считается как сумма уже округлённых строк. Поэтому сумма в шапке и ручной пересчёт «итог × процент» не всегда сходятся до копейки. Ниже — как это устроено и как привести цифры в порядок.
Как платформа округляет числа: функция Окр и разрядность
Любое округление в 1С 8.3 сводится к встроенной функции:
Окр(Число, Разрядность, Режим)
Разрядность— сколько знаков после запятой оставить.2— до копеек,0— до целого рубля,-1— до десятков рублей.Режим— как поступать с «половинкой»:0(по умолчанию) — арифметическое округление:Окр(1.5, 0, 0)=2,Окр(2.5, 0, 0)=3;1— половина отбрасывается в меньшую по модулю сторону:Окр(1.5, 0, 1)=1,Окр(2.5, 0, 1)=2.
Разница режимов видна именно на суммах, оканчивающихся на ,5 копейки. Классический пример: цена 10 рублей, скидка 4,5% даёт 0,45 рубля, остаток 9,55 — округления не требует. А вот скидка 4,55% даёт 0,455 рубля: при Режим = 0 это 0,46, при Режим = 1 — 0,45. На одной строке — копейка, на тысяче строк накладной — рубли.
В типовых конфигурациях прикладной код использует режим по умолчанию (арифметический). Если вы пишете свою обработку скидок, задавайте Режим явно — не полагайтесь на «как-нибудь округлит».
Есть ещё одна ловушка, не связанная с настройками, — представление дробных чисел. Процент скидки и промежуточные произведения хранятся как числа с плавающей точкой, и значение вроде 0,145 внутри может оказаться чуть меньше или чуть больше. На печати этого не видно, но при округлении до копейки результат иногда отличается от того, что вы посчитали на калькуляторе. Поэтому для контроля всегда сравнивайте не отдельную строку, а итог документа с итогом в договоре: именно по итогу вы рассчитываетесь с покупателем.
Не округляйте промежуточные расчёты раньше времени. Если сначала округлить цену со скидкой до копеек, а потом умножить на количество, итог разойдётся с вариантом «сумма строки минус скидка». Платформа в документах продажи считает именно сумму по строке, а цену показывает как справочную величину.
Где настраивается округление скидок и цен в УТ 11 и Рознице
В «1С:Управление торговлей 11» округление живёт в трёх справочниках, и важно не путать их.
Вид цены. В карточке вида цены есть группа настроек округления: точность (до 1 копейки, до 1 рубля, до 10 рублей) и правило — арифметическое или «психологическое». Психологическое округление приводит цену к виду ...99 или ...90 (например, 1 000 → 999). Открывается из раздела CRM и маркетинг (в ранних релизах раздел называется Маркетинг), подраздел с видами цен.
Скидка (наценка). В карточке автоматической скидки задаётся, как округлять результат её применения. Для процентных скидок обычно наследуется точность вида цены; для суммовых — указывается отдельно. Список скидок — там же, в CRM и маркетинг.
Соглашение с клиентом. Соглашение связывает клиента, вид цены и набор скидок. Именно оно определяет, какая настройка округления сработает в конкретной продаже.
В «1С:Рознице» логика та же, но добавляется округление в чеке ККМ: сумма к оплате может округляться до рубля по правилам магазина, а разница относится на отдельную статью. Это округление чека, а не скидки — не смешивайте.
| Что настраиваем | Где в УТ 11 | За что отвечает |
|---|---|---|
| Точность и правило цены | Карточка вида цены | Как округляется цена после расчёта |
| Округление скидки | Карточка скидки (наценки) | Как округляется сумма или процент скидки |
| Привязка к клиенту | Соглашение с клиентом | Какие настройки применятся в документе |
В «1С:Бухгалтерии 3.0» богатого механизма автоматических скидок нет: скидка вводится процентом или суммой прямо в строке документа, а округление определяется типом цены номенклатуры. Если нужны правила скидок и их округление — это задача УТ или Розницы, а не БП.
Скидка по строке и скидка на документ: откуда берётся разница
Это ядро всей темы. 1С применяет скидку к каждой строке табличной части, округляет результат по строке и только потом суммирует строки в итог документа.
Посмотрите на пример накладной со скидкой 3% и округлением до копейки:
| Товар | Сумма без скидки | Скидка 3% | Округлено | Сумма со скидкой |
|---|---|---|---|---|
| А | 100,10 | 3,003 | 3,00 | 97,10 |
| Б | 100,10 | 3,003 | 3,00 | 97,10 |
| В | 100,10 | 3,003 | 3,00 | 97,10 |
| Итого | 300,30 | 9,009 → 9,01 | 9,00 | 291,30 |
Если считать скидку от итога 300,30 × 3% = 9,009, арифметически выходит 9,01. А сумма построчных скидок — 9,00. Расхождение в копейку возникло не из-за ошибки программы, а из-за порядка действий: сначала округлили три строки, потом сложили.
Чтобы разницы не было, у вас два пути:
- Считать скидку по документу в целом — если конфигурация это поддерживает, скидка распределяется на строки так, чтобы их сумма сошлась с итогом.
- Смириться с построчным расчётом и распределить копейку вручную (следующий раздел).
Механизм распределения работает так: программа берёт целевую сумму скидки на весь документ, раскидывает её на строки пропорционально их суммам, а копеечный остаток от округления добавляет к последней или к самой крупной строке. В результате сумма построчных скидок точно равна заданной скидке на документ. Это и есть разница между «скидкой по строкам» (каждая строка самостоятельна) и «скидкой на документ» (строки подчинены общему итогу).
Выбирайте способ под задачу: для розничного чека важна «ровная» цена каждой позиции — там работает построчное округление; для оптового договора важен итог отгрузки — там удобнее распределение по документу.
Уменьшайте разрядность осознанно. Округление цен до рубля ускоряет работу кассы и делает прайс «читаемым», но на больших накладных рождает заметные расхождения. Для опта чаще оставляют копейки, для розницы — округляют до рубля в чеке.
Как распределить копеечную разницу вручную
Когда итог документа не сошёлся с ожидаемой суммой на одну-две копейки, разницу относят на одну строку — обычно на самую крупную по сумме, чтобы относительная погрешность была минимальной.
Порядок действий в документе продажи:
- Проверьте, что расхождение именно копеечное (
0,01–0,02на десяток строк), а не процент или рубль — крупная разница означает другую причину. - Найдите строку с максимальной суммой.
- Скорректируйте в ней сумму скидки или итоговую сумму на величину расхождения.
- Убедитесь, что итог документа теперь совпадает с суммой, согласованной с покупателем.
Если расхождение всплывает регулярно, разовая правка строки — это лечение симптома. Правильнее настроить округление цены и скидки единообразно (одна точность во всей цепочке «вид цены → скидка → соглашение»), чтобы построчные суммы складывались ровно.
Правку суммы вручную делайте до проведения и до выставления счёта-фактуры. Если документ уже проведён и по нему сформирована реализация, сначала отмените проведение, иначе рискуете рассинхронизировать движения по регистрам.
Округление скидок и НДС: счёт-фактура и декларация
Скидка уменьшает налоговую базу, а значит, и НДС. Здесь округление регулируется законом, а не только настройками программы, и правила для счёта-фактуры и для декларации — разные.
В счёте-фактуре стоимостные показатели указываются в рублях и копейках. Округлять суммы налога до целых рублей в счёте-фактуре нельзя — это прямо следует из правил его заполнения (Постановление Правительства РФ № 1137). Поэтому в счёте-фактуре НДС остаётся с копейками, как посчитала программа по каждой строке.
В декларации по НДС сумма налога исчисляется в полных рублях: значение менее 50 копеек отбрасывается, 50 копеек и более округляются до рубля (пункт 6 статьи 52 НК РФ). Это округление делается уже на уровне итоговых сумм декларации, а не внутри счёта-фактуры.
Разберём на числах. Товар стоит 1 000 рублей, скидка 7% — остаётся 930 рублей, НДС по ставке 20% считается от 930 и равен 186 рублям ровно. Возьмём другой пример: 999,90 рубля со скидкой 7% дают базу 929,907 → 929,91, а НДС от неё — 185,982 → 185,98. В счёте-фактуре вы увидите именно 185,98, с копейками. Если таких строк в декларации окажется, скажем, десять, их суммы сложатся и общий НДС округлится до полного рубля уже в итоге отчёта. Поэтому не пытайтесь «подогнать» копейки в счёте-фактуре под рубли декларации — это разные уровни округления.
Отсюда частый вопрос: почему НДС в книге продаж и в декларации отличается на рубли? Потому что книга ведётся в рублях и копейках, а декларация — в полных рублях. Это не ошибка.
Расхождение с контрагентом по НДС на копейки возникает по той же механике, что и со скидкой: вы считаете налог по строкам и суммируете, а контрагент — по итогу. Налоговый кодекс не обязывает стороны считать одинаково, и копеечная разница в счёте-фактуре не лишает покупателя вычета. Спорить из-за копейки смысла нет — важно, чтобы итоговая сумма НДС в счёте-фактуре совпадала с суммой построчных значений внутри самого документа.
| Документ | Единицы | Правило |
|---|---|---|
| Счёт-фактура | Рубли и копейки | До рубля не округлять |
| Книга продаж/покупок | Рубли и копейки | Как в счёте-фактуре |
| Декларация по НДС | Полные рубли | Пункт 6 статьи 52 НК РФ |
Функция Окр в запросах и обработках: когда нужен код
Если округления штатных настроек не хватает (например, нужно округлять скидку до 0,50 рубля или до «красивого» прайса по своему алгоритму), задача решается в расширении конфигурации или обработке.
Округление до кратного значения строится через деление и умножение. Округление до 50 копеек:
ЦенаОкругленная = Окр(Цена * 2, 2, 0) / 2;
Округление до 10 рублей вниз (психологический прайс ...90):
ЦенаОкругленная = Окр(Цена / 10, 0, 1) * 10 - 0.1;
В языке запросов функция тоже доступна — удобно считать скидки сразу на выборке:
ВЫБРАТЬ
Строки.Номенклатура,
ВЫРАЗИТЬ(Строки.Сумма * 0.03 КАК ЧИСЛО(15, 2)) КАК Скидка
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Строки
Приведение к ЧИСЛО(15, 2) в запросе отсекает лишние знаки до двух разрядов. Это не то же самое, что Окр: при приведении типа в запросе дробная часть именно усекается, а не округляется арифметически. Если нужно именно арифметическое округление в выборке — округляйте результат уже в коде обработки через Окр, а не в самом запросе.
Любой самописный алгоритм округления прогоните на граничных суммах: ...,005, ...,995, отрицательных значениях (возвраты). Один и тот же код должен давать предсказуемый результат и для продажи, и для возврата.
Ниже — быстрая диагностика, если цифры «не бьются».
Частые вопросы
Какой режим округления стоит в типовой УТ по умолчанию?
Режим = 0): половина копейки округляется вверх. Отдельно его переключить в настройках нельзя — это поведение прикладного кода; изменить можно только в расширении.Можно ли убрать копейки и округлять скидки сразу до рубля?
до 1 рубля. Но для оптовых отгрузок это увеличит расхождения на крупных накладных — взвесьте, нужно ли это.Почему скидка 3% от итога не равна сумме скидок по строкам?
Законно ли округлять НДС в счёте-фактуре до рублей?
Как округлить цену до «красивых» 0,90 или 0,99?
Окр в расширении конфигурации.Источники
- Пункт 6 статьи 52 НК РФ — сумма налога исчисляется в полных рублях
- Постановление Правительства РФ № 1137 — правила заполнения счёта-фактуры