При разработке отчетов в системе компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией, когда числовые показатели не суммируются на уровнях группировок, отчет выдает ошибку вида «Поле не может находиться в этой группировке» или итоговые строки вовсе остаются пустыми. Разберем по шагам причины такого поведения платформы и рассмотрим правильные варианты настройки схемы компоновки данных.
Проанализируем распространенную ошибку: если поле уже объявлено на вкладке «Ресурсы» (например, Сумма или КоличествоКонечныйОстаток), его нельзя добавлять в колонку «Поля группировки» в настройках структуры отчета. Поля группировки предназначены исключительно для аналитических разрезов (Склад, Номенклатура, Характеристика).
Когда числовой ресурс ошибочно помещают в группировочные поля, платформа 1С выдает предупреждение о невозможности нахождения поля в данной группировке. Вычисляемые показатели должны выводиться только на вкладке «Выбранные поля» соответствующего уровня структуры.
Склад).Склад.КоличествоКонечныйОстаток, Сумма и другие требуемые числовые показатели.Посмотрим на частую ошибку в тексте запроса набора данных. Когда разработчик пытается сгруппировать данные средствами языка запросов прямо в наборе данных, это мешает механизмам СКД выполнять расчет итогов по иерархическим уровням:
// Некорректный подход: избыточная группировка и суммирование цен в запросе
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
ТоварыНаСкладах.Склад КАК Склад,
СУММА(ТоварыНаСкладах.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
СУММА(Цены.Цена) КАК Цена,
ТоварыНаСкладах.КоличествоКонечныйОстаток * Цены.Цена КАК Сумма
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыНаСкладах
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
ПО ТоварыНаСкладах.Номенклатура = Цены.Номенклатура
СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Склад,
ТоварыНаСкладах.Номенклатура,
ТоварыНаСкладах.КоличествоКонечныйОстаток * Цены.Цена
В приведенном запросе присутствуют сразу несколько критических недочетов:
СУММА(Цены.Цена) складывает значения цен по строкам, что лишено экономического смысла.СГРУППИРОВАТЬ ПО дублирует функционал компоновщика и препятствует корректному расчету итогов на разных уровнях иерархии.ВНУТРЕННЕЕ СОЕДИНЕНИЕ приводит к потере остатков товаров, для которых не установлена цена.Перепишем запрос правильно, передав расчет агрегатов полностью под управление СКД:
ВЫБРАТЬ
ТоварыНаСкладах.Склад КАК Склад,
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
ТоварыНаСкладах.Характеристика КАК Характеристика,
ТоварыНаСкладах.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ТоварыНаСкладах.КоличествоПриход КАК КоличествоПриход,
ТоварыНаСкладах.КоличествоРасход КАК КоличествоРасход,
ТоварыНаСкладах.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
Цены.Цена КАК Цена
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыНаСкладах
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
ПО ТоварыНаСкладах.Номенклатура = Цены.Номенклатура
Рассмотрим, как правильно настроить расчет стоимостной оценки остатков в СКД.
Способ через вкладку «Ресурсы»:
КоличествоКонечныйОстаток и укажем выражение:
Сумма(КоличествоКонечныйОстаток)
Сумма и укажем для него выражение с проверкой на NULL:
Сумма(КоличествоКонечныйОстаток * ЕстьNull(Цена, 0))
Цена не следует делать суммируемым ресурсом. При необходимости вывода средней цены на уровне группировки можно использовать формулу:
Выбор
Когда Сумма(КоличествоКонечныйОстаток) = 0 Тогда 0
Иначе Сумма(Сумма) / Сумма(КоличествоКонечныйОстаток)
Конец
Если запрос и ресурсы настроены верно, но итоговые строки все равно не выводятся на экран, проверим параметры макета и пользовательские настройки:
Авто, Конец или Начало и конец (если установлено значение Нет, итоги будут принудительно скрыты платформой).