При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда отчет идеально работает при полной детализации, но стоит пользователю отключить одну из вложенных группировок в настройках, как структура данных ломается. Вместо ожидаемых нескольких строк с итогами мы видим одну единственную строку, в которую «сваливаются» все суммы, причем зачастую рассчитанные некорректно. Рассмотрим подробнее, почему так происходит и как заставить СКД сохранять верную логику расчетов.
Для начала разберем, как именно СКД формирует итоговый запрос к базе данных. В отличие от обычного объекта Запрос, текст которого выполняется «как есть», СКД выступает в роли интеллектуального построителя. Она анализирует текущие настройки отчета: выбранные поля, активные группировки и установленные отборы.
Если в настройках отчета (в структуре группировок или в выбранных полях) отсутствует какое-либо поле, СКД в целях оптимизации стремится полностью исключить его из итогового SQL-запроса. Это делается для минимизации нагрузки на СУБД. Проблема возникает тогда, когда логика вашего запроса опирается на это «невидимое» для компоновщика поле. Рассмотрим ситуацию: расчет категорий (например, процентных групп 0%, 1-49%, 50%+) производится внутри запроса на уровне конкретной номенклатуры. Как только мы убираем группировку Номенклатура, СКД перестраивает запрос так, что агрегация (суммирование) происходит до того, как отрабатывает ваша логика разделения на группы. В результате условие применяется не к каждой позиции отдельно, а к общему итогу по всему набору данных.
Самый быстрый и эффективный способ решить проблему — запретить оптимизатору СКД выбрасывать поле из запроса. Проанализируем, как это сделать по шагам:
Номенклатура).Установка этого признака принудительно сообщает системе: «Это поле должно присутствовать в запросе всегда, даже если оно не выбрано пользователем и не участвует в группировках». Это гарантирует, что гранулярность данных сохранится на нужном уровне, и расчеты во вложенных запросах или временных таблицах пройдут корректно.
Выясним причину, почему расчет категорий внутри запроса часто бывает нестабильным. Когда мы пишем ВЫБОР КОГДА... в тексте запроса СКД, мы жестко привязываем расчет к моменту получения данных из СУБД. Более гибкий подход — использование механизма вычисляемых полей. Рассмотрим пример реализации:
Вместо того чтобы определять группу процентов в запросе, выведем в СКД два базовых ресурса: Остаток и Оборот. Затем на закладке «Вычисляемые поля» добавим поле ГруппаПроцентов с выражением:
Выбор
Когда (Сумма(Остаток) / Сумма(Оборот)) * 100 > 50 Тогда "от 50%"
Когда (Сумма(Остаток) / Сумма(Оборот)) * 100 = 0 Тогда "0%"
Иначе "1-49%"
Конец
В этом случае расчет будет происходить уже после того, как данные будут сгруппированы компоновщиком по тем полям, которые остались активными в настройках. Это обеспечит предсказуемый результат при любой структуре отчета.
Если установка флага «Обязательное» не помогает или вы хотите точно понять, что «под капотом» делает СКД, проанализируем ситуацию с помощью специальных инструментов. Использование обычной «Консоли запросов» здесь бесполезно, так как она покажет вам только ваш исходный текст.
Воспользуемся «Консолью компоновки данных» (входит в состав инструментов разработчика). Она позволяет увидеть:
СГРУППИРОВАТЬ ПО (GROUP BY).Посмотрим на пример: если вы видите, что при отключении группировки из раздела ГДЕ или ВЫБОР исчезают ключевые условия, значит, СКД посчитала их избыточными. В этом случае, помимо флага «Обязательное», стоит проверить настройки автозаполнения. Иногда ручная настройка полей (снятие галочки «Автозаполнение» и самостоятельное описание полей набора данных) позволяет добиться гораздо более стабильной работы сложных отчетов.
Разберем еще один важный нюанс. Если ваш запрос использует виртуальные таблицы, такие как ОстаткиИОбороты, и вы используете измерения этих таблиц для своих расчетов, поведение может быть еще более странным. При отключении группировки по измерению, СКД может перестать передавать это измерение в параметры виртуальной таблицы. Это приводит к тому, что расчеты внутри таблицы начинают вестись по всему массиву данных без учета нужной вам аналитики. В таких случаях также помогает установка роли «Измерение» для соответствующих полей в наборе данных СКД или использование флага «Обязательное».
Столкнувшись с «исчезновением» данных или их некорректным схлопыванием при изменении группировок, не спешите переписывать запрос. Скорее всего, вы столкнулись с избыточным оптимизмом механизма компоновки. Попробуйте применить следующие шаги:
СГРУППИРОВАТЬ ПО сохраняет смысл вашей бизнес-задачи.Помните, что СКД — это не просто способ отображения данных, а мощный движок трансформации запросов, и понимание его внутренней логики — ключ к созданию надежных и гибких отчетов в 1С.