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

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

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #38252
      Фото аватараOdineski
      Участник

        // Шаг 1: Создаём временную таблицу с дублями
        ВЫБРАТЬ РАЗЛИЧНЫЕ

        Контрагенты.ИНН КАК ИНН,

        Контрагенты.Наименование КАК Наименование,

        МАКСИМУМ(Контрагенты.Ссылка) КАК Ссылка // Берём последнюю запись

        ИЗ

        Справочник.Контрагенты КАК Контрагенты

        СГРУППИРОВАТЬ ПО

        Контрагенты.ИНН,

        Контрагенты.Наименование

        ПОМЕСТИТЬ ВТКонтрагентыБезДублей;

        // Шаг 2: Используем очищенные данные в основном запросе

        ВЫБРАТЬ

        ВТКонтрагентыБезДублей.Наименование КАК Контрагент,

        СУММА(Документ.ПоступлениеТоваровУслуг.СуммаДокумента) КАК СуммаПоступлений

        ИЗ

        ВТКонтрагентыБезДублей КАК ВТКонтрагентыБезДублей

        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

        ПО ВТКонтрагентыБезДублей.Ссылка = ПоступлениеТоваровУслуг.Контрагент

        ГДЕ

        ПоступлениеТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

        СГРУППИРОВАТЬ ПО

        ВТКонтрагентыБезДублей.Наименование

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

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

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

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

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

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

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

          Объяснения:

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

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

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

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

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

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

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

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

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С