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

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

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

Выясним причину: почему суммы «размножаются»?

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


ВЫБРАТЬ
    Актив.Сумма КАК СуммаАктив,
    Актив.Наименование КАК Актив,
    Пассив.Сумма КАК СуммаПассив
ИЗ
    Документ.Актив КАК Актив
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Пассив КАК Пассив
    ПО Актив.Проект = Пассив.Проект

В чем заключается проблема: механизм соединения работает по принципу «каждый с каждым» внутри условия связи. Если по одному и тому же проекту у нас есть два документа актива и два документа пассива, система создаст в результирующей таблице четыре строки (2 актива * 2 пассива = 4 комбинации). В результате СКД просуммирует значения в этих строках, и вы увидите итог, завышенный в несколько раз. Это явление называется «декартовым произведением».

Решение №1: Использование ОБЪЕДИНИТЬ ВСЕ вместо соединений

Рассмотрим правильный подход к построению запроса для таких случаев. Вместо того чтобы пытаться «склеить» строки актива и пассива по горизонтали, мы должны расположить их друг под другом в одной выборке, используя оператор ОБЪЕДИНИТЬ ВСЕ (или UNION ALL). При этом для отсутствующих данных в каждой части объединения мы будем подставлять пустые значения или нули.

Разберем по шагам структуру правильного запроса:


ВЫБРАТЬ
    Актив.Проект КАК АрбитражноеДело,
    Актив.Ссылка КАК Документ,
    "Актив" КАК Вид,
    Актив.Сумма КАК СуммаАктив,
    0 КАК СуммаПассив
ИЗ
    Документ.Актив КАК Актив

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Пассив.Проект,
    Пассив.Ссылка,
    "Пассив",
    0,
    Пассив.Сумма
ИЗ
    Документ.Пассив КАК Пассив

Проанализируем преимущества этого метода:

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

Решение №2: Настройка ресурсов и группировок в СКД

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

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

Во-вторых, настроим вкладку «Настройки». Для получения иерархического вида выполним следующие действия:

  1. Добавим группировку по полю АрбитражноеДело.
  2. Внутри этой группировки добавим детальные записи или вторую группировку по полю Документ (или Наименование).
  3. В выбранные поля добавим СуммаАктив и СуммаПассив.

Посмотрим на важный нюанс использования NULL против 0. В запросах часто пишут NULL КАК СуммаПассив. Однако для СКД и последующих вычислений лучше использовать 0. Если вы захотите создать вычисляемое поле (например, «Разница»), то формула СуммаАктив - СуммаПассив вернет NULL, если хотя бы одно из полей будет содержать NULL. Использование нуля гарантирует математическую корректность.

Как настроить внешний вид «как в балансе»?

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

1. В строки таблицы добавим группировку АрбитражноеДело.

2. В колонки таблицы добавим группировку по полю Вид (которое мы создали в запросе).

3. В качестве ресурсов выберем общее поле суммы (если оно одно) или наши раздельные поля.

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

Дополнительные рекомендации по изучению СКД

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

Таким образом, мы выяснили, что основной причиной неверных сумм является некорректное использование связей между таблицами. Использование ОБЪЕДИНИТЬ ВСЕ в сочетании с правильной настройкой ресурсов — это «золотой стандарт» для построения надежных финансовых отчетов в 1С.

← На главную