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