Расхождение итогов в типовых отчетах, построенных на базе Системы компоновки данных (СКД), — это классическая проблема, с которой сталкиваются разработчики и аналитики в «1С:Управление торговлей 11». Ситуация выглядит следующим образом: пользователь формирует отчет (например, «Остатки товаров, принятых на комиссию»), копирует данные в Excel или суммирует строки на калькуляторе, и обнаруживает, что общий итог отличается от суммы строк на несколько копеек или даже рублей. Рассмотрим детально, почему это происходит и как привести итоги в соответствие с визуальными данными.
Первым делом проанализируем математическую природу проблемы. Основная причина расхождений заключается в том, что СКД по умолчанию рассчитывает итоги по исходным (неокругленным) данным, извлеченным из базы данных, а не путем простого сложения тех чисел, которые отображаются в сформированных строках отчета.
Разберем на примере. Представим две позиции в отчете:
41.315. В отчете (с форматом 2 знака) мы видим: 41.32.41.315. В отчете мы снова видим: 41.32.Как считает СКД: Система складывает исходные значения (41.315 + 41.315 = 82.63) и выводит итог 82.63.
Как считает пользователь: Пользователь складывает то, что видит глазами (41.32 + 41.32 = 82.64) и получает итог 82.64.
Разница в одну копейку возникла из-за того, что в базе данных точность хранения или расчета выше, чем точность отображения. В масштабах большого отчета такие «хвосты» накапливаются и превращаются в значительные суммы.
Прежде чем вносить изменения, нам нужно убедиться, что проблема именно в дробных частях. Проанализируем ситуацию, временно отключив оформление. В настройках отчета (или в конфигураторе на закладке «Наборы данных») найдем поле СуммаОстаток и временно отключим у него Формат в оформлении. Это поможет выяснить, по каким позициям точность суммы превышает 2 знака после запятой.
Часто в УТ 11 «лишние» знаки появляются из-за:
Посмотрим на типичное выражение в запросе, которое может порождать такие хвосты:
ВЫРАЗИТЬ(ЕСТЬNULL(КурсыВалют.Курс, 0) * ТоварыОрганизаций.Кратность
/ (ЕСТЬNULL(КурсыВалют.Кратность, 1) * ТоварыОрганизаций.Курс)
* ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК ЧИСЛО(15, 2))
* ТоварыОрганизаций.КоэффициентНДС * ТоварыОрганизаций.КоличествоОстаток
Даже если мы используем ВЫРАЗИТЬ для цены, последующее умножение на коэффициент НДС или количество может вернуть дробную часть за пределами второго знака.
Многие пытаются решить проблему, используя ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) в самом тексте запроса. Однако это не всегда помогает итогам, так как СКД может агрегировать данные своим внутренним механизмом. Рассмотрим наиболее надежный способ — изменение формулы на закладке «Ресурсы».
Вместо стандартного выражения Сумма(СуммаОстаток), необходимо заставить систему округлять каждое детальное значение до того, как оно попадет в сумму итога. Для этого используем функцию ОКР или ВЫРАЗИТЬ непосредственно в поле выражения ресурса.
Рассмотрим вариант выражения ресурса:
Сумма(ВЫРАЗИТЬ(СуммаОстаток, "ЧИСЛО(15, 2)"))
Или через функцию округления:
Сумма(ОКР(СуммаОстаток, 2))
Важный нюанс: Если в отчете используются сложные расчеты через ВычислитьВыражение(), убедитесь, что округление прописано внутри параметров этой функции. Также проверьте колонку «Рассчитывать по...» на закладке ресурсов. Если там указаны конкретные группировки, необходимо продублировать формулу с округлением для всех уровней, включая «Общий итог».
В отчетах по комиссии (как в УТ 11.4) часто задействованы механизмы пересчета валют. Проанализируем логику: если мы сначала пересчитываем цену по курсу, округляем её, а потом умножаем на количество — мы получаем одну сумму. Если мы умножаем неокругленную цену на количество и округляем результат — другую.
Чтобы итоги сходились с «калькулятором», старайтесь округлять финальный результат строки в запросе перед тем, как он попадет в ресурсы СКД. Например:
ВЫРАЗИТЬ(
(ЕСТЬNULL(Цена, 0) * ЕСТЬNULL(Курс, 1) / ЕСТЬNULL(Кратность, 1)) * КоличествоОстаток
КАК ЧИСЛО(15, 2)
)
Для исправления расхождений в типовом отчете СКД придерживайтесь следующего алгоритма:
Сумма(ОКР(ИмяПоля, 2)). Это гарантирует, что система будет складывать уже округленные числа.ВЫРАЗИТЬ для окончательных расчетных полей в наборе данных, чтобы минимизировать влияние «хвостов» от деления или умножения на коэффициенты.Помните, что с точки зрения математической точности, вариант СКД «по умолчанию» (округление только итогового результата) более верный. Однако с точки зрения бухгалтерского учета и требований пользователей, отчет должен быть «проверяемым на калькуляторе», поэтому использование округления в ресурсах является стандартом при разработке отчетов в 1С.