Как в СКД выводить разные данные в группировках и детальных записях?

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

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

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

Способ 1. Настройка ресурсов с использованием колонки «Рассчитывать по...»

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

Разберем этот механизм по шагам:

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

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

Способ 2. Объединение наборов данных в одном запросе

Иногда удобнее подготовить данные еще на этапе выполнения запроса. Рассмотрим ситуацию, когда мы используем ОБЪЕДИНИТЬ ВСЕ, чтобы собрать в одну таблицу данные разной степени детализации.

Проанализируем пример структуры запроса:


ВЫБРАТЬ
    Ссылка КАК Объект,
    Сумма КАК ПолеДляИтогов,
    0 КАК ПолеДляДеталей
ИЗ
    РегистрСведений.ИтогиПоОбъектам

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

ВЫБРАТЬ
    Объект,
    0,
    СуммаДетальная
ИЗ
    Документ.Движения

После того как данные получены в один набор, мы настраиваем ресурсы следующим образом:

Поскольку в строках с итогами ПолеДляДеталей равно нулю, а в строках с деталями ПолеДляИтогов равно нулю, они не будут искажать расчеты друг друга при правильной настройке колонки «Рассчитывать по...».

Способ 3. Использование функции «ВычислитьВыражение» (EvalExpression)

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

Рассмотрим пример выражения в ресурсе:

ВЫБОР КОГДА Уровень() = 0 ТОГДА Сумма(Поле1) ИНАЧЕ ВычислитьВыражение("Сумма(Поле2)", "ОбщийИтог") КОНЕЦ

Этот метод позволяет гибко управлять значениями, основываясь на системных полях СКД, таких как НомерВГруппе или Уровень. Мы можем явно указать системе, из какого набора или по какому алгоритму вычислять значение в зависимости от текущего положения в иерархии.

Способ 4. Связи наборов данных

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

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

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

Способ 5. Роли полей и игнорирование значений группировок

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

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

Заключение и рекомендации

Выбор конкретного метода зависит от архитектуры ваших данных:

  1. Если данные уже есть в одном запросе, используйте настройку ресурсов по группировкам (Способ 1) — это наиболее прозрачный и поддерживаемый метод.
  2. Если данные требуют сложного сопоставления из разных таблиц, используйте ОБЪЕДИНИТЬ ВСЕ в запросе (Способ 2) с последующим разделением в ресурсах.
  3. Если необходимо вычислять значения на лету, опираясь на итоги вышестоящих уровней, применяйте ВычислитьВыражение (Способ 3).

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

← На главную