Почему не совпадают итоги в отчете СКД и как заставить их считаться правильно?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Расхождение итогов в типовых отчетах, построенных на базе Системы компоновки данных (СКД), — это классическая проблема, с которой сталкиваются разработчики и аналитики в «1С:Управление торговлей 11». Ситуация выглядит следующим образом: пользователь формирует отчет (например, «Остатки товаров, принятых на комиссию»), копирует данные в Excel или суммирует строки на калькуляторе, и обнаруживает, что общий итог отличается от суммы строк на несколько копеек или даже рублей. Рассмотрим детально, почему это происходит и как привести итоги в соответствие с визуальными данными.

Выясняем причину: «Сумма округлений» против «Округления суммы»

Первым делом проанализируем математическую природу проблемы. Основная причина расхождений заключается в том, что СКД по умолчанию рассчитывает итоги по исходным (неокругленным) данным, извлеченным из базы данных, а не путем простого сложения тех чисел, которые отображаются в сформированных строках отчета.

Разберем на примере. Представим две позиции в отчете:

  1. Значение в базе: 41.315. В отчете (с форматом 2 знака) мы видим: 41.32.
  2. Значение в базе: 41.315. В отчете мы снова видим: 41.32.

Как считает СКД: Система складывает исходные значения (41.315 + 41.315 = 82.63) и выводит итог 82.63.

Как считает пользователь: Пользователь складывает то, что видит глазами (41.32 + 41.32 = 82.64) и получает итог 82.64.

Разница в одну копейку возникла из-за того, что в базе данных точность хранения или расчета выше, чем точность отображения. В масштабах большого отчета такие «хвосты» накапливаются и превращаются в значительные суммы.

Шаг 1. Поиск скрытой точности

Прежде чем вносить изменения, нам нужно убедиться, что проблема именно в дробных частях. Проанализируем ситуацию, временно отключив оформление. В настройках отчета (или в конфигураторе на закладке «Наборы данных») найдем поле СуммаОстаток и временно отключим у него Формат в оформлении. Это поможет выяснить, по каким позициям точность суммы превышает 2 знака после запятой.

Часто в УТ 11 «лишние» знаки появляются из-за:

Посмотрим на типичное выражение в запросе, которое может порождать такие хвосты:


ВЫРАЗИТЬ(ЕСТЬNULL(КурсыВалют.Курс, 0) * ТоварыОрганизаций.Кратность 
/ (ЕСТЬNULL(КурсыВалют.Кратность, 1) * ТоварыОрганизаций.Курс) 
* ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК ЧИСЛО(15, 2)) 
* ТоварыОрганизаций.КоэффициентНДС * ТоварыОрганизаций.КоличествоОстаток

Даже если мы используем ВЫРАЗИТЬ для цены, последующее умножение на коэффициент НДС или количество может вернуть дробную часть за пределами второго знака.

Шаг 2. Правильная настройка ресурсов в СКД

Многие пытаются решить проблему, используя ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) в самом тексте запроса. Однако это не всегда помогает итогам, так как СКД может агрегировать данные своим внутренним механизмом. Рассмотрим наиболее надежный способ — изменение формулы на закладке «Ресурсы».

Вместо стандартного выражения Сумма(СуммаОстаток), необходимо заставить систему округлять каждое детальное значение до того, как оно попадет в сумму итога. Для этого используем функцию ОКР или ВЫРАЗИТЬ непосредственно в поле выражения ресурса.

Рассмотрим вариант выражения ресурса:

Сумма(ВЫРАЗИТЬ(СуммаОстаток, "ЧИСЛО(15, 2)"))

Или через функцию округления:

Сумма(ОКР(СуммаОстаток, 2))

Важный нюанс: Если в отчете используются сложные расчеты через ВычислитьВыражение(), убедитесь, что округление прописано внутри параметров этой функции. Также проверьте колонку «Рассчитывать по...» на закладке ресурсов. Если там указаны конкретные группировки, необходимо продублировать формулу с округлением для всех уровней, включая «Общий итог».

Шаг 3. Учет валютных коэффициентов

В отчетах по комиссии (как в УТ 11.4) часто задействованы механизмы пересчета валют. Проанализируем логику: если мы сначала пересчитываем цену по курсу, округляем её, а потом умножаем на количество — мы получаем одну сумму. Если мы умножаем неокругленную цену на количество и округляем результат — другую.

Чтобы итоги сходились с «калькулятором», старайтесь округлять финальный результат строки в запросе перед тем, как он попадет в ресурсы СКД. Например:


ВЫРАЗИТЬ(
    (ЕСТЬNULL(Цена, 0) * ЕСТЬNULL(Курс, 1) / ЕСТЬNULL(Кратность, 1)) * КоличествоОстаток 
    КАК ЧИСЛО(15, 2)
)

Подведем итоги

Для исправления расхождений в типовом отчете СКД придерживайтесь следующего алгоритма:

  1. Проверьте размерность: Убедитесь, что в регистре накопления у ресурсов стоит точность «15, 2». Если точность выше (например, 3 знака для цены), это всегда будет давать отклонения в суммах.
  2. Настройте ресурсы: В схеме компоновки данных перейдите на закладку «Ресурсы» и замените стандартную сумму на Сумма(ОКР(ИмяПоля, 2)). Это гарантирует, что система будет складывать уже округленные числа.
  3. Контролируйте запрос: Используйте ВЫРАЗИТЬ для окончательных расчетных полей в наборе данных, чтобы минимизировать влияние «хвостов» от деления или умножения на коэффициенты.

Помните, что с точки зрения математической точности, вариант СКД «по умолчанию» (округление только итогового результата) более верный. Однако с точки зрения бухгалтерского учета и требований пользователей, отчет должен быть «проверяемым на калькуляторе», поэтому использование округления в ресурсах является стандартом при разработке отчетов в 1С.

← На главную