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

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

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

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

Метод 1. Настройка отборов на уровне элементов структуры

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

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

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

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

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

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

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

Для поля СуммаССоглашением:


ВЫБОР 
    КОГДА Соглашение ЕСТЬ НЕ NULL И Соглашение <> ЗНАЧЕНИЕ(Справочник.СоглашенияСКлиентами.ПустаяСсылка) 
    ТОГДА СуммаПродажи 
    ИНАЧЕ 0 
КОНЕЦ

Для поля СуммаБезСоглашения:


ВЫБОР 
    КОГДА Соглашение ЕСТЬ NULL ИЛИ Соглашение = ЗНАЧЕНИЕ(Справочник.СоглашенияСКлиентами.ПустаяСсылка) 
    ТОГДА СуммаПродажи 
    ИНАЧЕ 0 
КОНЕЦ

После этого на вкладке Ресурсы укажем эти новые поля как ресурсы с выражением Сумма(СуммаССоглашением) и Сумма(СуммаБезСоглашения) соответственно. Теперь, даже если данные будут выводиться в одной таблице, итоги по этим колонкам будут считаться раздельно и корректно.

Метод 3. Фильтрация на уровне выражений ресурсов

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

Разберем пример выражения ресурса, которое будет учитывать только нужные нам записи:

Сумма(Выбор Когда Соглашение Заполнено Тогда СуммаПродажи Иначе 0 Конец)

Такой подход позволяет создавать «умные» ресурсы. Вы можете создать два ресурса на базе одного и того же поля (например, Сумма), назвав их Сумма (с согл.) и Сумма (без согл.), и для каждого прописать свое условие расчета. В настройках структуры отчета для первой таблицы вы добавите в «Выбранные поля» только первый ресурс, а для второй — только второй. Итоги в подвалах таблиц будут соответствовать только тем данным, которые выведены в строках.

Метод 4. Разделение на уровне наборов данных (Dataset)

Если логика разделения данных очень сложная (например, для товаров с соглашением нужно применять одну формулу расчета наценки, а для товаров без него — совершенно другую), рекомендуется разделить данные на уровне SQL-запроса. Посмотрим на этот алгоритм:

  1. В схеме компоновки создадим два разных набора данных типа Запрос.
  2. В первом запросе пропишем условие в секции ГДЕ, которое ограничит выборку только записями с заполненным соглашением.
  3. Во втором запросе пропишем противоположное условие.
  4. В настройках отчета добавим две таблицы, при этом для каждой таблицы в поле Имя набора данных укажем соответствующий запрос.

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

Управление отображением итогов и оформлением

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

Помните, что использование Условного оформления для скрытия строк (установка видимости в Ложь) — это плохая практика для решения данной задачи. Скрытые строки все равно будут участвовать в расчете итогов таблицы, что приведет к неверным цифрам в подвале отчета. Всегда используйте механизм Отборов на уровне структуры или фильтрацию в Ресурсах для получения корректного результата.

← На главную