Как программно добавить итоги и иерархические группировки в отчет СКД

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

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

Понимаем разницу между схемой и настройками

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

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

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

Шаг 1. Программное добавление ресурсов в схему

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


// Перебираем все ресурсы, определенные в схеме
Для Каждого ПолеИтога Из ЭтотОбъект.СхемаКомпоновкиДанных.ПоляИтога Цикл
    // Проверяем, не добавлена ли уже группировка по нужному полю
    НайденноеПоле = ПолеИтога.Группировки.Найти("Подразделение");
    
    Если НайденноеПоле = Неопределено Тогда
        // Разрешаем расчет данного итога в разрезе Подразделения
        ПолеИтога.Группировки.Добавить("Подразделение");
    КонецЕсли;
КонецЦикла;

Важный нюанс: если коллекция Группировки у поля итога пуста, 1С по умолчанию считает этот ресурс по всем доступным группировкам. Если же вы добавили туда хотя бы одну запись, ресурс будет считаться только по ней. Будьте внимательны при программной модификации этого состава.

Шаг 2. Настройка иерархической группировки в структуре

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

У объекта ГруппировкаКомпоновкиДанных есть ключевое свойство ТипГруппировки. Мы можем использовать следующие значения системного перечисления:

Проанализируем пример кода для добавления иерархической группировки:


// Получаем текущие настройки
Настройки = ЭтотОбъект.КомпоновщикНастроек.Настройки;

// Создаем новую группировку в структуре
НоваяГруппировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
НоваяГруппировка.Использование = Истина;

// Устанавливаем поле группировки
ПолеГруппировки = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Использование = Истина;
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Подразделение");
ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;

// Не забываем добавить Автополе, чтобы ресурсы отобразились в колонках
АвтоПоле = НоваяГруппировка.ВыбранныеПоля.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Использование = Истина;

Шаг 3. Исправление ошибки «Параметры стоят неверно»

Если при попытке вывести иерархию 1С выдает ошибку о неверных параметрах, проанализируем ситуацию. Скорее всего, возникла одна из двух проблем:

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

Рассмотрим правильную последовательность действий в модуле отчета:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
    
    // 1. Модифицируем схему (добавляем ресурсы, меняем запрос)
    Схема = ЭтотОбъект.СхемаКомпоновкиДанных;
    // ... ваш код изменения схемы ...
    
    // 2. Инициализируем компоновщик с обновленной схемой
    ЭтотОбъект.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    
    // 3. Модифицируем настройки (группировки, иерархию)
    Настройки = ЭтотОбъект.КомпоновщикНастроек.Настройки;
    // ... ваш код изменения структуры ...
    
    // 4. Выполняем компоновку
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Важность «Автополя» для отображения итогов

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

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

Подведем итог: для успешного добавления итогов по иерархии нужно сначала зарегистрировать возможность расчета итога в ПоляИтога схемы, затем создать объект ГруппировкаКомпоновкиДанных в настройках, установить ей ТипГруппировки в значение Иерархия и не забыть про Автополе. Следуя этой структуре, вы сможете динамически управлять любыми сложными отчетами в системе 1С.

← На главную