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