Как в СКД вывести начальные и конечные остатки, если данные берутся не из регистров?

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

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

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

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

  1. Соберите все необходимые данные (приходы и расходы) в таблицу значений в модуле отчета.
  2. Отсортируйте полученную таблицу по периодам и контрагентам.
  3. Используйте цикл для прохода по строкам таблицы значений. В каждой итерации вычисляйте текущий остаток по формуле: НачальныйОстаток + Приход - Расход.
  4. Передайте итоговую таблицу значений в СКД как внешний набор данных.

Рассмотрим пример логики заполнения данных:


// Предположим, у нас есть ТЗ с колонками Период, Контрагент, Приход, Расход
// Сортируем данные
ТЗ.Сортировать("Контрагент, Период");

ТекущийОстаток = 0;
Для Каждого Строка Из ТЗ Цикл
    Строка.НачальныйОстаток = ТекущийОстаток;
    ТекущийОстаток = ТекущийОстаток + Строка.Приход - Строка.Расход;
    Строка.КонечныйОстаток = ТекущийОстаток;
КонецЦикла;

Такой подход гарантирует 100% точность, так как вы сами управляете алгоритмом накопления и не зависите от ограничений СКД.

Способ 2: Использование дополнительного набора данных «Остатки»

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

Разберем процесс по шагам:

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

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

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

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

Вы можете добавить Вычисляемое поле с выражением:

Для расчета остатка используйте функцию:

ВычислитьВыражение("Сумма(Приход) - Сумма(Расход)", , "Группировка", "Первая", "Предыдущая")

Важные замечания по этому методу:

Итоговые рекомендации

Выбирая метод реализации, ориентируйтесь на объем данных и сложность логики:

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

← На главную