Как в СКД убрать пустые строки из отчета в общем виде

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

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

Проблема стандартного отбора

Разберем типичную ситуацию: если мы наложим обычный отбор на уровне «Набора данных» (вкладка «Отбор» в конструкторе запроса или в настройках СКД), система будет фильтровать записи еще до того, как они попадут в механизм расчета итогов. Это часто приводит к неверным результатам в иерархических отчетах или при расчете средних величин. Если же наложить отбор на поле-ресурс, начинающий разработчик может столкнуться с тем, что пустые родительские группировки все равно остаются в итоговой таблице. Проанализируем эти типичные ошибки при настройке отборов по шагам.

Способ 1. Отбор по значению ресурса на уровне отчета

Это самый универсальный метод, который корректно работает даже при изменении структуры группировок пользователем. Суть заключается в том, что СКД должна анализировать уже агрегированные данные (итоги), а не детальные записи.

Рассмотрим последовательность действий:

  1. Переходим на вкладку Настройки, выбираем верхний уровень (весь отчет).
  2. Переходим на закладку Отбор.
  3. Добавляем поле, которое является ресурсом (например, СуммаОстаток).
  4. Устанавливаем вид сравнения Заполнено или Не равно 0.
  5. Важный нюанс: в колонке настроек отбора найдите параметр «Использование». В расширенных настройках (через правую кнопку мыши или свойства элемента) обратите внимание на режим применения отбора. Для исключения пустых группировок часто требуется режим После сгруппировки или использование отбора именно по ресурсу, так как СКД автоматически применяет такие условия к итогам.

Способ 2. Использование вычисляемых полей для проверки пустоты

Если в отчете используется множество ресурсов (количество, сумма, вес) и строка считается пустой только при равенстве нулю всех этих полей, удобно создать единый индикатор «пустоты».

Разберем создание такого поля:

  1. На вкладке Вычисляемые поля добавим поле с именем ЭтоПустаяСтрока.
  2. В выражении пропишем логическую проверку, используя функцию ЕСТЬNULL.

(ЕСТЬNULL(СуммаКонечныйОстаток, 0) = 0) 
И (ЕСТЬNULL(КоличествоКонечныйОстаток, 0) = 0)

После этого на уровне отчета достаточно установить отбор: ЭтоПустаяСтрока Равно Ложь. Этот метод позволяет централизованно управлять логикой скрытия строк, не загромождая настройки множеством условий.

Способ 3. Условное оформление и свойство Видимость

Иногда требуется не исключить данные из расчета, а просто скрыть их визуально в табличном документе. Проанализируем этот подход через Условное оформление.

  1. В настройках отчета переходим на вкладку Условное оформление.
  2. Добавляем новый элемент оформления.
  3. В оформлении устанавливаем флажок Видим и значение Ложь.
  4. В условии указываем, при каких параметрах строка считается пустой (например, Сумма = 0).
  5. В области применения выбираем все поля или конкретные группировки.

Важный момент: использование видимости не удаляет строку из табличного документа полностью — она остается с нулевой высотой. При выгрузке в Excel такие строки могут «проявляться», поэтому для чистой выгрузки лучше использовать полноценные отборы.

Способ 4. Оптимизация на уровне запроса (ИМЕЮЩИЕ)

Если структура отчета жесткая и не предполагает произвольных группировок, самый производительный способ — отсечь пустые данные на уровне СУБД. Выясним, как использовать предложение ИМЕЮЩИЕ в тексте запроса СКД.

Используем конструкцию HAVING, которая фильтрует результаты выполнения агрегатных функций:


ВЫБРАТЬ
    Продажи.Номенклатура,
    СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи
ГРУППИРОВАТЬ ПО
    Продажи.Номенклатура
ИМЕЮЩИЕ
    СУММА(Продажи.СуммаОборот) <> 0

Это исключит передачу лишних строк в компоновку, что ускорит формирование отчета на больших объемах данных.

Способ 5. Свойство Обязательное поле

Посмотрим на настройки набора данных. На закладке Поля для каждого поля есть флаг Обязательное. Если вы используете связь нескольких наборов данных (например, справочник номенклатуры и остатки), и хотите видеть только те позиции, по которым есть остатки, установка флага Обязательное на поле из набора с остатками заставит СКД использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ (INNER JOIN) вместо ЛЕВОЕ СОЕДИНЕНИЕ. Это автоматически уберет строки из «пустого» справочника, по которым нет движений.

Способ 6. Программная обработка результата

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


// После вывода результата в ТабличныйДокумент
Для НомерСтроки = ТабДок.ВысотаТаблицы По 1 Шаг -1 Цикл
    // Проверяем значение в ключевой колонке (например, колонке с ресурсом)
    ЗначениеЯчейки = ТабДок.Область(НомерСтроки, НомерКолонкиСуммы).Текст;
    Если ПустаяСтрока(ЗначениеЯчейки) ИЛИ ЗначениеЯчейки = "0" Тогда
        ТабДок.УдалитьОбласть(ТабДок.Область(НомерСтроки, , НомерСтроки, ), ТипСмещенияТабличногоДокумента.ПоВертикали);
    КонецЕсли;
КонецЦикла;

Этот метод является наиболее трудозатратным для системы, но он гарантирует удаление строк в тех случаях, когда механизмы СКД по какой-то причине оставляют визуальный мусор.

Резюме

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

← На главную