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

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

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

Решение 1: Использование объединения запросов (UNION ALL)

Самый простой и понятный способ избежать дублей — не использовать соединения в запросе, а объединить два набора данных в один общий поток. Мы соберем данные о продажах и возвратах в одну виртуальную таблицу, где для каждого вида операции будет стоять своя сумма, а другая будет занулена.

Рассмотрим пример запроса для такой структуры:


ВЫБРАТЬ
    Док.Контрагент КАК Контрагент,
    Док.СуммаДокумента КАК СуммаПродаж,
    0 КАК СуммаВозврата,
    НАЧАЛОПЕРИОДА(Док.Дата, МЕСЯЦ) КАК Дата
ИЗ
    Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
    Док.Проведен

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

ВЫБРАТЬ
    Док.Контрагент,
    0,
    Док.СуммаДокумента,
    НАЧАЛОПЕРИОДА(Док.Дата, МЕСЯЦ)
ИЗ
    Документ.ВозвратТоваровОтКлиента КАК Док
ГДЕ
    Док.Проведен

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

Решение 2: Использование регистров накопления (Профессиональный подход)

Хотя объединение документов работает, оно не учитывает все нюансы учета в УТ 11 (например, корректировки реализаций, розничные продажи, акты). Профессиональный метод заключается в использовании регистра накопления ВыручкаИСебестоимостьПродаж.

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

  1. Система уже подготовила итоговые обороты, что значительно ускоряет формирование отчета.
  2. Регистр аккумулирует данные из всех типов документов.
  3. Мы можем использовать логику определения знака суммы прямо в запросе.

Разберем пример запроса к оборотам регистра:


ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(Обороты.Период, МЕСЯЦ) КАК Период,
    Обороты.АналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
    ВЫБОР
        КОГДА Обороты.СуммаВыручкиОборот > 0 ТОГДА Обороты.СуммаВыручкиОборот
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаПродаж,
    ВЫБОР
        КОГДА Обороты.СуммаВыручкиОборот < 0 ТОГДА -Обороты.СуммаВыручкиОборот
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаВозврата
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(,, Регистратор,) КАК Обороты

Используя конструкцию ВЫБОР КОГДА, мы элегантно разделяем положительный оборот (выручку) и отрицательный (возвраты), что позволяет легко выводить их в разные колонки отчета.

Основные рекомендации при разработке отчетов

Чтобы отчет всегда работал корректно, придерживайтесь следующих правил:

Развитие навыков программирования в 1С — это постепенный процесс. Не бойтесь экспериментировать с запросами, анализировать структуру базы через Консоль запросов и постепенно переходить от простых выборок к работе с регистрами накопления, которые являются сердцем учета в конфигурации УТ 11.

← На главную