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