Всем привет)
Ломаю голову, вроде над простой задачей, но не могу сообразить.

Есть запрос, который возвращает результат типа:
Товар1 Товар2
Товар2 Товар1
Товар3 Товар4
Товар4 Товар3

Не могу сообразить, как избавиться от повторных комбинаций, т.к. для целей запроса - они являются повторами.
---
да, вероятно вариант, но наткнулся тут на решение, по приведенной ссылке.

Оказалось просто... сравнение ссылок

```1c
    ВЫБРАТЬ
    Рег1.ЗаказПокупателя,
    Рег1.Номенклатура КАК Ном1
    ПОМЕСТИТЬ ВТ1
    ИЗ
    РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
    ;

    ВЫБРАТЬ
    ВТ1.Ном1 КАК Ном1,
    ВТ22.Ном1 КАК Ном2,
    1 КАК Колво
    ПОМЕСТИТЬ ВТ2
    ИЗ
    ВТ1
    ПОЛНОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ22
    ПО ВТ1.ЗаказПокупателя = ВТ22.ЗаказПокупателя
    ГДЕ
    ВТ1.Ном1>ВТ22.Ном1
    ;

    ВЫБРАТЬ
    Ном1,
    Ном2,
    КОЛИЧЕСТВО(Колво) КАК КолвоПовторов
    ПОМЕСТИТЬ ВТ3
    ИЗ ВТ2
    СГРУППИРОВАТЬ ПО
    Ном1,
    Ном2
    ;

    ВЫБРАТЬ
    ВТ3.Ном1,
    ВТ3.Ном2,
    ВТ3.КолвоПовторов
    ИЗ ВТ3
    УПОРЯДОЧИТЬ ПО
    ВТ3.КолвоПовторов Убыв,
    Ном1.Наименование, Ном2.Наименование;
```
---
согласен, оч интересная задача. Попробовал реализовать и так же, не могу сообразить.
---
Вот так получилось
Запрос.Текст =
 "ВЫБРАТЬ
 | ДляТестов.Товар1 КАК Товар1,
 | ДляТестов.Товар2 КАК Товар2,
 | ВЫБОР
 | КОГДА ДляТестов.Товар1 > ДляТестов.Товар2
 | ТОГДА ДляТестов.Товар1 + ДляТестов.Товар2
 | ИНАЧЕ ДляТестов.Товар2 + ДляТестов.Товар1
 | КОНЕЦ КАК СочетаниеВыбора
 |ПОМЕСТИТЬ ВТМаксимум
 |ИЗ
 | РегистрСведений.ДляТестов КАК ДляТестов
 |;
 |
 |////////////////////////////////////////////////////////////­////////////////////
 |ВЫБРАТЬ
 | ДляТестов.Товар1 КАК Товар1,
 | ДляТестов.Товар2 КАК Товар2,
 | ДляТестов.Товар1 + ДляТестов.Товар2 КАК Сочетание
 |ПОМЕСТИТЬ ВТОбщая
 |ИЗ
 | РегистрСведений.ДляТестов КАК ДляТестов
 |;
 |
 |////////////////////////////////////////////////////////////­////////////////////
 |ВЫБРАТЬ
 | ВТОбщая.Товар1 КАК Товар1,
 | ВТОбщая.Товар2 КАК Товар2,
 | ВТОбщая.Сочетание КАК Сочетание
 |ИЗ
 | ВТОбщая КАК ВТОбщая
 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
 | ПО ВТОбщая.Товар1 = ВТМаксимум.Товар2
 | И ВТОбщая.Сочетание = ВТМаксимум.СочетаниеВыбора";
---
хороший вариант, но номенклатура - ссылочный тип. Как мы его будем складывать в временной таблице?
---
Подстрока()
---
боюсь, не очень корректный вариант - наименования товаров могут быть или одинаковые или различие в последнем символе, как вариант.
---
не складывайте тогда, указывайте код товара в результате сравнения.
---
вот вам пример со ссылочными данными
 Запрос.Текст =
 "ВЫБРАТЬ
 | ДляТестов.Товар1 КАК Товар1,
 | ДляТестов.Товар2 КАК Товар2,
 | ВЫБОР
 | КОГДА ДляТестов.Товар1 > ДляТестов.Товар2
 | ТОГДА ДляТестов.Товар2.Код + ДляТестов.Товар1.Код
 | ИНАЧЕ ДляТестов.Товар1.Код + ДляТестов.Товар2.Код
 | КОНЕЦ КАК СочетаниеВыбора
 |ПОМЕСТИТЬ ВТМаксимум
 |ИЗ
 | РегистрСведений.ДляТестов КАК ДляТестов
 |;
 |
 |////////////////////////////////////////////////////////////­////////////////////
 |ВЫБРАТЬ
 | ДляТестов.Товар1 КАК Товар1,
 | ДляТестов.Товар2 КАК Товар2,
 | ДляТестов.Товар1.Код + ДляТестов.Товар2.Код КАК Сочетание
 |ПОМЕСТИТЬ ВТОбщая
 |ИЗ
 | РегистрСведений.ДляТестов КАК ДляТестов
 |;
 |
 |////////////////////////////////////////////////////////////­////////////////////
 |ВЫБРАТЬ
 | ВТОбщая.Товар1 КАК Товар1,
 | ВТОбщая.Товар2 КАК Товар2,
 | ВТОбщая.Сочетание КАК Сочетание
 |ИЗ
 | ВТОбщая КАК ВТОбщая
 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
 | ПО ВТОбщая.Товар1 = ВТМаксимум.Товар2
 | И ВТОбщая.Сочетание = ВТМаксимум.СочетаниеВыбора";
