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

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

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

Причина 1. Попытка поместить ресурс в состав полей группировки

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

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

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

Причина 2. Наличие агрегатных функций и секции «СГРУППИРОВАТЬ ПО» в запросе набора данных

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


// Некорректный подход: избыточная группировка и суммирование цен в запросе
ВЫБРАТЬ
	ТоварыНаСкладах.Номенклатура КАК Номенклатура,
	ТоварыНаСкладах.Склад КАК Склад,
	СУММА(ТоварыНаСкладах.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
	СУММА(Цены.Цена) КАК Цена,
	ТоварыНаСкладах.КоличествоКонечныйОстаток * Цены.Цена КАК Сумма
ИЗ
	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыНаСкладах
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
		ПО ТоварыНаСкладах.Номенклатура = Цены.Номенклатура
СГРУППИРОВАТЬ ПО
	ТоварыНаСкладах.Склад,
	ТоварыНаСкладах.Номенклатура,
	ТоварыНаСкладах.КоличествоКонечныйОстаток * Цены.Цена

В приведенном запросе присутствуют сразу несколько критических недочетов:

  1. Конструкция СУММА(Цены.Цена) складывает значения цен по строкам, что лишено экономического смысла.
  2. Секция СГРУППИРОВАТЬ ПО дублирует функционал компоновщика и препятствует корректному расчету итогов на разных уровнях иерархии.
  3. Использование ВНУТРЕННЕЕ СОЕДИНЕНИЕ приводит к потере остатков товаров, для которых не установлена цена.

Перепишем запрос правильно, передав расчет агрегатов полностью под управление СКД:


ВЫБРАТЬ
	ТоварыНаСкладах.Склад КАК Склад,
	ТоварыНаСкладах.Номенклатура КАК Номенклатура,
	ТоварыНаСкладах.Характеристика КАК Характеристика,
	ТоварыНаСкладах.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
	ТоварыНаСкладах.КоличествоПриход КАК КоличествоПриход,
	ТоварыНаСкладах.КоличествоРасход КАК КоличествоРасход,
	ТоварыНаСкладах.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
	Цены.Цена КАК Цена
ИЗ
	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыНаСкладах
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
		ПО ТоварыНаСкладах.Номенклатура = Цены.Номенклатура

Причина 3. Неправильная настройка выражений ресурсов и вычисляемых полей

Рассмотрим, как правильно настроить расчет стоимостной оценки остатков в СКД.

Способ через вкладку «Ресурсы»:

  1. Откроем вкладку «Ресурсы» схемы компоновки данных.
  2. Добавим поле КоличествоКонечныйОстаток и укажем выражение: Сумма(КоличествоКонечныйОстаток)
  3. Добавим поле Сумма и укажем для него выражение с проверкой на NULL: Сумма(КоличествоКонечныйОстаток * ЕстьNull(Цена, 0))
  4. Поле Цена не следует делать суммируемым ресурсом. При необходимости вывода средней цены на уровне группировки можно использовать формулу:
    
    Выбор 
    	Когда Сумма(КоличествоКонечныйОстаток) = 0 Тогда 0 
    	Иначе Сумма(Сумма) / Сумма(КоличествоКонечныйОстаток) 
    Конец
    

Причина 4. Параметры отображения итогов и кэширование настроек

Если запрос и ресурсы настроены верно, но итоговые строки все равно не выводятся на экран, проверим параметры макета и пользовательские настройки:

  1. На вкладке «Настройки» выделим корневой элемент «Отчет» и перейдем на вкладку «Другие настройки».
  2. Проверим параметр «Расположение итогов»: он должен быть установлен в значение Авто, Конец или Начало и конец (если установлено значение Нет, итоги будут принудительно скрыты платформой).
  3. Проверим свойство «Расположение полей группировок».
  4. При тестировании в режиме «1С:Предприятие» обязательно выполним команду «Еще» → «Установить стандартные настройки», так как платформа часто сохраняет старый пользовательский вариант настроек отчета, не подтягивая изменения структуры из схемы.
← На главную