Как скрыть или удалить строки отчета СКД, если все числовые ресурсы в них имеют нулевые значения?

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

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

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

Подход 1: Условное оформление (скрытие строк, а не удаление)

Первый подход, который мы можем рассмотреть, заключается в использовании условного оформления. Этот метод позволяет скрыть строки, которые соответствуют заданному условию, делая их невидимыми для пользователя. Однако важно понимать, что этот подход не удаляет строки из результата компоновки данных, а лишь меняет их визуальное представление.

  1. Откроем настройки отчета или макет СКД. Мы можем найти закладку «Условное оформление», где также доступно Программное изменение заголовка группировки отчета СКД, как в пользовательских настройках отчета (через кнопку «Настройки...» в отчете, если разработчик предусмотрел такую возможность), так и непосредственно в макете СКД в режиме конфигуратора (в окне схемы компоновки данных).

  2. Добавим новый элемент условного оформления. Нажмем кнопку «Добавить» для создания нового правила.

  3. Укажем условие. В поле «Условие» нам необходимо задать выражение, которое будет проверять, равны ли все интересующие нас числовые ресурсы нулю. Например, если у нас есть ресурсы СуммаПриход и СуммаРасход, условие будет выглядеть так:

    
    СуммаПриход = 0 И СуммаРасход = 0
    

    Если ресурсов больше, мы продолжаем добавлять условия через оператор И для каждого ресурса: Ресурс1 = 0 И Ресурс2 = 0 И ...

  4. Установим вид оформления. В разделе «Оформление» мы можем выбрать, как будут выглядеть строки, удовлетворяющие условию. Чтобы скрыть строку, мы можем установить, например, «Цвет текста» в белый или совпадающий с цветом фона отчета. Также можно попробовать установить «Размер шрифта» в 0 (если это поддерживается) или «Видимость» в Ложь (хотя не всегда этот параметр влияет на всю строку). Чаще всего достаточно изменить цвет текста или фона на невидимый цвет.

  5. Укажем поля оформления. В разделе «Поля» мы можем выбрать, к каким полям будет применяться это условное оформление. Чтобы скрыть всю строку, мы обычно выбираем все поля, отображаемые в отчете, или оставляем пустым, если это применимо ко всей области данных.

Преимущества этого метода: Относительно прост в настройке, не требует изменений в запросе СКД.

Недостатки: Строки не удаляются из набора данных, а лишь скрываются. Это может повлиять на производительность при очень большом объеме данных и не подходит, если необходимо полностью исключить строки из обработки или выгрузки — для этой задачи есть автоматическая выгрузка данных СКД во внешние системы.

Подход 2: Использование вычисляемого поля и отбора (удаление строк)

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

Шаг 1: Добавление вычисляемого поля в схему компоновки данных

Мы начинаем с модификации схемы компоновки данных в конфигураторе. Нам необходимо определить новое поле, которое будет служить флагом для наших строк.

  1. Откроем схему компоновки данных. Перейдем в конфигуратор, найдем интересующий нас отчет или обработку и откроем схему компоновки данных (в некоторых случаях бывает полезно использовать Две разных схемы в отчете СКД) — для этого подойдёт консоль СКД для отладки вычисляемых полей.

  2. Перейдем на закладку «Вычисляемые поля». Здесь мы можем создавать новые поля, значения которых будут рассчитываться на основе уже существующих полей или сложных выражений, что часто встречается в задачах типа Таблица умножения, деления на СКД.

  3. Создадим новое вычисляемое поле. Нажмем кнопку «Добавить». Присвоим новому полю осмысленное имя, например, ЕстьДанные. Тип данных для этого поля будет Булево (Истина/Ложь).

  4. Сформируем выражение для вычисляемого поля. Суть выражения заключается в проверке, является ли хотя бы один из числовых ресурсов ненулевым. Если это так, наше поле ЕстьДанные примет значение Истина, в противном случае – Ложь.

    Рассмотрим пример для ресурсов СуммаПриход и СуммаРасход:

    
    ВЫБОР
        КОГДА СуммаПриход <> 0 ИЛИ СуммаРасход <> 0
        ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ
    

    Это выражение достаточно простое и прямолинейное. Однако, нам необходимо учесть важный нюанс: поля в базе данных 1С, особенно ресурсы, могут принимать значение NULL, а не только 0. Если ресурс имеет значение NULL, то условие NULL <> 0 не будет истинным (оно также не будет ложным, а будет неопределенным), что может привести к некорректной работе отбора.

Шаг 2: Важность функции ЕСТЬNULL

Функция ЕСТЬNULL является критически важной при работе с полями, которые могут быть NULL. Она позволяет заменить значение NULL на указанное нами значение по умолчанию, что делает выражение предсказуемым.

