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