При разработке отчетов в Системе компоновки данных (СКД) начинающие разработчики часто сталкиваются с ситуацией, когда итоговые суммы по числовым полям (например, СуммаАктив или СуммаПассив) выводятся неверно — они могут увеличиваться в два, четыре или более раз. Разберем эту ситуацию на конкретном примере построения отчета по арбитражным делам, где необходимо вывести данные из двух разных документов: «Актив» и «Пассив».
Проанализируем типичную ошибку в структуре запроса. Когда нам нужно получить данные из двух разных таблиц (активы и пассивы), связанных общим измерением (например, АрбитражноеДело или Проект), первой мыслью часто бывает использование механизма соединений (JOIN). Рассмотрим пример проблемного запроса:
ВЫБРАТЬ
Актив.Сумма КАК СуммаАктив,
Актив.Наименование КАК Актив,
Пассив.Сумма КАК СуммаПассив
ИЗ
Документ.Актив КАК Актив
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Пассив КАК Пассив
ПО Актив.Проект = Пассив.Проект
В чем заключается проблема: механизм соединения работает по принципу «каждый с каждым» внутри условия связи. Если по одному и тому же проекту у нас есть два документа актива и два документа пассива, система создаст в результирующей таблице четыре строки (2 актива * 2 пассива = 4 комбинации). В результате СКД просуммирует значения в этих строках, и вы увидите итог, завышенный в несколько раз. Это явление называется «декартовым произведением».
Рассмотрим правильный подход к построению запроса для таких случаев. Вместо того чтобы пытаться «склеить» строки актива и пассива по горизонтали, мы должны расположить их друг под другом в одной выборке, используя оператор ОБЪЕДИНИТЬ ВСЕ (или UNION ALL). При этом для отсутствующих данных в каждой части объединения мы будем подставлять пустые значения или нули.
Разберем по шагам структуру правильного запроса:
ВЫБРАТЬ
Актив.Проект КАК АрбитражноеДело,
Актив.Ссылка КАК Документ,
"Актив" КАК Вид,
Актив.Сумма КАК СуммаАктив,
0 КАК СуммаПассив
ИЗ
Документ.Актив КАК Актив
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Пассив.Проект,
Пассив.Ссылка,
"Пассив",
0,
Пассив.Сумма
ИЗ
Документ.Пассив КАК Пассив
Проанализируем преимущества этого метода:
Вид или просто разносим суммы по разным колонкам (СуммаАктив и СуммаПассив).СУММА) отработают правильно.После того как мы написали правильный запрос, необходимо корректно настроить схему компоновки данных, чтобы отчет выглядел структурировано. Рассмотрим, как это сделать:
Во-первых, перейдем на вкладку «Ресурсы». Здесь мы должны указать поля СуммаАктив и СуммаПассив. В колонке «Выражение» используем стандартную агрегатную функцию Сумма(СуммаАктив). Это позволит СКД автоматически подсчитывать итоги по группировкам и общие итоги по отчету.
Во-вторых, настроим вкладку «Настройки». Для получения иерархического вида выполним следующие действия:
АрбитражноеДело.Документ (или Наименование).СуммаАктив и СуммаПассив.Посмотрим на важный нюанс использования NULL против 0. В запросах часто пишут NULL КАК СуммаПассив. Однако для СКД и последующих вычислений лучше использовать 0. Если вы захотите создать вычисляемое поле (например, «Разница»), то формула СуммаАктив - СуммаПассив вернет NULL, если хотя бы одно из полей будет содержать NULL. Использование нуля гарантирует математическую корректность.
Если стоит задача вывести активы и пассивы в одну строку по конкретному делу, но при этом сохранить детализацию, мы можем использовать элемент настроек СКД «Таблица». Посмотрим, как это реализовать:
1. В строки таблицы добавим группировку АрбитражноеДело.
2. В колонки таблицы добавим группировку по полю Вид (которое мы создали в запросе).
3. В качестве ресурсов выберем общее поле суммы (если оно одно) или наши раздельные поля.
Такой подход позволит системе динамически создавать колонки для активов и пассивов, аккуратно сворачивая данные по строке арбитражного дела.
Для глубокого понимания механизмов компоновки данных и языка запросов рекомендуем обратить внимание на следующие аспекты:
АрбитражноеДело как обязательное измерение, что поможет СКД при более сложных связях нескольких наборов данных.Регистров Накопления или Регистров Бухгалтерии. Использование виртуальных таблиц ОстаткиИОбороты автоматически решает многие проблемы с группировкой и скоростью работы отчета.Таким образом, мы выяснили, что основной причиной неверных сумм является некорректное использование связей между таблицами. Использование ОБЪЕДИНИТЬ ВСЕ в сочетании с правильной настройкой ресурсов — это «золотой стандарт» для построения надежных финансовых отчетов в 1С.