База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в запросах 1С устранить дубли и корректно суммировать данные? › Ответ в теме: Как в запросах 1С устранить дубли и корректно суммировать данные?
В вашем запросе есть несколько важных моментов, которые нужно поправить для корректной работы и устранения дублей:
1. В первом шаге вы группируете по ИНН и Наименованию, а берёте максимум по Ссылке. Это не всегда корректно, т.к. у одного ИНН может быть несколько контрагентов с разными наименованиями, и вы получите несколько записей с одинаковым ИНН, но разным наименованием.
2. Во втором шаге вы группируете только по Наименованию, а в выборке берёте сумму по документам, соединённым по ссылке контрагента из временной таблицы. Это может привести к ошибкам, если в ВТКонтрагентыБезДублей несколько записей с одинаковым наименованием.
3. В условии WHERE вы используете фильтр по дате документа, но при левом соединении это условие фактически превращается в фильтр на всю выборку, что может привести к пропуску контрагентов без документов в периоде.
Правильный вариант с учётом устранения дублей и корректного фильтра по дате:
|ВЫБРАТЬ
| Контрагенты.ИНН КАК ИНН,
| МАКСИМУМ(Контрагенты.Ссылка) КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ИНН ПУСТО
|СГРУППИРОВАТЬ ПО
| Контрагенты.ИНН
|ПОМЕСТИТЬ ВТКонтрагентыБезДублей;
|
|ВЫБРАТЬ
| Контрагенты.Наименование КАК Контрагент,
| СУММА(ПоступлениеТоваровУслуг.СуммаДокумента) КАК СуммаПоступлений
|ИЗ
| ВТКонтрагентыБезДублей КАК ВТКонтрагентыБезДублей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО ВТКонтрагентыБезДублей.Ссылка = Контрагенты.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
| ПО ВТКонтрагентыБезДублей.Ссылка = ПоступлениеТоваровУслуг.Контрагент
| И ПоступлениеТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|СГРУППИРОВАТЬ ПО
| Контрагенты.Наименование
Объяснения:
— В первой части выбираем уникальные контрагенты по ИНН, берём максимальную ссылку (последнюю по внутреннему порядку).
— Во второй части соединяем с полным справочником контрагентов по ссылке, чтобы получить корректное наименование.
— Левое соединение с документами с условием по дате в ON, а не в WHERE, чтобы не отфильтровывать контрагентов без документов.
— Группируем по наименованию контрагента.
Если хотите, чтобы в выборке были все контрагенты, даже без поступлений, то такой подход корректен.
Если нужно учитывать наименование, которое может меняться, то лучше брать наименование из справочника по ссылке, а не из группировки.
Если у вас есть конкретные требования по выбору дублей (например, по дате создания контрагента), то можно усложнить запрос.
Рекомендую посмотреть здесь, как правильно работать с дублями и временными таблицами в запросах 1С: