Ошибки округления в 1С: почему копейки не сходятся

Бухгалтер сверяет итоги за месяц: НДС в декларации отличается от суммы в книге покупок на 3 рубля. Откуда взялись? Вручную пересчитала — всё сходится. А в 1С — нет. Три рубля — не деньги, но декларацию с расхождением не примут. Начинается поиск, куда делись эти три рубля.

Ошибки округления — самый коварный тип расхождений. Они маленькие, поэтому долго незаметны. Они системные, поэтому повторяются в каждом документе. И они вызывают у бухгалтера ощущение, что система считает неправильно. Разбираем, откуда берутся эти копейки и что с ними делать.

Как 1С считает и почему теряет точность

Компьютер не умеет работать с бесконечными дробями. Любое число в 1С хранится с ограниченной точностью — обычно 2-10 знаков после запятой, в зависимости от настроек поля. Когда вы делите 100 на 3, результат — 33,333333... бесконечно. 1С хранит 33,33 (если точность — 2 знака). Потерянные 0,003333... — это и есть погрешность округления.

На одной операции потеря ничтожна. Но если таких операций в документе 50 — потери суммируются. А если документов за месяц тысяча — набегают рубли. Или десятки рублей. Или, как в одном нашем случае, сотни.

Вот реальный пример. В регуляторной отчётности по обороту алкогольной продукции требуется пересчёт объёмов из миллилитров в декалитры. Формула простая: количество умножить на ёмкость и разделить на 10 000. Бутылка 500 мл — это 0,05 дал. Для стандартных объёмов всё работает. А для 330 мл или 375 мл — начинаются проблемы.

Сравнение деления на 10000 и умножения на 0.0001 в 1С — разная точность результата

В запросе стояло деление на 10000. Математически верно. Но 10000 — целое число, и 1С определяет тип результата из типов операндов. На выходе — пять знаков после запятой. Для 500 мл хватает: 0,05000. Для 330 мл — 0,03300, тоже хватает. А для нестандартных ёмкостей — нет. И каждая последующая операция (сложение, группировка) усиливает потерю.

Решение оказалось простым: заменить деление на 10000 умножением на 0,0001. Та же арифметика, но множитель 0,0001 — это дробный литерал с четырьмя знаками после запятой. 1С видит дробный операнд и выделяет больше разрядов под результат: восемь знаков вместо пяти. Потеря исчезает.

Менять пришлось не одно место. В отчёте было 15 расчётных полей: поступления, расход, возвраты, сторно, списания — каждое с тем же пересчётом. Плюс формат отображения в готовом отчёте показывал 5 знаков, обрезая и без того правильный результат. Поставили 8. Та же проблема нашлась в соседнем отчёте — декларации оборота. Один баг, одна корневая причина, два отчёта.

Где ошибки округления встречаются чаще всего

Шесть областей в 1С, где чаще всего возникают ошибки округления — НДС, курс, себестоимость, скидки, зарплата, пересчёт единиц

НДС. Классика. Если в накладной 50 позиций, НДС считается по каждой строке отдельно и округляется до копеек. Потом строки суммируются. А если посчитать НДС от итоговой суммы — результат будет другим. Разница — от 1 до 50 копеек, в зависимости от количества строк. Налоговая может не принять декларацию, если итог НДС в ней не совпадает с данными контрагентов.

Курс валюты. Курс Национального банка публикуется с определённой точностью. Если в 1С поле курса хранит 4 знака после запятой, а реальный курс требует 6 — потеря на каждой валютной операции. При обороте в миллионы — разница существенная. Особенно заметно на курсовых разницах при закрытии месяца.

Себестоимость. Тот самый случай с двумя источниками расчёта, который мы разбирали подробно. Промежуточное округление при распределении затрат на партию товара — самый частый источник расхождений в себестоимости.

Скидки. Скидка 7% на каждую строку накладной. Каждая строка округляется отдельно. Итог скидки в документе может отличаться от 7% итоговой суммы. Клиент получает чек, считает на калькуляторе — не сходится. Не критично, но раздражает.

Зарплата. Распределение премии или надбавки между сотрудниками. 1000 рублей на 7 человек — это 142,86 на каждого. 142,86 умножить на 7 — это 999,02. Куда делись 98 копеек? Остаток нужно добавить кому-то одному — обычно последнему в списке. В типовых конфигурациях это предусмотрено, но в доработанных — не всегда. И когда сотрудник спрашивает, почему ему начислили 142,98, а коллеге 142,86 — бухгалтер должен уметь объяснить. Кстати, если остаток не распределяется вообще — он «теряется», и итог начислений не совпадает с утверждённой суммой.

Пересчёт единиц измерения. Помимо уже описанного примера с декалитрами — аналогичные проблемы возникают при пересчёте граммов в килограммы, штук в упаковки, погонных метров в квадратные. Везде, где есть деление с дробным результатом, есть риск потери точности.

Особый случай — маркированные товары. При продаже на вес (например, мясная продукция) система должна пересчитать килограммы обратно в штуки для учёта маркировки. Вес одной единицы — 0,347 кг. Продали 10,41 кг. Сколько это штук? 10,41 / 0,347 = 29,9711... Округляем до 30. Но 30 штук по 0,347 кг — это 10,41 кг, и тут повезло. А при других числах может получиться и 29, и 31 — и система спишет не то количество марок.

Как найти ошибку округления

Алгоритм поиска ошибки округления в 1С — от обнаружения расхождения до исправления формулы

Если вы нашли расхождение и подозреваете округление — вот алгоритм проверки.

Пересчитайте вручную. Возьмите калькулятор и повторите расчёт по данным из 1С. Если ваш результат совпадает с одним из двух «спорных» значений — значит, второе считается по другой формуле или с другой точностью.

Посмотрите, сколько знаков хранит поле. Если число в базе хранится с точностью 2 знака, а реальный результат требует 4 — вот и причина. К сожалению, увидеть настройки полей из пользовательского режима нельзя — это задача для разработчика или консультанта.

Проверьте порядок операций. Где сначала деление, потом суммирование — там потеря точности. Где сначала суммирование, потом деление — там точнее. Если оба отчёта используют разный порядок — расхождение неизбежно.

Сравните с «эталоном». Возьмите документ с 5-10 строками и пересчитайте каждое значение вручную. Если ваш ручной расчёт совпадает с одним источником и не совпадает с другим — вы нашли, какой именно считает неправильно. Или точнее — какой считает не так, как вы ожидаете.

Почему это важно именно для бухгалтера

Разработчик может позволить себе игнорировать расхождение в копейку. Бухгалтер — нет. Потому что:

Декларация по НДС должна совпадать копейка в копейку с данными контрагентов. Если у вас в книге продаж НДС 1234,56, а у контрагента в книге покупок 1234,57 — это расхождение, и портал ЭСЧФ его отловит.

Оборотно-сальдовая ведомость должна сходиться. Дебет равен кредиту — без исключений. Расхождение в копейку означает, что где-то проводка сформирована с потерей точности, и найти её в тысячах проводок за месяц — задача не на пять минут.

Аудитор видит расхождения. Даже если они копеечные — это повод для вопросов. «Почему здесь расхождение? Где ещё могут быть ошибки? Какой системе контроля вы доверяете?» Гораздо проще один раз устранить причину, чем каждый раз объяснять, что «это нормальная погрешность округления».

Регуляторная отчётность не прощает потерь точности. Тот случай с декалитрами — это реальная ситуация, где расхождение между отчётом и декларацией обнаружилось при проверке. И если бы не обнаружилось вовремя — вопросы задавала бы уже не бухгалтер, а инспектор.

Как специалист устраняет проблему

Когда к нам приходят с жалобой «копейки не сходятся», мы действуем по стандартному алгоритму. Сначала определяем, где именно расхождение — в каком отчёте, на каких данных, в каком периоде. Потом смотрим формулу расчёта в конфигураторе — как именно считается это значение.

Чаще всего достаточно одного из трёх исправлений. Первое — увеличить точность хранения поля. Было 2 знака после запятой — стало 4 или 6. Второе — изменить порядок операций в формуле: сначала сложить, потом разделить, а не наоборот. Третье — заменить деление на умножение (как в примере с декалитрами).

Время работы — от 30 минут до пары часов, в зависимости от сложности конфигурации и количества мест, где используется проблемная формула. В примере с декалитрами менять пришлось 15 полей в одном отчёте и столько же в соседнем. Плюс формат отображения в печатных формах. Всего — около 30 правок, но каждая элементарная: заменить деление на умножение. После исправления — проверяем на тестовых данных и сравниваем с ручным расчётом. Если сходится — фиксируем и двигаемся дальше.

Самое важное после исправления — убедиться, что ошибка не вернётся при обновлении конфигурации. Если вы используете типовую конфигурацию — обновление может перезаписать исправленную формулу. Поэтому исправление лучше оформить как расширение — оно не затрагивает основной код и переживёт любое количество обновлений.

Что можно сделать самостоятельно

Полностью устранить ошибки округления без программиста сложно — обычно требуется правка запросов или настроек полей. Но кое-что в ваших силах.

Проверяйте итоги НДС по каждой ставке, а не только общий итог. Если расхождение есть — скорее всего, оно в ставке, где больше всего строк в документах.

При ручной сверке считайте так же, как считает 1С: построчно, с округлением на каждом шаге. Тогда ваш результат совпадёт с системным, и вы хотя бы убедитесь, что 1С не ошибается — она просто считает иначе, чем калькулятор.

Если расхождение повторяется из месяца в месяц и составляет фиксированную величину — это системная проблема, которую нужно решить один раз. Позовите специалиста: он определит, какое поле хранит мало знаков, какая формула считает не в том порядке, и исправит. После этого расхождения прекратятся навсегда.

Копейки — это не мелочь, если они систематические. Одна копейка на строке, сто строк в документе, тысяча документов в месяц — вот и десять тысяч рублей расхождения за год. Которые нужно объяснить аудитору. Проще один раз вызвать специалиста и устранить причину, чем каждый месяц вручную искать, куда делись эти копейки, и писать объяснительные для проверяющих.