Почему в СКД при отключении вложенной группировки данные «схлопываются» в одну строку и как это исправить?

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

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

Анализируем причину: Механизм динамического перестроения запроса

Для начала разберем, как именно СКД формирует итоговый запрос к базе данных. В отличие от обычного объекта Запрос, текст которого выполняется «как есть», СКД выступает в роли интеллектуального построителя. Она анализирует текущие настройки отчета: выбранные поля, активные группировки и установленные отборы.

Если в настройках отчета (в структуре группировок или в выбранных полях) отсутствует какое-либо поле, СКД в целях оптимизации стремится полностью исключить его из итогового SQL-запроса. Это делается для минимизации нагрузки на СУБД. Проблема возникает тогда, когда логика вашего запроса опирается на это «невидимое» для компоновщика поле. Рассмотрим ситуацию: расчет категорий (например, процентных групп 0%, 1-49%, 50%+) производится внутри запроса на уровне конкретной номенклатуры. Как только мы убираем группировку Номенклатура, СКД перестраивает запрос так, что агрегация (суммирование) происходит до того, как отрабатывает ваша логика разделения на группы. В результате условие применяется не к каждой позиции отдельно, а к общему итогу по всему набору данных.

Способ №1: Использование флага «Обязательное»

Самый быстрый и эффективный способ решить проблему — запретить оптимизатору СКД выбрасывать поле из запроса. Проанализируем, как это сделать по шагам:

  1. Откроем схему компоновки данных и перейдем на закладку «Наборы данных».
  2. В списке полей набора данных найдем то поле, по которому должна сохраняться детальная выборка (в нашем примере это Номенклатура).
  3. В колонке «Обязательное» установим флаг.

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

Способ №2: Перенос логики в «Вычисляемые поля» СКД

Выясним причину, почему расчет категорий внутри запроса часто бывает нестабильным. Когда мы пишем ВЫБОР КОГДА... в тексте запроса СКД, мы жестко привязываем расчет к моменту получения данных из СУБД. Более гибкий подход — использование механизма вычисляемых полей. Рассмотрим пример реализации:

Вместо того чтобы определять группу процентов в запросе, выведем в СКД два базовых ресурса: Остаток и Оборот. Затем на закладке «Вычисляемые поля» добавим поле ГруппаПроцентов с выражением:


Выбор 
    Когда (Сумма(Остаток) / Сумма(Оборот)) * 100 > 50 Тогда "от 50%" 
    Когда (Сумма(Остаток) / Сумма(Оборот)) * 100 = 0 Тогда "0%" 
    Иначе "1-49%" 
Конец

В этом случае расчет будет происходить уже после того, как данные будут сгруппированы компоновщиком по тем полям, которые остались активными в настройках. Это обеспечит предсказуемый результат при любой структуре отчета.

Диагностика через консоль компоновки данных

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

Воспользуемся «Консолью компоновки данных» (входит в состав инструментов разработчика). Она позволяет увидеть:

Посмотрим на пример: если вы видите, что при отключении группировки из раздела ГДЕ или ВЫБОР исчезают ключевые условия, значит, СКД посчитала их избыточными. В этом случае, помимо флага «Обязательное», стоит проверить настройки автозаполнения. Иногда ручная настройка полей (снятие галочки «Автозаполнение» и самостоятельное описание полей набора данных) позволяет добиться гораздо более стабильной работы сложных отчетов.

Особенности работы с виртуальными таблицами

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

Подведем итоги

Столкнувшись с «исчезновением» данных или их некорректным схлопыванием при изменении группировок, не спешите переписывать запрос. Скорее всего, вы столкнулись с избыточным оптимизмом механизма компоновки. Попробуйте применить следующие шаги:

  1. Установите флаг «Обязательное» для полей, определяющих детализацию расчетов.
  2. Проверьте роли полей (Измерения/Реквизиты).
  3. Если расчет категорий сложный — попробуйте вынести его из запроса в Вычисляемые поля или Выражения ресурсов.
  4. Всегда проверяйте финальный запрос через Консоль компоновки, чтобы убедиться, что логика СГРУППИРОВАТЬ ПО сохраняет смысл вашей бизнес-задачи.

Помните, что СКД — это не просто способ отображения данных, а мощный движок трансформации запросов, и понимание его внутренней логики — ключ к созданию надежных и гибких отчетов в 1С.

← На главную