Мы выясним, почему это так важно. В языке запросов 1С, как и во многих SQL-подобных языках, сравнение с NULL ведет себя особым образом. Например, NULL = 0 возвращает неопределенное значение, а не Ложь. Аналогично, NULL <> 0 также возвращает неопределенное значение. Это означает, что если наш ресурс СуммаПриход будет NULL, то условие СуммаПриход <> 0 не сработает так, как мы ожидаем, чтобы пометить строку как имеющую данные.

Чтобы избежать этой неопределенности, мы используем ЕСТЬNULL. Функция ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) возвращает ЗначениеПоУмолчанию, если Поле равно NULL, и само Поле в противном случае. Таким образом, мы можем гарантировать, что все наши ресурсы будут рассматриваться как числовые значения (в нашем случае, 0), если они по какой-то причине оказались NULL.

Давайте посмотрим, как изменится выражение для нашего вычисляемого поля с учетом ЕСТЬNULL:


ВЫБОР
    КОГДА ЕСТЬNULL(СуммаПриход, 0) <> 0 ИЛИ ЕСТЬNULL(СуммаРасход, 0) <> 0
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
КОНЕЦ

Или, более лаконично, если мы хотим, чтобы поле ЕстьДанные было истинным, если хотя бы один из ресурсов не равен нулю (учитывая NULL):


ЕСТЬNULL(СуммаПриход, 0) <> 0 ИЛИ ЕСТЬNULL(СуммаРасход, 0) <> 0

В этом случае, если СуммаПриход равно NULL, ЕСТЬNULL(СуммаПриход, 0) вернет 0. Затем 0 <> 0 будет Ложь. Если же СуммаПриход равно, скажем, 100, то ЕСТЬNULL(СуммаПриход, 0) вернет 100, и 100 <> 0 будет Истина. Это именно то поведение, которое нам нужно.

Рассмотрим пример для нескольких ресурсов: Если у нас есть ресурсы СуммаПриход, СуммаРасход и Количество, выражение будет выглядеть так:


ЕСТЬNULL(СуммаПриход, 0) <> 0
ИЛИ ЕСТЬNULL(СуммаРасход, 0) <> 0
ИЛИ ЕСТЬNULL(Количество, 0) <> 0

Это выражение вернет Истина, если хотя бы один из указанных ресурсов (или его значение по умолчанию 0, если ресурс был NULL) не равен нулю. В противном случае, если все ресурсы нулевые или NULL, оно вернет Ложь.

Шаг 3: Добавление отбора по вычисляемому полю

После того как мы создали наше вычисляемое поле ЕстьДанные, мы можем использовать его для фильтрации строк в отчете.

  1. Перейдем на закладку «Отборы» в схеме компоновки данных.

  2. Добавим новый элемент отбора. Похожим образом настраивается и Отбор СКД по табличной части или таблице значений.

  3. Укажем поле отбора. Выберем наше только что созданное вычисляемое поле ЕстьДанные.

  4. Установим вид сравнения и значение. Установим «Вид сравнения» как «Равно» и «Значение» как Истина.

    Таким образом, мы говорим СКД: «Покажи мне только те строки, для которых наше поле ЕстьДанные имеет значение Истина», что фактически означает «Покажи мне только те строки, в которых есть хотя бы одно ненулевое значение ресурса».

  5. Установим использование. Убедимся, что отбор установлен для использования (галочка «Использование» должна быть активна).

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

Дополнительные рекомендации и нюансы

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

  2. Производительность: Использование вычисляемых полей и последующего отбора на них может незначительно повлиять на производительность при очень больших объемах данных, поскольку для каждой строки сначала вычисляется значение нового поля. Однако это, как правило, гораздо более эффективно, чем пытаться фильтровать данные на стороне клиентского приложения или выполнять сложные проверки после получения всех данных из СКД.

  3. Универсальность: Описанный подход с вычисляемым полем является очень гибким. Мы можем усложнять выражение вычисляемого поля, добавляя проверки на различные типы данных, учитывать разные условия для разных групп ресурсов и так далее. Это позволяет нам создавать практически любые правила фильтрации на основе агрегированных или вычисленных значений в строке.

  4. Настройка для пользователя: Если вы хотите предоставить пользователю возможность включать или отключать этот отбор, вы можете сделать поле ЕстьДанные доступным для пользовательских настроек отчета. Для этого в схеме компоновки данных на закладке «Настройки» в разделе «Доступные поля» необходимо добавить наше вычисляемое поле.

В заключение, проблема фильтрации строк отчета СКД по условию нулевых ресурсов эффективно решается путем создания булевого вычисляемого поля, которое агрегирует состояние всех интересующих нас ресурсов в строке, и последующего применения отбора по этому полю. Особое внимание следует уделить корректной обработке значений NULL с помощью функции ЕСТЬNULL, что обеспечит надежность и точность вашего отчета.

← На главную