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

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

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

Способ 1. Использование стандартных настроек группировки

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

Для этого в структуре отчета необходимо создать иерархию группировок. Вместо вывода просто «Детальных записей», добавим группировку по полям Сотрудник, ФОТ, Аванс и НДФЛ. Вложенной группировкой к ней добавим «Детальные записи» (или группировку по полю Начисление).

Чтобы данные не «лесенкой», а в одну строку, выполним следующие настройки:

  1. Перейдем на закладку Дополнительные настройки.
  2. Установим параметр Расположение группировок в значение Отдельно и только в итогах.
  3. Параметр Тип расположения полей группировок установим в значение Горизонтально.

В этом случае СКД выведет родительские поля в отдельных колонках, объединив их вертикально для всех дочерних записей. Это наиболее «правильный» с точки зрения архитектуры СКД метод.

Способ 2. Использование функций «СоединитьСтроки» и массивов

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

Разберем алгоритм действий:

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

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

Также можно использовать более сложную функцию ВычислитьВыражениеСГруппировкойМассив. Это позволит собрать данные в массив, который затем будет обработан при выводе. Пример выражения для ресурса:


СоединитьСтроки(ВычислитьВыражениеСГруппировкойМассив("Начисление", "Сотрудник"), Символы.ПС)

Способ 3. Условное оформление и системные поля

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

Рассмотрим по шагам настройку условного оформления:

  1. Перейдем на вкладку Условное оформление в настройках отчета.
  2. Добавим новое правило. В оформлении выберем Текст и оставим его пустым (или установим цвет текста равным цвету фона).
  3. В условии укажем: СистемныеПоля.НомерСтрокиВГруппе > 1.
  4. В области использования выберем те поля, которые должны «схлопываться» (Сотрудник, ФОТ, Аванс).

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

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

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

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


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

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

Способ 5. Использование собственных макетов группировок

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

Однако этот метод менее гибкий, так как количество строк начислений для каждого сотрудника может быть разным. Поэтому чаще используют «Макет оформления» или комбинацию группировок из первого способа.

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

← На главную