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

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

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

Метод первый: использование объединения запросов

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

  1. Создадим запрос, который будет состоять из двух частей, соединенных через ОБЪЕДИНИТЬ ВСЕ.
  2. В каждой части запроса мы будем обращаться к виртуальной таблице Остатки, задавая жесткий параметр даты для каждого из периодов.
  3. В результате выполнения такого запроса мы получим таблицу с полями, например: Номенклатура, ПериодОстатка (как идентификатор периода), ЗначениеОстатка.

В такой структуре ЗначениеОстатка перестает быть системным «остатком», требующим специальных ролей, и становится обычным числовым ресурсом. Это исключает дублирование и неверные расчеты при группировке.

Метод второй: отказ от ролей для полей остатков

Если логика вашего отчета позволяет, попробуйте просто убрать роли у полей с остатками. Зачастую в СКД «лишняя» интеллектуальность системы только мешает. Если вы уже получили готовые значения из запроса:


ВЫБРАТЬ
    ТоварыОстатки.Номенклатура КАК Номенклатура,
    ТоварыОстатки.КоличествоОстаток КАК ОстатокПериод1,
    0 КАК ОстатокПериод2
ИЗ
    РегистрНакопления.Товары.Остатки(&Дата1, ) КАК ТоварыОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ТоварыОстатки.Номенклатура,
    0,
    ТоварыОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.Товары.Остатки(&Дата2, ) КАК ТоварыОстатки

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

Метод третий: использование внешнего набора данных

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

  1. В модуле отчета или менеджере сформируйте ТаблицуЗначений программно.
  2. Заполните её данными так, чтобы каждой строке (например, Номенклатуре) соответствовали колонки с рассчитанными остатками на разные даты.
  3. Передайте эту таблицу в СКД как отдельный набор данных.

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

Важные советы по настройке группировок

При работе с двумя периодами помните о следующем:

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

← На главную