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

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

При разработке отчетов на Системе компоновки данных (СКД) часто возникает задача привести отчет к «плоскому» виду, который был бы удобен для последующего анализа в Excel (например, для функции ВПР/VLOOKUP). Стандартное поведение СКД — выводить итоги в отдельных иерархических строках над или под детальными записями. Однако пользователям часто требуется, чтобы итог по группе отображался в той же строке, что и данные, в отдельной колонке, а ячейки этой колонки были объединены вертикально по границам группы.

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

Способ 1. Использование функции ВычислитьВыражение

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

Рассмотрим по шагам, как это настроить:

  1. Перейдем на вкладку Ресурсы.
  2. Добавим новое поле (например, СуммаИтог).
  3. В поле Выражение напишем следующую конструкцию:
    
    ВычислитьВыражение("Сумма(СуммаДокумента)", "ИмяВашейГруппировки", "Группировка")
    
  4. Здесь "Сумма(СуммаДокумента)" — это то, что мы считаем, а "ИмяВашейГруппировки" — это имя группировки в структуре отчета, по которой должен рассчитываться итог.

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

Способ 2. Создание макета группировки

Если требуется именно физическое объединение ячеек в колонке итогов, рассмотрим использование пользовательских макетов. Это более гибкий, хотя и трудоемкий метод.

Выполним следующие действия:

  1. Откроем вкладку Макеты в схеме компоновки данных.
  2. Добавим Макет группировки. Выберем тип группировки (например, «Заголовок» или «Подвал»), но в нашем случае нам нужен макет для самой группировки.
  3. В макете нарисуем область, где колонки с детальными данными идут раздельно, а колонка с итогом — в объединенной по вертикали ячейке.
  4. Укажем параметры макета, связав их с полями СКД.

Важный нюанс: СКД при использовании макетов группировок будет четко следовать заданной структуре. Если вы объедините ячейки в макете, они будут выводиться объединенными в результирующем ТабличныйДокумент. Однако помните, что при выгрузке в Excel объединенная ячейка содержит значение только в первой (верхней левой) позиции, остальные ячейки области будут пустыми.

Способ 3. Программная пост-обработка табличного документа

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

Выясним причину, почему это эффективно: мы получаем полный контроль над объектом ТабличныйДокумент до того, как он будет показан пользователю. Рассмотрим примерный алгоритм:

  1. В модуле отчета переопределим процедуру ПриКомпоновкеРезультата.
  2. Установим стандартную обработку в Ложь.
  3. Выполним компоновку программно в ТабличныйДокумент.
  4. Запустим цикл по строкам полученного документа.

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


// Фрагмент кода пост-обработки
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
    ТекущаяОбласть = ТабДок.Область(НомерСтроки, НомерКолонкиИтога);
    Если ТекущаяОбласть.Текст = ПредыдущееЗначение Тогда
        // Здесь можно реализовать логику накопления области для объединения
        // Метод Область.Объединить() позволит склеить ячейки
    КонецЕсли;
    ПредыдущееЗначение = ТекущаяОбласть.Текст;
КонецЦикла;

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

Способ 4. Настройка структуры без иерархии (плоский отчет)

Чтобы убрать «лесенку» и сделать отчет максимально похожим на таблицу базы данных, выполним настройки на вкладке Настройки - Структура:

  1. Вместо иерархического дерева группировок (когда детальные записи подчинены группировке), расположим их на одном уровне.
  2. Используем поле группировки прямо в строке детальных записей.
  3. В Других настройках для всего отчета или конкретной группировки установим параметр Расположение группировок в значение Нет или Отдельно и только в итоге.
  4. Параметр Расположение ресурсов установим в значение Вертикально (в некоторых случаях это помогает прижать итоги к строке).

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

Важные рекомендации для выгрузки в Excel

Если ваша конечная цель — «ВПРить» данные в Excel, категорически не рекомендуется использовать физическое объединение ячеек. Рассмотрим, почему это так: функция VLOOKUP в Excel при обращении к диапазону с объединенными ячейками увидит значение только в первой строке. Во всех остальных строках, которые визуально входят в объединение, будет значение NULL или пустота.

Лучшая стратегия для Excel:

Таким образом, визуально отчет будет выглядеть чистым (как с объединенными ячейками), но при копировании или программной обработке в Excel в каждой ячейке будет содержаться реальное число, пригодное для формул.

Резюме

Мы рассмотрели различные подходы к кастомизации вывода итогов в СКД. Выбор конкретного метода зависит от ваших приоритетов: если важна скорость разработки и корректность данных для Excel — выбирайте Способ 1. Если же на первом месте стоит строгое соответствие печатному макету сторонней программы — используйте Способ 2 или Способ 3.

← На главную