При работе с Системой компоновки данных (СКД) часто возникает ситуация, когда в исходных данных присутствуют записи с положительными и отрицательными значениями. В детальных записях суммы не равны нулю, но при расчете итогов по группировке они «схлопываются», давая в результате ноль. Обычный отбор в настройках отчета в таких случаях не помогает, так как он фильтрует исходные записи еще до того, как они попадут в расчет итогов. В этой статье мы подробно разберем, как правильно настроить отчет в пользовательском режиме, чтобы скрыть такие «пустые» строки, не прибегая к помощи программиста и не открывая конфигуратор.
Для начала проанализируем ситуацию. Представим, что у нас есть данные по физическому лицу, где начислено 345 рублей и удержано 345 рублей. В базе данных это две разные записи. Если мы установим отбор на уровне отчета Сумма <> 0, система проверит каждую запись по отдельности. Так как и 345, и -345 не равны нулю, обе записи попадут в отчет. Затем СКД сгруппирует их и выведет итог: 0. Мы увидим строку с именем сотрудника и пустую колонку суммы (или ноль).
Выясним причину: отбор на уровне отчета работает как условие ГДЕ в языке запросов SQL. Он отсекает данные на этапе выборки. Нам же нужно отсечь данные уже после того, как группировка сформирована и итоги подсчитаны — это аналог условия ИМЕЮЩИЕ (HAVING) в SQL. Рассмотрим, как реализовать это в настройках СКД.
Это самый эффективный и правильный метод решения задачи. Посмотрим на алгоритм действий в пользовательском режиме (через «Изменить вариант»):
ФизическоеЛицо).Сумма (наш ресурс), вид сравнения Не равно и значение 0.Разберем подробнее, что при этом происходит. Когда отбор установлен внутри группировки, СКД сначала собирает все данные, относящиеся к этой группе, вычисляет итоговое значение ресурса и только после этого применяет фильтр. Если итог равен нулю, вся ветка группировки скрывается из финального результата.
Иногда мы сталкиваемся с ситуацией, когда визуально в отчете стоит ноль, но отбор Не равно 0 не срабатывает. Проанализируем ситуацию: это может происходить из-за особенностей хранения дробных чисел. В базе данных итог может быть равен 0.00000000001, что для системы не является нулем.
В этом случае рекомендуется использовать более гибкие условия в отборе группировки. Рассмотрим варианты:
Сумма Больше 0.01 ИЛИ Сумма Меньше -0.01.Окр(Сумма, 2), но в пользовательском режиме это сделать сложнее. Поэтому лучше использовать диапазон значений в отборе.Рассмотрим ситуацию, когда нам крайне важно сохранить итоговую сумму по всему отчету (Общий итог) неизменной, но при этом мы не хотим видеть строки с нулевыми значениями. Важно понимать: отбор в группировке исключает данные из общего итога. Если вам нужно просто скрыть строку, но оставить её вклад в общую сумму (хотя для нулей это не актуально, это полезно для других задач), используем «Условное оформление».
0.1 или «Текст» — пустая строка.Сумма Равно 0.Однако помните, что этот метод является «косметическим». Строка физически останется в табличном документе, просто она будет практически невидимой.
Проанализируем важный нюанс: как отборы влияют на расчеты. Посмотрим на пример кода, который мог бы описывать логику СКД при работе с группировками:
// Логика работы отбора группировки (упрощенно)
Для Каждой СтрокаГруппировки Из РезультатКомпоновки Цикл
Если СтрокаГруппировки.ИтогРесурса <> 0 Тогда
ВывестиВОтчет(СтрокаГруппировки);
КонецЕсли;
КонецЦикла;
Если в вашем отчете несколько ресурсов, например СуммаОплаты и КоличествоДней, и вы ставите отбор только по Сумме, то строки, где сумма ноль, но количество дней заполнено, тоже исчезнут. Чтобы этого избежать, всегда проверяйте совокупность условий. Вы можете сгруппировать условия отбора, используя логическое «И» или «ИЛИ» прямо в окне настроек группировки.
Бывают случаи, когда сумма в итоге получается нулевой потому, что данных просто нет (например, при левом соединении в запросе). В таких ситуациях полезно использовать системное поле КоличествоЗаписей. Мы можем добавить в отбор группировки условие Количество записей Больше 0. Это гарантирует, что в отчет попадут только те группы, по которым физически есть хотя бы одна строка в базе данных.
Подведем итог нашему исследованию. Чтобы быстро убрать пустые строки с нулевыми итогами, выполните следующие действия:
Сумма (Остаток) Не равно 0).Этот простой алгоритм позволяет гибко управлять отображением данных, делая отчеты более читаемыми и профессиональными, не требуя при этом внесения изменений в конфигурацию программного продукта 1С.