Как в кросс-таблице СКД отличить нулевое значение от отсутствия записи

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

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

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

Выясним причину поведения платформы

Проанализируем механику работы кросс-таблицы СКД:

  1. Формирование матрицы: При построении таблицы СКД строит декартово произведение измерений строк и колонок. Если для определенной пары (например, Организация1 и ЦеннаяБумага1) в исходной выборке нет строки, то ячейка на их пересечении получает значение NULL.
  2. Поведение агрегатных функций: Агрегатная функция Количество(Поле) для отсутствующей записи возвращает 0, а функция Сумма(Поле) возвращает NULL. Если же запись существует и в ней явно записано число 0, то Количество(Поле) возвратит 1, а Сумма(Поле) вернет числовое значение 0.
  3. Особенность условного оформления «Заполнено»: В платформе 1С стандартная проверка критерия «Заполнено / Не заполнено» для чисел считает значение 0 незаполненным. По этой причине простое условие оформления не позволяет разделить физический ноль и отсутствие данных.

Способ 1. Настройка пользовательского выражения на вкладке «Ресурсы»

Рассмотрим основной способ решения, не требующий модификации исходного запроса. В схеме компоновки данных на вкладке Ресурсы поле «Выражение» можно не просто выбирать из выпадающего списка, а прописывать произвольной формулой на языке выражений СКД.

Посмотрим на практическую реализацию. На вкладке Ресурсы для числового поля добавляем формулу, анализирующую количество записей или наличие значения NULL:


ВЫБОР 
    КОГДА Количество(Котировка) = 0 ТОГДА "нет" 
    ИНАЧЕ Сумма(Котировка) 
КОНЕЦ

Также можно воспользоваться функцией ЕстьNULL для агрегата суммы:

ЕстьNULL(Сумма(Котировка), "нет")

Обратите внимание на важную деталь: агрегатные функции вроде СУММА() или КОЛИЧЕСТВО() нельзя использовать на вкладке «Вычисляемые поля» схемы компоновки, так как это вызовет ошибку «Использование вложенных агрегатных функций не допускается». Формулы с агрегацией необходимо прописывать непосредственно на вкладке Ресурсы.

Если требуется сохранить расчет общих итогов числом (так как строка "нет" превратит тип ресурса в составной), настроим раздельный расчет в колонке Рассчитывать по...:

  1. Для строк и колонок таблицы указываем выражение с выводом текста при отсутствии данных: ВЫБОР КОГДА Количество(Котировка) = 0 ТОГДА "нет" ИНАЧЕ Сумма(Котировка) КОНЕЦ
  2. Для группировок общих итогов добавляем отдельную строку ресурса с выражением: Сумма(Котировка)

Способ 2. Условное оформление со свойством «Текст» и маской формата

Разберем альтернативный вариант, позволяющий сохранить ресурс строго числовым типом данных. Это бывает критично для корректного экспорта отчета в электронные таблицы и построения диаграмм.

Выполним следующие шаги в настройках варианта отчета:

  1. На вкладке Ресурсы оставляем стандартное выражение Сумма(Котировка).
  2. Переходим на вкладку Условное оформление и добавляем первое правило:
    • Условие: Котировка Равно NULL (или системное поле количества записей равно 0).
    • Оформление: свойство Текст со значением "нет".
  3. Добавляем второе правило для явного отображения фактических нулей:
    • Условие: Котировка Равно 0.
    • Оформление: свойство Формат с маской ЧН=0 (или свойство Текст со значением 0).

В результате такого оформления ячейка с отсутствующей записью получит строковое представление «нет», а ячейка с фактическим нулевым значением отобразит цифру «0».

Способ 3. Использование функции общего модуля в выражении ресурса

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

В выражении ресурса на вкладке Ресурсы пишем вызов функции:


МойОбщийМодульСервер.СформироватьПредставлениеКотировки(Сумма(Котировка), Количество(Котировка))

В общем модуле с признаком вызова на сервере описываем экспортную функцию:


Функция СформироватьПредставлениеКотировки(ЗначениеСумма, КоличествоЗаписей) Экспорт
    
    Если КоличествоЗаписей = 0 Или ЗначениеСумма = NULL Тогда
        Возврат "нет";
    КонецЕсли;
    
    Возврат Формат(ЗначениеСумма, "ЧДЦ=2; ЧН=0");
    
КонецФункции

Этот подход делает схему компоновки легко расширяемой и позволяет централизованно управлять форматированием данных в отчетах.

← На главную