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