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

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

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

Выясняем причины дублирования

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

Метод №1: Перенос полей в ресурсы

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

Чтобы заставить отчет «свернуться»:

  1. Откройте вкладку Ресурсы в редакторе схемы компоновки данных.
  2. Перенесите все числовые поля, которые вы хотите видеть в отчете, в список ресурсов.
  3. Убедитесь, что для этих полей выбрана функция агрегации, например, Сумма().

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

Метод №2: Оптимизация запросов и соединений

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

Давайте посмотрим на примере, как должна выглядеть логика:


// Вместо прямого соединения, которое множит строки:
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Товар,
    ПродажиОбороты.КоличествоОборот КАК Кол
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ПО Номенклатура.Ссылка = ПродажиОбороты.Номенклатура

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

Проверка структуры вывода

Часто проблема скрывается не в запросе, а в настройках самого отчета. Зайдите на вкладку Настройки вашего отчета:

  1. Проверьте Структуру отчета. Если у вас там указаны детальные записи, попробуйте их отключить или заменить на Группировки.
  2. Иногда лишние группировки по полям, которые имеют разные значения в дублирующих строках (например, Регистратор), принудительно разворачивают отчет. Удалите все лишние группировки, оставьте только необходимые для вашего отчета поля.

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

← На главную