Однажды потребовалось в универсальном отчете вывести количество строк в группировках. Отчетов на базе универсального множество, может, кому пригодится.
Добавляем в модуле отчета в самом конце процедуры СформироватьОтчет() код:
УниверсальныйОтчет.СформироватьОтчет(ТабличныйДокумент,,, ЭтотОбъект);
//ДополнитьГруппировкиКоличествомВложенныхСтрок()
//{
ВысотаШапки = ПолучитьВысотуШапки(ТабличныйДокумент);
Группировки = УниверсальныйОтчет.ПостроительОтчета.ИзмеренияСтроки;
РезультатЗапроса = УниверсальныйОтчет.ПолучитьРезультат();
// Стартуем рекурсивный обход таблицы
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, Группировки[0].Имя);
ДополнитьГруппировку(ТабличныйДокумент, Группировки, Выборка, 0, ВысотаШапки + 1, 0);
//}
КонецПроцедуры // СформироватьОтчет()
И в конец модуля код самих функций:
////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ ДОПОЛНЕНИЯ ГРУППИРОВОК СТРОК
// Когда нет группировок колонок, то первая группировка строк двойная строка.
// Нужно сместиться на одну строку перед каждой группировкой первого уровня.
//
Функция ФиксСтрокПоГлубине(Глубина)
Шаг = 0;
Если Глубина = 0 И УниверсальныйОтчет.ПостроительОтчета.ИзмеренияКолонки.Количество() = 0 Тогда
Шаг = 1;
КонецЕсли;
Возврат Шаг;
КонецФункции
// Дополняет ячейку количеством.
//
Процедура ВывестиКоличество(ТабличныйДокумент, НомерСтроки, Количество)
Область = ТабличныйДокумент.Область(НомерСтроки, 2);
Область.Текст = Область.Текст + " (( " + Количество + " ))";
КонецПроцедуры
// Рекурсивная процедура дополняет группировку количеством вложенных строк.
//
Процедура ДополнитьГруппировку(ТабличныйДокумент, Группировки, Выборка, Глубина, НомерСтроки, ПрошлоеКоличество)
Если Глубина < Группировки.Количество() - 1 Тогда
Пока Выборка.Следующий() Цикл
// выбираем по следеющей группировке
Выб = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, Группировки[Глубина + 1].Имя);
// выводим количество в текущую строку
Количество = Выб.Количество();
ВывестиКоличество(ТабличныйДокумент, НомерСтроки, Количество);
// шагаем на следующую и запускаемся рекурсивно
НомерСтроки = НомерСтроки + 1;
ДополнитьГруппировку(ТабличныйДокумент, Группировки, Выб, Глубина + 1, НомерСтроки, Количество);
НомерСтроки = НомерСтроки + ФиксСтрокПоГлубине(Глубина);
КонецЦикла;
Иначе
// находимся на дне дерева и нужно пропустить количество строк последнего уровня,
// полученное на прошлом шаге.
НомерСтроки = НомерСтроки + ПрошлоеКоличество;
КонецЕсли;
КонецПроцедуры
// Вычисляет высоту шапки отчета по области заголовка и группировкам.
//
Функция ПолучитьВысотуШапки(ТабличныйДокумент)
ГруппКолонок = УниверсальныйОтчет.ПостроительОтчета.ИзмеренияКолонки.Количество();
ГруппСтрок = УниверсальныйОтчет.ПостроительОтчета.ИзмеренияСтроки.Количество();
Если ГруппКолонок > 0 Тогда
ОбластьЗаголовка = ТабличныйДокумент.Области.Найти("Заголовок");
ГруппСтрок = ?(ГруппСтрок < 3, 3, ГруппСтрок);
ВысотаШапки = ОбластьЗаголовка.Низ + ГруппСтрок;
Иначе
ОбластьШапки = ТабличныйДокумент.Области.Найти("ШапкаТаблицы");
ВысотаШапки = ОбластьШапки.Низ + 1;
КонецЕсли;
Возврат ВысотаШапки;
КонецФункции
// ФУНКЦИИ ДОПОЛНЕНИЯ ГРУППИРОВОК СТРОК
////////////////////////////////////////////////////////////////////////////
Значения подогнаны для УТ 10.3, если макет в вашей конфигурации немного отличается, то подогнать смещения не составит труда.