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

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

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

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

1. Использование ресурсов с различными выражениями для группировок

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

Разберем по шагам, как настроить ресурсы:

  1. Откройте конструктор отчета на базе СКД и перейдите на закладку "Ресурсы".

  2. Создайте новый ресурс. Дадим ему понятное имя, например, ПредставлениеДанных или ЗначениеКолонки. Это будет наша единая колонка, которая будет менять свое содержимое.

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

  4. Теперь самое главное: для каждой группировки, для которой требуется особое выражение, создайте новую строку для того же самого ресурса. В вашем примере есть группировки "Склад" и "Номенклатура":

    • Для группировки "Склад":

      1. В поле "Имя" выберите наш ресурс ПредставлениеДанных.
      2. В поле "Выражение" укажите ВычисляемоеПоле (это то поле, которое вы хотите видеть на уровне склада).
      3. В поле "Рассчитывать по..." обязательно выберите поле группировки Склад. Это критически важно, так как именно это свойство указывает СКД, что данное выражение применяется только к итогам по этой группировке и ее вложенным (если для них нет собственных выражений).
    • Для группировки "Номенклатура" (и иерархии):

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

Рассмотрим пример настройки ресурсов:

Предположим, наш запрос в СКД возвращает поля Склад, Номенклатура, ОстатокНоменклатуры и ВычисляемоеПоле. На закладке "Ресурсы" мы можем настроить следующим образом:


Имя: ПредставлениеДанных
Выражение: Сумма(ОстатокНоменклатуры)
Рассчитывать по: Номенклатура

Имя: ПредставлениеДанных
Выражение: ВычисляемоеПоле
Рассчитывать по: Склад

В этом случае, когда отчет будет формироваться:

Важные нюансы при работе с ресурсами:

2. Условное оформление

Метод условного оформления, предложенный в сообщении 6, позволяет менять не сам расчет данных, а их представление в отчете. Мы можем настроить, что отображается в ячейке, основываясь на условиях, таких как текущий уровень группировки или наличие значения в поле группировки. Этот подход особенно полезен, когда основное поле данных уже рассчитано, но вы хотите по-разному его форматировать или представлять на разных уровнях.

Разберем по шагам, как настроить условное оформление:

  1. Создайте общее вычисляемое поле, которое будет служить основной колонкой для вывода данных. Это поле должно быть максимально общим и содержать значения, которые будут отображаться на разных уровнях. Например, если у вас есть ОстатокНоменклатуры и ВычисляемоеПоле:

    
    ВычисляемоеПоле: ДанныеКолонки
    Выражение: ЕстьNull(ОстатокНоменклатуры, ВычисляемоеПоле)
    

    Это поле должно быть добавлено в выбранные поля отчета на закладке "Настройки".

  2. Перейдите на закладку "Настройки" конструктора СКД и выберите вкладку "Условное оформление".

  3. Добавьте новый элемент условного оформления.

  4. В разделе "Оформление" выберите свойство "Текст" или "Выражение представления". Именно эти свойства позволят нам задать, что будет выведено в ячейке.

  5. В разделе "Условие" задайте условие, основываясь на уровне группировки или наличии значения в поле группировки:

    • Для определения первого уровня (например, "Склад"), вы можете использовать Уровень() = 1. Однако, более надежным является проверка заполненности полей группировки, так как она не зависит от порядка группировок:

      
      // Пример условия для группировки "Склад":
      // Проверяем, что поле Склад заполнено, а Номенклатура - нет,
      // что указывает на итоговую строку по складу.
      ЕстьNull(Склад, "") <> "" И ЕстьNull(Номенклатура, "") = ""
      
    • Для второго уровня (например, "Номенклатура"), условие может быть Уровень() = 2 или:

      
      // Проверяем, что поле Номенклатура заполнено
      ЕстьNull(Номенклатура, "") <> ""
      
  6. В разделе "Поля" выберите нашу колонку ДанныеКолонки, к которой применяется это условное оформление.

  7. В разделе "Оформление", в свойстве "Текст" или "Выражение представления", задайте то, что должно отображаться:

    • Для условия, соответствующего группировке "Склад": укажите Формат(ВычисляемоеПоле, "ЧЦ=10; ЧДЦ=2").
    • Для условия, соответствующего группировке "Номенклатура": укажите Формат(ОстатокНоменклатуры, "ЧЦ=10; ЧДЦ=2").

    Функция Формат() здесь используется для корректного отображения числовых значений.

Преимущества условного оформления:

Ограничения условного оформления:

3. Использование макетов

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

Разберем по шагам, как настроить макеты:

  1. Перейдите на закладку "Макеты" в конструкторе СКД.

  2. Добавьте новый макет. В окне создания макета выберите "Тип макета" — "Макет группировки".

  3. Укажите "Группировка", для которой создается этот макет (например, выберите Склад). Это означает, что данный макет будет применяться к строкам, соответствующим этой группировке.

  4. В открывшемся табличном документе макета создайте ячейки, которые будут отображать нужные вам данные. Для ячейки, которая будет отображать наши изменяющиеся данные, установите "Параметр". Именем параметра должно быть имя поля, которое вы хотите вывести (например, ВычисляемоеПоле).

  5. Повторите шаги 2-4 для другой группировки (например, Номенклатура). Создайте новый макет группировки для Номенклатура, и в его табличном документе разместите ячейку, связанную с параметром ОстатокНоменклатуры.

  6. После создания макетов перейдите на закладку "Настройки" отчета.

  7. В свойствах каждой соответствующей группировки (например, Склад), в поле "Макет группировки" укажите созданный макет для склада. Сделайте то же самое для группировки Номенклатура, привязав к ней соответствующий макет.

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

Пример использования макетов:

Мы создадим два макета:

Затем в настройках СКД для группировки Склад мы укажем использовать МакетСклада, а для группировки Номенклатура — МакетНоменклатуры.

Преимущества использования макетов:

Ограничения использования макетов:

4. Функция ВычислитьВыражениеСГруппировкойМассив (для сложной агрегации)

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

Разберем ситуацию, где может потребоваться эта функция:

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

Применение:

Функция ВычислитьВыражениеСГруппировкойМассив(Выражение, ВыраженияПолейГруппировки, ОтборЗаписей, ОтборГруппировок) позволяет более гибко работать с агрегатами. Она возвращает массив значений, вычисленных для указанных группировок. Чаще всего ее используют в выражениях вычисляемых полей или ресурсов.

Пример использования в выражении ресурса (или вычисляемого поля) с использованием системного поля СистемныеПоля.Уровень:


ВЫБОР
    КОГДА СистемныеПоля.Уровень = 1 // Например, уровень склада
        ТОГДА ВычисляемоеПоле
    КОГДА СистемныеПоля.Уровень = 2 // Например, уровень номенклатуры
        ТОГДА Максимум(ОстатокНоменклатуры)
    ИНАЧЕ Сумма(ОстатокНоменклатуры) // Детальные записи или другие уровни
КОНЕЦ

Здесь мы используем СистемныеПоля.Уровень для определения текущего уровня группировки. Сама функция ВычислитьВыражениеСГруппировкойМассив понадобится, если нам нужно, например, получить значения поля с *другого* уровня группировки для расчета текущего. Это уже выходит за рамки простой задачи "разные поля в одной колонке", но важно знать о такой возможности для более продвинутых сценариев агрегации и анализа данных.

Нюансы:

Общие рекомендации по выбору метода

При выборе подходящего метода для вывода разных полей в одной колонке СКД, рекомендуем придерживаться следующей логики:

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

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

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

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

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

← На главную