Часто при разработке отчетов на СКД мы сталкиваемся с неприятной математической ошибкой: при попытке вывести остатки товаров вместе с детализацией по партиям, итоговые суммы начальных и конечных остатков начинают «размножаться». Это происходит из-за того, что механизм соединения таблиц в запросе привязывает остатки к каждой записи партии, в результате чего одна и та же сумма остатка прибавляется столько раз, сколько партий было у товара.
Рассмотрим, как правильно организовать данные, чтобы получить как сводную информацию по номенклатуре, так и детальную по партиям, сохранив при этом точность итоговых показателей.
Основная сложность заключается в том, что когда мы используем Левое Соединение или Внутреннее Соединение в консоли запросов, мы заставляем базу данных сопоставить каждую строку остатка с каждой строкой оборота по партии. Если у вас 10 партий, остаток, который должен быть показан один раз, физически дублируется в 10 строках результата запроса. СКД, суммируя эти строки, выдает неверный результат.
Чтобы избежать этой ловушки, давайте сменим стратегию. Вместо того чтобы пытаться «склеить» две таблицы в одну громоздкую структуру, мы используем принцип ОБЪЕДИНИТЬ ВСЕ. Мы подготовим два набора данных, где показатели будут разнесены по разным колонкам, и СКД сама корректно свернет их при выводе.
Рассмотрим структуру наших наборов данных:
НачКол / КонКол. Поле «Партия» в этом запросе мы принудительно делаем NULL или пустым значением.0, так как эти остатки нам нужны только в разрезе партий (или мы их не учитываем в детализации партий, чтобы избежать суммирования).Пример структуры запросов для объединения:
// Набор 1: Остатки
ВЫБРАТЬ
Номенклатура,
Склад,
NULL КАК Партия,
НачКол,
КонКол,
0 КАК ПриходКол,
0 КАК РасходКол
ИЗ
ВТ_Остатки
ОБЪЕДИНИТЬ ВСЕ
// Набор 2: Обороты
ВЫБРАТЬ
Номенклатура,
Склад,
Партия,
0,
0,
ПриходКол,
РасходКол
ИЗ
ВТ_Обороты
Когда вы используете ОБЪЕДИНИТЬ ВСЕ, вы получаете «плоский» список. СКД при расчете ресурсов Сумма(НачКол) и Сумма(КонКол) будет видеть только одну запись с остатками для каждой номенклатуры (так как во втором запросе там нули) и множество записей с оборотами для партий. Таким образом, суммирование остатков пройдет только по той строке, где поле «Партия» пустое.
Помимо прямого объединения в запросе, существуют и другие методы настройки отчета:
Номенклатура и Склад. В таком случае СКД сама будет «подтягивать» остатки к детальным записям, минимизируя риск дублирования.ВычислитьВыражение. С её помощью можно принудительно брать значение остатка только из первой записи в группе, игнорируя остальные строки, что также предотвращает эффект «размножения» цифр.Мы рекомендуем начать с метода ОБЪЕДИНИТЬ ВСЕ, так как он наиболее прозрачен для отладки и требует меньше всего ресурсов сервера. При настройке ресурсов в СКД убедитесь, что вы правильно настроили группировки, по которым должна происходить суммация. Если отчет выводит иерархию, убедитесь, что ресурсы рассчитаны для всех необходимых уровней группировки (например, и по Номенклатуре, и по Партии).
Помните, что аккуратная подготовка данных на уровне запроса — это 90% успеха в разработке качественных и точных отчетов на СКД!