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

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

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

Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам, как правильно настроить схему компоновки данных для корректного вывода итогов и расчета производных показателей.

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

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

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

Правильная настройка вычисляемых полей и расчета процентов

Частая ошибка при попытке посчитать коэффициент или процент (например, отношение расхода к приходу) — попытка использовать функции агрегации и вычисления итогов непосредственно в выражении вычисляемого поля на закладке Вычисляемые поля:


// Такой вызов в вычисляемом поле приведет к ошибке компоновки:
Вычислить("Сумма(СуммаВзаиморасчетовРасход)","ОбщийИтог") / Вычислить("Сумма(СуммаВзаиморасчетовПриход)","ОбщийИтог")

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

Разберем два правильных способа решения этой задачи.

Способ 1. Расчет через выражение ресурса (Рекомендуемый)

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

Пошаговый алгоритм настройки:

  1. Перейдем на закладку Вычисляемые поля и добавим новое поле, например ПроцентЗахода. Поле выражения в таблице вычисляемых полей можно оставить пустым или указать простое деление полей без функций суммирования.
  2. Перейдем на закладку Ресурсы и добавим созданное поле ПроцентЗахода.
  3. В колонке Выражение напишем формулу расчета суммы ресурсов с защитой от деления на ноль:

ВЫБОР 
    КОГДА Сумма(СуммаВзаиморасчетовПриход) = 0 ТОГДА 0 
    ИНАЧЕ (Сумма(СуммаВзаиморасчетовРасход) / Сумма(СуммаВзаиморасчетовПриход)) * 100 
КОНЕЦ

В колонке Рассчитывать по... укажем конкретную группировку (например, ОсновнойМенеджерПокупателя) или оставим поле пустым, чтобы расчет выполнялся для всех уровней иерархии и общего итога.

Способ 2. Использование функции ВычислитьВыражение

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

Формула ресурса в этом случае будет выглядеть следующим образом:


ВычислитьВыражение(
    "Сумма(СуммаВзаиморасчетовРасход) / Выбор Когда Сумма(СуммаВзаиморасчетовПриход) = 0 Тогда 1 Иначе Сумма(СуммаВзаиморасчетовПриход) Конец",
    "ОсновнойМенеджерПокупателя",
    "Группировка"
)

Сравним два подхода: использование прямого выражения ресурса (Способ 1) предпочтительнее с точки зрения гибкости и производительности. Функция ВычислитьВыражение с жестким указанием имени группировки при перенастройке структуры пользователем (например, если пользователь отключит группировку по менеджеру и добавит группировку по контрагенту) перестанет вычислять результат или выдаст ошибку исполнения.

Чек-лист проверки отчета, если не выводятся итоги

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