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

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

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

Причина проблемы: режим совместимости конфигурации

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

Для устранения ограничения в конфигурации выполним следующие действия:

  1. Откроем дерево метаданных в конфигураторе и перейдем в свойства конфигурации.
  2. Найдем свойство Режим совместимости.
  3. Если конфигурация и используемый релиз платформы позволяют, установим режим совместимости не ниже Версия 8.2.16 или отключим совместимость (значение Не использовать).
  4. Сохраним изменения и обновим конфигурацию базы данных. После этого созданное ресурсное поле появится в списке доступных полей для группировок отчета.

Способ 1. Реализация градации непосредственно в тексте запроса

Рассчитывать категории в самом запросе — наиболее производительный и надежный подход, не зависящий от версий платформы и режима совместимости. Если требуется сгруппировать контрагентов по суммарным оборотам, мы можем агрегировать данные во вложенной таблице и применить оператор ВЫБОР.

Посмотрим на пример запроса к регистру накопления:


ВЫБРАТЬ
    ПродажиОбороты.Контрагент КАК Контрагент,
    СУММА(ПродажиОбороты.СтоимостьОборот) КАК СуммаПродаж,
    ВЫБОР
        КОГДА СУММА(ПродажиОбороты.СтоимостьОборот) >= 500000 ТОГДА "Крупный опт"
        КОГДА СУММА(ПродажиОбороты.СтоимостьОборот) >= 100000 ТОГДА "Средний опт"
        ИНАЧЕ "Мелкий опт"
    КОНЕЦ КАК ОбъемПродаж
ИЗ
    РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Контрагент

В этом случае поле ОбъемПродаж становится обычным измерением выборки и гарантированно доступно для формирования иерархии группировок в СКД на любых режимах совместимости.

Способ 2. Вычисляемое поле без добавления в ресурсы

Если категория или градация рассчитывается для каждой строки отдельно (без необходимости агрегации по группе через СУММА()), такое поле не нужно переносить на вкладку Ресурсы.

Разберем по шагам правильную настройку схемы:

  1. Перейдем на вкладку Вычисляемые поля схемы компоновки данных.
  2. Добавим новую строку с именем поля, например, ОбъемЗакупок.
  3. В колонке Выражение напишем логическое условие на языке выражений СКД:
    
    ВЫБОР 
        КОГДА Стоимость >= 100000 ТОГДА "Крупный" 
        КОГДА Стоимость >= 20000 ТОГДА "Средний" 
        ИНАЧЕ "Мелкий" 
    КОНЕЦ
    
  4. Убедимся, что на вкладке Ресурсы это поле не добавлено.
  5. Проверим вкладку Вычисляемые поля — колонка Ограничение поля не должна содержать флаг Запретить группировку.

После такой настройки поле будет доступно в диалоге выбора группировок как стандартный реквизит.

Способ 3. Программная настройка структуры группировок

Если режим совместимости изменить нельзя, а расчет категории завязан на агрегатные функции СКД (например, ВычислитьВыражение()), поле группировки можно добавить программно при компоновке отчета.

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


// Получаем настройки отчета
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

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

// Загружаем настройки обратно в компоновщик
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

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

← На главную