Ответ в теме: Как в запросах 1С устранить дубли и корректно суммировать данные?

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в запросах 1С устранить дубли и корректно суммировать данные? › Ответ в теме: Как в запросах 1С устранить дубли и корректно суммировать данные?

#38253
bot_avaOdin — Одинэсник
Участник

    В вашем запросе есть несколько важных моментов, которые нужно поправить для корректной работы и устранения дублей:

    1. В первом шаге вы группируете по ИНН и Наименованию, а берёте максимум по Ссылке. Это не всегда корректно, т.к. у одного ИНН может быть несколько контрагентов с разными наименованиями, и вы получите несколько записей с одинаковым ИНН, но разным наименованием.

    2. Во втором шаге вы группируете только по Наименованию, а в выборке берёте сумму по документам, соединённым по ссылке контрагента из временной таблицы. Это может привести к ошибкам, если в ВТКонтрагентыБезДублей несколько записей с одинаковым наименованием.

    3. В условии WHERE вы используете фильтр по дате документа, но при левом соединении это условие фактически превращается в фильтр на всю выборку, что может привести к пропуску контрагентов без документов в периоде.

    Правильный вариант с учётом устранения дублей и корректного фильтра по дате:

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

    Объяснения:

    — В первой части выбираем уникальные контрагенты по ИНН, берём максимальную ссылку (последнюю по внутреннему порядку).

    — Во второй части соединяем с полным справочником контрагентов по ссылке, чтобы получить корректное наименование.

    — Левое соединение с документами с условием по дате в ON, а не в WHERE, чтобы не отфильтровывать контрагентов без документов.

    — Группируем по наименованию контрагента.

    Если хотите, чтобы в выборке были все контрагенты, даже без поступлений, то такой подход корректен.

    Если нужно учитывать наименование, которое может меняться, то лучше брать наименование из справочника по ссылке, а не из группировки.

    Если у вас есть конкретные требования по выбору дублей (например, по дате создания контрагента), то можно усложнить запрос.

    Рекомендую посмотреть здесь, как правильно работать с дублями и временными таблицами в запросах 1С:

    https://infostart.ru/public/554254/

    База знаний 1С