---
да, вероятно вариант, но наткнулся тут на решение, по приведенной ссылке.

Оказалось просто... сравнение ссылок

```1c
    ВЫБРАТЬ
    Рег1.ЗаказПокупателя,
    Рег1.Номенклатура КАК Ном1
    ПОМЕСТИТЬ ВТ1
    ИЗ
    РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
    ;

    ВЫБРАТЬ
    ВТ1.Ном1 КАК Ном1,
    ВТ22.Ном1 КАК Ном2,
    1 КАК Колво
    ПОМЕСТИТЬ ВТ2
    ИЗ
    ВТ1
    ПОЛНОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ22
    ПО ВТ1.ЗаказПокупателя = ВТ22.ЗаказПокупателя
    ГДЕ
    ВТ1.Ном1>ВТ22.Ном1
    ;

    ВЫБРАТЬ
    Ном1,
    Ном2,
    КОЛИЧЕСТВО(Колво) КАК КолвоПовторов
    ПОМЕСТИТЬ ВТ3
    ИЗ ВТ2
    СГРУППИРОВАТЬ ПО
    Ном1,
    Ном2
    ;

    ВЫБРАТЬ
    ВТ3.Ном1,
    ВТ3.Ном2,
    ВТ3.КолвоПовторов
    ИЗ ВТ3
    УПОРЯДОЧИТЬ ПО
    ВТ3.КолвоПовторов Убыв,
    Ном1.Наименование, Ном2.Наименование;
```
---
обязательно выводить все пары, или достаточно просто количество уникальных пар?
Для просто количество пар задача решается элементарно:

```1c
    ВЫБРАТЬ
    Рег1.Номенклатура КАК Номенклатура,
    1 Как НомерСтроки
    ПОМЕСТИТЬ ВТ1
    ИЗ
    РегистрНакопления.ЗаказыКлиентов.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1

    СГРУППИРОВАТЬ ПО
    Рег1.Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Количество(ВТ1.НомерСтроки)*(Количество(ВТ1.НомерСтроки)-1)/2 КАК КоличествоПар

    ИЗ
    ВТ1 КАК ВТ1
```
---
количество уникальных пар, которые встречались в пределах одного заказа. И сколько раз такие сочетания повторялись в разных заказах
---
Приложенная обработка решает задачу.
Суть решения - Используем объединение с той же таблицей, по перевернутому набору полей.
Для объединения нам понадобится уникальный номер каждой строки. В 8.3.13 это можно сделать как я через АВТОНОМЕРЗАПИСИ() , в более старых платформах можно использовать для нумерации строк метод соединения таблицы самой с собой, либо поискать среди имеющихся записей нечто подходящее под ключ записи. Например в случае справочника Номенклатура это может быть код номенклатуры1 + код номенклатуры2.
---
может выбрать различные?
---
не, для самого запроса, это разные строки
---
запрос в студию
---
В данном случае дубли, как я понял, всегда когда товар 1 = товар 2 и товар 2 = товар 1. Таким образом можно получить все товары, у которых есть дубликаты - через банальное левое соединение. Но оставить, предположу, нужно лишь те, в которых товар 1 > товар 2 (или наоборот).
---
Это запрос, сам достаточно простой.

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

    ВЫБРАТЬ
    Ном1,
    Ном2,
    КОЛИЧЕСТВО(Колво) КАК КолвоПовторов
    ИЗ ВТ1
    СГРУППИРОВАТЬ ПО
    Ном1,
    Ном2
    УПОРЯДОЧИТЬ ПО
    КолвоПовторов Убыв
