Как в настройках СКД вывести две одинаковые таблицы с разными отборами и корректными итогами?

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

При разработке сложных отчетов в Системе компоновки данных (СКД) часто возникает задача визуального разделения данных на блоки. Типичный пример: нужно вывести две таблицы с абсолютно одинаковой структурой колонок и строк, но в первой таблице должны быть данные, соответствующие условию ЛОЖЬ по определенному полю, а во второй — ИСТИНА. Основная сложность здесь заключается в том, что обычный отбор на уровне группировок часто работает «не так»: строки могут скрываться, но общие итоги по таблице продолжают суммировать все данные набора, либо структура таблицы ломается.

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

Способ 1. Настройка отбора непосредственно на элемент «Таблица»

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

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. В дереве настроек выберем конкретный элемент Таблица (верхний уровень для строк и колонок этой таблицы).
  3. В нижней части экрана выберем вкладку Отбор. Обратите внимание: это должен быть отбор именно этой таблицы, а не общий отбор всего отчета.
  4. Добавим наше булево поле и установим значение, например, ЛОЖЬ.
  5. Для второй таблицы проделаем то же самое, установив значение ИСТИНА.

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

Способ 2. Использование условных выражений в ресурсах

Если отборы на уровне настроек группировок работают нестабильно (особенно в сложных иерархических отчетах), мы можем перенести логику фильтрации в расчет ресурсов. Рассмотрим этот метод подробнее.

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

Сумма(ВЫБОР КОГДА МоеБулевоПоле = ИСТИНА ТОГДА СуммаОборота ИНАЧЕ 0 КОНЕЦ)

Для второй таблицы нам потребуются другие ресурсы. Однако СКД по умолчанию применяет ресурсы ко всему отчету. Чтобы реализовать разделение, можно создать Вычисляемые поля, например, СуммаДляТаблицы1 и СуммаДляТаблицы2, и уже их использовать как раздельные ресурсы для разных таблиц в настройках.

Способ 3. Дублирование полей в запросе (Метод автора темы)

Этот способ надежен, когда отчет имеет сложную структуру или программную компоновку. Мы модифицируем сам текст запроса, чтобы создать два набора данных «внутри одного».

Проанализируем пример модификации запроса:


ВЫБРАТЬ
    ОсновнаяТаблица.Поле1 КАК Поле1_Тип1,
    ОсновнаяТаблица.Поле2 КАК Поле2_Тип1,
    NULL КАК Поле1_Тип2,
    NULL КАК Поле2_Тип2,
    ОсновнаяТаблица.Сумма КАК Сумма_Тип1,
    0 КАК Сумма_Тип2
ИЗ
    ОсновнаяТаблица ГДЕ Флаг = ЛОЖЬ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    NULL,
    NULL,
    ОсновнаяТаблица.Поле1,
    ОсновнаяТаблица.Поле2,
    0,
    ОсновнаяТаблица.Сумма
ИЗ
    ОсновнаяТаблица ГДЕ Флаг = ИСТИНА

После такого объединения в настройках СКД мы создаем две таблицы. В первой таблице выбираем поля с суффиксом _Тип1, во второй — _Тип2. Поскольку данные в полях для «чужой» таблицы равны NULL или 0, таблицы будут отображать только свои данные, а итоги сойдутся автоматически.

Способ 4. Использование вложенных схем компоновки

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

  1. В основной схеме на вкладке Вложенные схемы добавим новую схему.
  2. Настроим ее как полноценный отчет с нужным нам отбором.
  3. В основных настройках добавим элемент Вложенный отчет.
  4. Повторим для второй таблицы.

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

Способ 5. Группировка по «полю-пустышке» с отбором

Выясним еще один интересный прием. Можно создать вычисляемое поле, которое всегда равно какому-то значению (например, 1). Сделаем группировку по этому полю, а внутри неё создадим две таблицы. В настройках каждой вложенной таблицы установим жесткий отбор.

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

Резюме и рекомендации

Выбор метода зависит от сложности вашего отчета:

  1. Если отчет простой — используйте отбор на уровне элемента «Таблица» в настройках. Это самый быстрый путь.
  2. Если отчет иерархический и итоги «плывут» — используйте вычисляемые поля с условием ВЫБОР.
  3. Если у вас сложный макет и много программного кода — дублирование полей в запросе или вложенные схемы обеспечат максимальную предсказуемость результата.

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

← На главную