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