Как в СКД вывести целые числа в детальных записях, а в итогах оставить дробные?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на Системе компоновки данных (СКД) часто возникает стилистическая и математическая дилемма: пользователи хотят видеть в строках отчета аккуратные целые числа для удобства чтения, но при этом общие итоги должны сходиться до копейки или миллиграмма. Если просто применить формат «ЧДЦ=0» (число десятичных знаков) ко всей колонке, 1С округлит итоговую сумму, что приведет к потере точности. Разберем детально, как настроить отчет так, чтобы визуальное представление в детальных записях не портило точность общих итогов.

Метод 1. Разделение формул ресурсов по уровням группировок

Это один из самых гибких и правильных способов с точки зрения архитектуры СКД. Система позволяет задавать разные выражения для одного и того же ресурса в зависимости от того, на каком уровне иерархии он рассчитывается. Рассмотрим этот процесс по шагам.

Перейдем на закладку Ресурсы в схеме компоновки данных. Вместо одной строки с ресурсом мы добавим две строки для одного и того же поля, например, Количество.

  1. В первой строке выберем поле Количество. В выражении напишем стандартную формулу: Сумма(Количество). В колонке Рассчитывать по... снимем галочку с «Детальные записи», но оставим все остальные группировки и «Общий итог». Это обеспечит точный расчет суммы по всем данным.
  2. Добавим вторую строку с тем же полем Количество. В выражении используем функцию округления: Выразить(Сумма(Количество), "Число(15, 0)"). В колонке Рассчитывать по... выберем только значение «Детальные записи».

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

Метод 2. Использование вычисляемых полей для визуализации

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

  1. На закладке Вычисляемые поля добавим новое поле, назовем его КоличествоДляВывода.
  2. В выражении этого поля пропишем: Цел(Количество) или Выразить(Количество, "Число(15, 0)").
  3. На закладке Ресурсы для нашего нового поля КоличествоДляВывода в выражении укажем расчет по исходному (скрытому) полю: Сумма(Количество).

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


// В поле "Выражение" на закладке Ресурсы для поля КоличествоДляВывода
Сумма(Количество)

Метод 3. Индивидуальное условное оформление для группировок

Если мы не хотим менять логику расчета в ресурсах, можно воспользоваться приоритетами оформления. СКД позволяет настраивать формат отображения для каждой группировки отдельно. Разберем, как это сделать правильно.

  1. Перейдем в настройки отчета (вкладка Настройки внизу).
  2. Выберем в дереве настроек самый верхний элемент «Отчет». Перейдем на его вкладку Условное оформление и создадим правило. В параметре «Формат» укажем ЧДЦ=2 (или столько знаков, сколько нужно в итоге). В области использования укажем только «В итогах».
  3. Теперь выберем в структуре отчета уровень «Детальные записи». Перейдем в его собственное Условное оформление. Здесь создадим правило с форматом ЧДЦ=0.

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

Метод 4. Подготовка данных в запросе

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


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Количество КАК КоличествоДробное,
    ВЫРАЗИТЬ(Продажи.Количество КАК ЧИСЛО(15, 0)) КАК КоличествоЦелое
ИЗ
    РегистрНакопления.Продажи КАК Продажи

В настройках СКД на вкладке Наборы данных для поля КоличествоЦелое можно указать в колонке «Роли», что оно является дополнительным для КоличествоДробное. Однако эффективнее будет просто настроить ресурс:

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

Важные замечания по функциям округления

Выясним причину, по которой результаты могут различаться при использовании разных функций 1С. Нужно четко понимать разницу между математическим округлением и отсечением части числа.

1. Функция ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 0)) в языке запросов и СКД использует правила бухгалтерского округления. Это означает, что число 0.5 может быть округлено как к 1, так и к 0 (до ближайшего четного). Это критично при работе с большими массивами данных.

2. Функция ЦЕЛ(Число) просто отсекает дробную часть, не выполняя округления. Если ваша задача — показать только полные единицы товара, не учитывая граммы, используйте именно её.

3. Функция Формат(Значение, "ЧЗ=0") преобразует число в строку. Помните, что если вы используете Формат внутри выражения ресурса, то результат станет строковым, и вы не сможете суммировать эти данные в вышестоящих итогах без дополнительных преобразований.

Рассмотрим подробнее использование функции Формат в ресурсах. Если мы напишем:

Формат(Сумма(Количество), "ЧДЦ=0")

то система применит это ко всем уровням. Поэтому этот метод лучше комбинировать с первым способом, ограничивая область расчета через колонку «Рассчитывать по...».

Подводя итог, наиболее надежным и "чистым" способом является Метод 1 (настройка ресурсов для разных уровней), так как он сохраняет типизацию данных и позволяет избежать дублирования полей в структуре отчета. Мы вместе проанализировали основные подходы, и теперь вы можете выбрать тот, который лучше всего подходит под архитектуру вашего конкретного решения.

← На главную