Проблема отсутствия итогов по остаткам при использовании временных группировок (например, по месяцам) в Системе компоновки данных (СКД) является классической «ловушкой» для разработчиков. В отличие от простых числовых ресурсов, таких как «Продажи» или «Количество», остатки требуют строгого соблюдения правил работы с временной осью. Если система не понимает, как соотнести значения ресурсов с иерархией периодов, она просто оставляет поля итогов пустыми или выводит некорректные данные. Рассмотрим подробно, почему так происходит и как заставить СКД корректно считать итоги.
Прежде всего, проанализируем, как СКД обрабатывает ресурсы. Для обычных полей система использует простое агрегирование (сумма, максимум и т.д.). Однако для остатков 1С применяет специальную логику: остаток на начало периода — это остаток на начало первой вложенной записи, а остаток на конец — на конец последней. Если мы группируем данные по ПериодМесяц, и эта группировка стоит выше, чем Контрагент, СКД пытается применить правила временных интервалов.
Если в схеме компоновки данных для полей остатка не настроены Роли, система не видит связи между числом и временем. Чтобы исправить это, выполним следующие шаги:
НачальныйОстаток и КонечныйОстаток.Начальный остаток, для другого — Конечный остаток.ПериодСекунда или ПериодДень).Посмотрим на ситуацию, когда ПериодМесяц является родительской группировкой. По умолчанию СКД считает, что на уровне месяца нужно показать остаток на начало этого месяца. Но если пользователь хочет увидеть сумму остатков всех контрагентов за этот месяц, возникает конфликт логики. СКД «думает», что вы просите остаток по периоду, а вы хотите сумму по разрезу. Если настройки ролей не идеальны или в запросе отсутствуют детальные периоды (секунды, регистраторы), итог может пропасть.
Проанализируем ситуацию: если мы убираем группировку по месяцу и итоги появляются — значит, проблема именно в сопоставлении временной шкалы и аналитики Контрагент. Чтобы принудительно заставить систему складывать остатки по контрагентам внутри периода, нам придется использовать продвинутые функции компоновки.
Если стандартные механизмы ролей не помогают, воспользуемся мощным инструментом — функцией ВычислитьВыражениеСГруппировкойМассив. Этот метод позволяет нам сначала вычислить итоги на уровне подчиненной группировки (Контрагент), собрать их в массив, а затем просуммировать этот массив на уровне родительской группировки (Месяц).
Перейдем на закладку Ресурсы и для поля НачальныйОстаток вместо простого выражения Сумма(НачальныйОстаток) пропишем следующее:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(НачальныйОстаток)", "Контрагент"))
Что здесь происходит? Разберем по шагам:
Сумма(НачальныйОстаток) вычисляет остаток для каждого контрагента.ВычислитьВыражениеСГруппировкойМассив обходит всех контрагентов внутри текущего месяца и формирует из их итогов массив чисел.Сумма(...) складывает все элементы этого массива.Это гарантирует, что на уровне месяца мы получим математическую сумму остатков всех контрагентов, независимо от того, как настроены временные роли в СКД.
Часто ошибка кроется в том, что разработчики забывают указать, для каких именно группировок должно применяться выражение ресурса. Посмотрим на вкладку Ресурсы. Если у вас одна строка для поля НачальныйОстаток, убедитесь, что в колонке Рассчитывать по... либо ничего не выбрано (тогда расчет идет по всем уровням), либо отмечены все необходимые группировки, включая ПериодМесяц и Общий итог.
Иногда полезно разделить расчеты. Например:
Контрагент оставить простое выражение: Сумма(НачальныйОстаток).ПериодМесяц и Общий итог создать отдельную строку в ресурсах и использовать там функцию ВычислитьВыражениеСГруппировкойМассив.СКД крайне чувствительна к наличию полей периода в наборе данных. Если в вашем запросе выбирается только ПериодМесяц, системе может не хватать данных для корректного «схлопывания» остатков. Рассмотрим рекомендации по построению запроса:
ПериодСекунда или Регистратор).Период, Порядок 1, Период, Порядок 2 и так далее).Регистратор в отчет, его присутствие в наборе данных с правильно настроенной ролью часто является ключом к появлению итогов по остаткам.Проанализируем ситуацию с использованием виртуальных таблиц. Если данные берутся из таблицы ОстаткиИОбороты, важно помнить, как 1С работает с методом дополнения периодов. Если в каком-то месяце по конкретному контрагенту не было движений, СКД может не выводить строку, и, как следствие, итог по месяцу может быть неполным или отсутствовать. В настройках виртуальной таблицы обратите внимание на параметры периодичности и убедитесь, что роли полей периода в СКД соответствуют выбранной периодичности в запросе.
Подведем итог: если у вас пропадают итоги по остаткам при добавлении группировки по периоду, сначала проверьте Роли полей (связь начала и конца остатка через общее имя и указание поля периода). Если это не помогает, используйте расчет через ВычислитьВыражениеСГруппировкойМассив на закладке ресурсов. Это наиболее надежный способ получить предсказуемый результат в сложных отчетах.