```
---
полное соединение по не всем измерениям? Переделывайте на левое.
---
в данном случае, это задачу не решит. Т.к. в документах заполнены только эти реквизиты.
---
да и сам факт соединения виртуальной таблицы саму на себя...
Выбирайте результат виртуальной таблицы во временную и уже дальше работайте с полученным результатом.
---
оптимизация - да, но сейчас для простоты запроса пока так оставил
---
в запросе не хватает регистратора, если речь о каждом заказе в отдельности
---
Сообщение было скрыто модератором.
---
а какая задача у вас стоит?
---
получить количество повторов всех возможных пар номенклатуры, который встречались в пределах одного заказа. Это я посчитал. Сейчас борюсь с дублями строк.
---
Простите, но как правило если вы получили данные с которыми ничего не можете сделать, значит надо получить другие данные, с которыми вы знаете что делать. Исправьте исходный запрос так, чтобы он всегда получал
товар 1 товар 2
Товар 1 товар 2
И группируйте.
https://helpme1c.ru/soedineniya-v-zaprosax-v-1s-8-v-primerax
---
Тоже нахождения Повторов
ВЫБРАТЬ
 ВложенныйЗапрос.ЗаказПокупателя,
 ВложенныйЗапрос.Номенклатура,
 КОЛИЧЕСТВО(ВложенныйЗапрос.Номенклатура) КАК КвоПовторов
ИЗ
 (ВЫБРАТЬ
  ЗаказыПокупателейОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
  ЗаказыПокупателейОбороты.Номенклатура КАК Номенклатура,
  ЗаказыПокупателейОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
 ИЗ
  РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ) КАК ЗаказыПокупателейОбороты) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
 ВложенныйЗапрос.ЗаказПокупателя,
 ВложенныйЗапрос.Номенклатура
---
нет, вы повторы нашли одной номенклатуры в разных заказах. Я говорил про парные повторы. Т.е. сколько раз все возможные варианты пар номенклатуры встречались в разных заказах. Именно по этой причине номенклатур у меня 2 в запросе.
---
Мне кажется, Вам подойдет совет из (5):

```1c
    ВЫБРАТЬ
    Рег1.Номенклатура КАК Ном1,
    Рег2.Номенклатура КАК Ном2,
    1 КАК Колво
    ИЗ
    РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег2
    ПО Рег1.ЗаказПокупателя = Рег2.ЗаказПокупателя
    ГДЕ
    Рег1.Номенклатура < Рег2.Номенклатура;
```
---
это повторы в рамках заказа по разной характеристике
---
https://forum.mista.ru/topic.php?id=842231
---
```1c
    ВЫБРАТЬ
    Рег1.Номенклатура КАК Ном1,
    Рег2.Номенклатура КАК Ном2,
    1 КАК Колво
    ПОМЕСТИТЬ ВТ1
    ИЗ
    РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег2
    ПО Рег1.ЗаказПокупателя = Рег2.ЗаказПокупателя
    ГДЕ
    Рег1.Номенклатура <> Рег2.Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ1.Ном1,
    ВТ1.Ном2,
    КОЛИЧЕСТВО(ВТ1.Колво) КАК КолвоПовторов
    ПОМЕСТИТЬ ПОЛУФАБРИКАТ
    ИЗ
    ВТ1 КАК ВТ1

    СГРУППИРОВАТЬ ПО
    ВТ1.Ном1,
    ВТ1.Ном2
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ПОЛУФАБРИКАТ.Ном1,
    ПОЛУФАБРИКАТ.Ном2,
    ВЫБОР
    КОГДА ПОЛУФАБРИКАТ.Ном1 = ПОЛУФАБРИКАТ.Ном2
    ТОГДА ПОЛУФАБРИКАТ.КолвоПовторов / 2
    ИНАЧЕ ПОЛУФАБРИКАТ.КолвоПовторов
    КОНЕЦ КАК Поле1
    ИЗ
    ПОЛУФАБРИКАТ КАК ПОЛУФАБРИКАТ
    ЛЕВОЕ СОЕДИНЕНИЕ ПОЛУФАБРИКАТ КАК ПОЛУФАБРИКАТ1
    ПО ПОЛУФАБРИКАТ.Ном1 = ПОЛУФАБРИКАТ1.Ном2
    И ПОЛУФАБРИКАТ.Ном2 = ПОЛУФАБРИКАТ1.Ном1
    И ПОЛУФАБРИКАТ.Ном1 < ПОЛУФАБРИКАТ1.Ном2
    ГДЕ
    ПОЛУФАБРИКАТ1.Ном1 ЕСТЬ NULL
```
---
не очень понял, что хотели сделать. Результат запроса вернул то же, что и у меня - повторы...
---
Всем спасибо за участие в поиске решения ;)
---
Ошибся: И ПОЛУФАБРИКАТ.Ном1 < ПОЛУФАБРИКАТ1.Ном1

Ном1 Ном2
Вася Петя
Петя Вася

П1.Н1 П1.Н2 П2.Н1 П2.Н2
Вася Петя Петя Вася
Петя Вася Вася Петя

П1.Н1 = П2.Н2
И П1.Н2 = П2.Н1

И тогда условие

П1.Н1 < П2.Н1
отсечет последнюю строку.