Разработчики отчетов в системе компоновки данных (СКД) часто сталкиваются со следующей проблемой: при тестировании запроса в консоли числовые показатели (например, количество или сумма) выводятся как полноценные нули, но в готовом отчете на базе СКД вместо заветного нуля пользователь видит абсолютно пустое поле. Особенно критично это становится в регламентированных, финансовых или статистических отчетах, где незаполненное поле и нулевой показатель имеют совершенно разный смысл.
В этой статье мы подробно разберем причины такого поведения платформы 1С:Предприятие и рассмотрим несколько надежных практических способов решения этой проблемы.
Прежде чем переходить к настройкам, давайте разберемся в механике работы платформы. Существует три основных фактора, из-за которых числовой ноль превращается в пустоту:
NULL. В запросе автора темы используется левое соединение с регистром сведений:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСостоянийОбъектов.СрезПоследних(...) КАК РегистрСостоянийОбъектовСрезПоследних
ПО ЛотыВыбранныеПоставщики.Договор = РегистрСостоянийОбъектовСрезПоследних.Объект
NULL. В консоли запросов NULL и 0 визуально разделяются, но СКД при выводе детальных записей может отображать оба этих значения одинаково — в виде пустой ячейки.0 КАК Количество в объединении запросов (как это сделано в примере автора темы), при расчете групповых итогов СКД вычисляет выражение ресурса (например, Сумма(Количество)). Если в группировку не попало ни одной детальной записи, результатом агрегации на уровне итогов станет NULL, который по умолчанию выводится как пустая строка.Теперь рассмотрим пошагово, как заставить отчет выводить цифру "0" во всех необходимых случаях.
Если вам нужно гарантировать вывод нуля для конкретного числового поля на уровне всего отчета, лучше всего воспользоваться стандартным конструктором форматной строки в СКД.
Рассмотрим этот процесс по шагам:
Количество или Сумма).0 (или 0,00, если вам нужна точность до копеек).ЧН=0.После этого СКД будет принудительно заменять любые нулевые значения указанным символом при выводе отчета пользователю.
Бывают ситуации, когда настройка формата поля в наборе данных не срабатывает. Это часто происходит при выводе данных в кросс-таблицы, где колонками выступают динамические группировки, или когда СКД выводит ресурсы по пустым аналитическим разрезам. В этом случае на помощь приходит механизм условного оформления.
Проанализируем алгоритм настройки условного оформления:
ЧН=0. Также можно воспользоваться параметром Текст, указав в нем значение 0.NULL). Добавьте группу условий ИЛИ, а внутрь нее поместите два условия:
ВашеПоле Равно 0ВашеПоле Не заполненоСумма или Количество).Этот способ является универсальным и гарантирует вывод нуля даже в самых сложных структурах отчетов.
Если ваше поле добавлено на вкладку Ресурсы, то вычисление итогов происходит по формулам СКД. Если в процессе расчета итогов получается значение NULL, то никакое форматирование формата поля из первого способа может не сработать, так как СКД не считает NULL математическим нулем.
Давайте исправим выражение ресурса:
Сумма(Сумма)
Напишите конструкцию с проверкой на пустоту:
ЕстьNull(Сумма(Сумма), 0)
Использование встроенной функции СКД ЕстьNull() на уровне расчета ресурсов принудительно преобразует пустоту в числовой ноль на всех уровнях группировок и общих итогов отчета.
Чтобы минимизировать проблемы на уровне компоновки, мы рекомендуем обрабатывать потенциальные пустые значения еще на этапе написания текста запроса. Для этого используйте функцию ЕСТЬNULL в полях, которые получаются в результате левых соединений.
Посмотрим на примере фрагмента запроса автора темы. Вместо обращения к реквизиту через точку напрямую:
ЛотыВыбранныеПоставщики.Договор.Стоимость КАК Сумма,
Безопаснее написать конструкцию, которая вернет числовой ноль в случае отсутствия договора или его стоимости:
ЕСТЬNULL(ЛотыВыбранныеПоставщики.Договор.Стоимость, 0) КАК Сумма,
Это заложит правильную структуру данных еще до того, как компоновщик СКД начнет строить итоговый макет отчета.
Для достижения гарантированного результата при разработке отчетов в СКД мы рекомендуем использовать комплексный подход:
ЕСТЬNULL(Поле, 0).ЕстьNull(Сумма(Поле), 0).ЧН=0.Эти несложные правила позволят вам создавать профессиональные отчеты, которые всегда выводят точные данные в полном соответствии с требованиями пользователей.