Как в СКД вывести срез остатка на уровне группировки вместо суммы строк

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

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

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

Способ 1. Использование встроенных ролей полей СКД (рекомендуемый)

Проанализируем стандартный и самый надежный механизм платформы 1С. Если данные формируются на основе виртуальной таблицы регистра накопления ОстаткиИОбороты, платформа умеет автоматически рассчитывать остатки на любом уровне группировки без сложных формул.

Для правильной работы механизма выполним следующие шаги:

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

    Для поля начального остатка установим тип роли НачальныйОстаток, для поля конечного остатка — КонечныйОстаток. Обязательно свяжем их одним именем группы остатков.

    Для полей периодов укажем роль Период с порядковыми номерами (например, Период — номер 1, Регистратор — номер 2).

  3. На вкладке Ресурсы укажем для ресурса конечного остатка стандартное выражение Сумма(КонечныйОстаток).

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

Способ 2. Вычисление значения последней строки через ВычислитьВыражение

Рассмотрим ситуацию, когда колонка итога формируется вычисляемым выражением или нарастающим итогом. Чтобы в строке группировки Контрагент получить значение ресурса Итог из последней подчиненной строки, настроим вкладку Ресурсы.

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

Разберем правильный синтаксис формулы ресурса для поля Итог:

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

Важный нюанс: если в один и тот же момент времени по контрагенту проведено несколько документов, сортировки только по полю Период может быть недостаточно. Рекомендуется включать в сортировку поля ПериодСекунда, МоментВремени или НомерСтроки для однозначного определения финальной записи.

Способ 3. Получение среза через отдельный набор данных

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

Разберем по шагам создание схемы с двумя наборами данных:

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

    Ведущий набор — НаборДанных1, ведомый — НаборДанных2.

    Поле связи: Контрагент = Контрагент.

    В колонке Параметры передаем дату отчета или максимальную дату выборки в параметр виртуальной таблицы второго набора данных.

  4. На вкладке Ресурсы для поля остатка указываем выражение Сумма(Остаток) и ограничиваем его расчет только группировкой Контрагент.

Таким образом, в детальных строках выводятся операции с нарастающим итогом, а на уровне заголовка контрагента выводится точный срез остатка из второго набора данных.

← На главную