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