(28) да, вероятно вариант, но наткнулся тут на решение, по приведенной ссылке.
Оказалось просто... сравнение ссылок
ВЫБРАТЬ
Рег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 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ВЫБОР
| КОГДА ДляТестов.Товар1 > ДляТестов.Товар2
| ТОГДА ДляТестов.Товар1 + ДляТестов.Товар2
| ИНАЧЕ ДляТестов.Товар2 + ДляТестов.Товар1
| КОНЕЦ КАК СочетаниеВыбора
|ПОМЕСТИТЬ ВТМаксимум
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДляТестов.Товар1 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ДляТестов.Товар1 + ДляТестов.Товар2 КАК Сочетание
|ПОМЕСТИТЬ ВТОбщая
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТОбщая.Товар1 КАК Товар1,
| ВТОбщая.Товар2 КАК Товар2,
| ВТОбщая.Сочетание КАК Сочетание
|ИЗ
| ВТОбщая КАК ВТОбщая
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
| ПО ВТОбщая.Товар1 = ВТМаксимум.Товар2
| И ВТОбщая.Сочетание = ВТМаксимум.СочетаниеВыбора";
28.
fromlion
17219.11.19 09:55 Сейчас в теме+0.75 $m
(26) вот вам пример со ссылочными данными
Запрос.Текст =
"ВЫБРАТЬ
| ДляТестов.Товар1 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ВЫБОР
| КОГДА ДляТестов.Товар1 > ДляТестов.Товар2
| ТОГДА ДляТестов.Товар2.Код + ДляТестов.Товар1.Код
| ИНАЧЕ ДляТестов.Товар1.Код + ДляТестов.Товар2.Код
| КОНЕЦ КАК СочетаниеВыбора
|ПОМЕСТИТЬ ВТМаксимум
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДляТестов.Товар1 КАК Товар1,
| ДляТестов.Товар2 КАК Товар2,
| ДляТестов.Товар1.Код + ДляТестов.Товар2.Код КАК Сочетание
|ПОМЕСТИТЬ ВТОбщая
|ИЗ
| РегистрСведений.ДляТестов КАК ДляТестов
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТОбщая.Товар1 КАК Товар1,
| ВТОбщая.Товар2 КАК Товар2,
| ВТОбщая.Сочетание КАК Сочетание
|ИЗ
| ВТОбщая КАК ВТОбщая
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМаксимум КАК ВТМаксимум
| ПО ВТОбщая.Товар1 = ВТМаксимум.Товар2
| И ВТОбщая.Сочетание = ВТМаксимум.СочетаниеВыбора";
(28) да, вероятно вариант, но наткнулся тут на решение, по приведенной ссылке.
Оказалось просто... сравнение ссылок
ВЫБРАТЬ
Рег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.Наименование;
(29) обязательно выводить все пары, или достаточно просто количество уникальных пар?
Для просто количество пар задача решается элементарно:
ВЫБРАТЬ
Рег1.Номенклатура КАК Номенклатура,
1 Как НомерСтроки
ПОМЕСТИТЬ ВТ1
ИЗ
РегистрНакопления.ЗаказыКлиентов.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
СГРУППИРОВАТЬ ПО
Рег1.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Количество(ВТ1.НомерСтроки)*(Количество(ВТ1.НомерСтроки)-1)/2 КАК КоличествоПар
ИЗ
ВТ1 КАК ВТ1
Приложенная обработка решает задачу.
Суть решения - Используем объединение с той же таблицей, по перевернутому набору полей.
Для объединения нам понадобится уникальный номер каждой строки. В 8.3.13 это можно сделать как я через АВТОНОМЕРЗАПИСИ() , в более старых платформах можно использовать для нумерации строк метод соединения таблицы самой с собой, либо поискать среди имеющихся записей нечто подходящее под ключ записи. Например в случае справочника Номенклатура это может быть код номенклатуры1 + код номенклатуры2.
В данном случае дубли, как я понял, всегда когда товар 1 = товар 2 и товар 2 = товар 1. Таким образом можно получить все товары, у которых есть дубликаты - через банальное левое соединение. Но оставить, предположу, нужно лишь те, в которых товар 1 > товар 2 (или наоборот).
ВЫБРАТЬ
Рег1.Номенклатура КАК Ном1,
Рег2.Номенклатура КАК Ном2,
1 КАК Колво
ПОМЕСТИТЬ ВТ1
ИЗ
РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег2
ПО Рег1.ЗаказПокупателя = Рег2.ЗаказПокупателя
ГДЕ
Рег1.Номенклатура<>Рег2.Номенклатура;
ВЫБРАТЬ
Ном1,
Ном2,
КОЛИЧЕСТВО(Колво) КАК КолвоПовторов
ИЗ ВТ1
СГРУППИРОВАТЬ ПО
Ном1,
Ном2
УПОРЯДОЧИТЬ ПО
КолвоПовторов Убыв
(6) да и сам факт соединения виртуальной таблицы саму на себя...
Выбирайте результат виртуальной таблицы во временную и уже дальше работайте с полученным результатом.
(12) получить количество повторов всех возможных пар номенклатуры, который встречались в пределах одного заказа. Это я посчитал. Сейчас борюсь с дублями строк.
Простите, но как правило если вы получили данные с которыми ничего не можете сделать, значит надо получить другие данные, с которыми вы знаете что делать. Исправьте исходный запрос так, чтобы он всегда получал
товар 1 товар 2
Товар 1 товар 2
И группируйте.
https://helpme1c.ru/soedineniya-v-zaprosax-v-1s-8-v-primerax
Тоже нахождения Повторов
ВЫБРАТЬ
ВложенныйЗапрос.ЗаказПокупателя,
ВложенныйЗапрос.Номенклатура,
КОЛИЧЕСТВО(ВложенныйЗапрос.Номенклатура) КАК КвоПовторов
ИЗ
(ВЫБРАТЬ
ЗаказыПокупателейОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
ЗаказыПокупателейОбороты.Номенклатура КАК Номенклатура,
ЗаказыПокупателейОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
ИЗ
РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ) КАК ЗаказыПокупателейОбороты) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.ЗаказПокупателя,
ВложенныйЗапрос.Номенклатура
(15) нет, вы повторы нашли одной номенклатуры в разных заказах. Я говорил про парные повторы. Т.е. сколько раз все возможные варианты пар номенклатуры встречались в разных заказах. Именно по этой причине номенклатур у меня 2 в запросе.
ВЫБРАТЬ
Рег1.Номенклатура КАК Ном1,
Рег2.Номенклатура КАК Ном2,
1 КАК Колво
ИЗ
РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег1
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, , ) КАК Рег2
ПО Рег1.ЗаказПокупателя = Рег2.ЗаказПокупателя
ГДЕ
Рег1.Номенклатура < Рег2.Номенклатура;
ВЫБРАТЬ
Рег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