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

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

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

Разбор механики расчета остатков в СКД

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

  1. Для невременных группировок (например, Контрагент или Склад) остатки суммируются. Если на Складе №1 остаток 10, а на Складе №2 — 20, то общий итог будет 30.
  2. Для временных группировок (Период, Месяц, День) логика иная. Начальный остаток в целом за месяц должен быть равен начальному остатку на первое число этого месяца. Конечный остаток за месяц — остатку на последнее число. Простое суммирование здесь выдаст ложный результат.

Если система «теряет» итоги, значит, она не смогла связать поля начального и конечного остатков в единую логическую пару или не определила хронологический порядок записей.

Шаг 1. Проверка настройки ролей полей

Рассмотрим самую критичную настройку, о которой часто забывают. Откроем вкладку «Наборы данных» в схеме компоновки и обратим внимание на колонку «Роль» для полей остатков.

Выясним причину, по которой СКД может игнорировать итоги. Для корректной работы у полей НачальныйОстаток и КонечныйОстаток должны быть установлены соответствующие типы (Начальный остаток / Конечный остаток). Но этого мало. Критически важно заполнить поле «Имя группы».

Например, если у вас есть пара полей СуммаНачальныйОстаток и СуммаКонечныйОстаток, укажите для них в поле «Группа» одинаковое имя, например, ОсновнаяСумма. Это даст системе понять, что данные поля — это две стороны одной медали, и их нужно обрабатывать совместно при расчете итогов по времени.

Шаг 2. Настройка хронологии (Периоды)

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

Убедимся, что для всех полей периодов, выбранных в запросе (ПериодСекунда, ПериодДень, Регистратор), в ролях проставлены соответствующие флаги:

Шаг 3. Выражения в ресурсах

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

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

Рассмотрим пример кода для выражения ресурса, если стандартная Сумма дает сбой:


// В поле выражения ресурса для Начального остатка
Сумма(НачальныйОстаток)

// В поле выражения ресурса для Конечного остатка
Сумма(КонечныйОстаток)

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

Шаг 4. Обработка NULL и пустых значений

Разберем ситуацию из Сообщения 12: «При отборе по организации, где есть только остатки, итоги есть. Где есть движения — итогов нет». Это явный признак проблем с соединением таблиц внутри виртуальной таблицы или в вашем запросе.

Если за период были движения, которые в итоге дали нулевой остаток, СКД может получить NULL в результате левого соединения. При расчете итогов NULL может «поглотить» остальные значения. Попробуем обезопасить наш запрос. В тексте запроса используем функцию ЕСТЬNULL:


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

Это гарантирует, что в систему компоновки попадут числовые значения, и математические операции над ними пройдут успешно.

Шаг 5. Флаг «Обязательное» в ролях

Иногда СКД применяет механизмы оптимизации: если поле периода не выведено в текущем варианте отчета (в настройках пользователя), система может исключить его из запроса к БД. Но если это поле нужно для правильного расчета остатков, алгоритм сломается.

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

Резюме и проверка

Для того чтобы ваш отчет гарантированно выводил итоги по остаткам, пройдемся по чек-листу:

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

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

← На главную