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