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

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

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

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

Причина возникновения проблемы

Основная сложность заключается в том, что когда мы используем Левое Соединение или Внутреннее Соединение в консоли запросов, мы заставляем базу данных сопоставить каждую строку остатка с каждой строкой оборота по партии. Если у вас 10 партий, остаток, который должен быть показан один раз, физически дублируется в 10 строках результата запроса. СКД, суммируя эти строки, выдает неверный результат.

Решение: переход от соединения к объединению

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

Рассмотрим структуру наших наборов данных:

  1. Первый набор (Остатки): Здесь мы выбираем номенклатуру, склад и НачКол / КонКол. Поле «Партия» в этом запросе мы принудительно делаем NULL или пустым значением.
  2. Второй набор (Обороты): Здесь мы выбираем номенклатуру, склад и партию, а в полях остатков ставим 0, так как эти остатки нам нужны только в разрезе партий (или мы их не учитываем в детализации партий, чтобы избежать суммирования).

Пример структуры запросов для объединения:


// Набор 1: Остатки
ВЫБРАТЬ
    Номенклатура,
    Склад,
    NULL КАК Партия,
    НачКол,
    КонКол,
    0 КАК ПриходКол,
    0 КАК РасходКол
ИЗ
    ВТ_Остатки

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

// Набор 2: Обороты
ВЫБРАТЬ
    Номенклатура,
    Склад,
    Партия,
    0,
    0,
    ПриходКол,
    РасходКол
ИЗ
    ВТ_Обороты

Почему этот метод эффективен?

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

Альтернативные подходы в СКД

Помимо прямого объединения в запросе, существуют и другие методы настройки отчета:

Рекомендации по реализации

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

Помните, что аккуратная подготовка данных на уровне запроса — это 90% успеха в разработке качественных и точных отчетов на СКД!

← На главную