Есть справочник с 12 реквизитами, элементы справочника их около 10000.в реквизитах справочника стоят значения "а" "б" или "в" надо сделать обработку которая для каждого элемента подбирает элементы где любые из 7 реквизитов совпадают с условием что найденные элементы между собой совпадают тоже минимум по 7 реквизитов.то есть берем первый элемент ищим элемент который совпадает с первым минимум по 7 реквизитам потом ищит еще элемент который совпадает минимум по 7 любых реквизитам с первым элементам и минимум по 7 любых реквизитов с уже найденым элементов
П1=первый элемент
П2 = первый найденный элемент
П3= второй найденный элемент
П4 = третий найденный элемент

П4=П3=П2=П1=СОВПАДЕНИЕ МИНИМУМ 7 ЛЮБЫХ РЕКВИЗИТОВ С КАЖДЫМ ЭЛЕМЕНТОМ

МОЖНО ЛИ ЭТО СДЕЛАТЬ КАКИЕ ИДЕИ
---
и количество решений у тебя будет... миллиарды, и считаться это будет, годами
---
silai89, первое что приходит на ум, цикл по всем элементам с вложенным запросом... но это долго, хотелось бы вариант чистого запроса, я думаю что это возможно
---
silai89, может как-то так...

```1c
    ВЫБРАТЬ
    Т1.Ссылка,
    Т2.Ссылка КАК Ссылка1,
    ВЫБОР
    КОГДА Т1.Реквизит1 = Т2.Реквизит1
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ КАК Реквизит1,

    ....

    ВЫБОР
    КОГДА Т1.Реквизит12 = Т2.Реквизит12
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ КАК Реквизит12
    ПОМЕСТИТЬ ВТ
    ИЗ
    Справочник.Справочник1 КАК Т1
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Справочник1 КАК Т2
    ПО (ИСТИНА)
    И Т1.Ссылка <> Т2.Ссылка1
    ;

    ВЫБРАТЬ
    ВТ.Ссылка,
    ВТ.Ссылка1
    ИЗ
    ВТ КАК ВТ
    ИМЕЮЩИЕ
    СУММА(ВТ.Реквизит1 + ... + ВТ.Реквизит12) > 6")
```
---
реквизиты элементов могут совпадать только идентичные, или любые? т.е. Элемент1.Реквизит1 = Элемент2.реквизит1 или возможно, что Элемент1.Реквизит1 = Элемент2.реквизит5, например? Если первый случай, то запрос из (12) должен подойти.
---
mymyka, Только не учтено условие что каждый новый Элемент должен совпадать своими 7ью реквизитами не только с главным, а и с остальными совпадающими.
Хотя его можно взять за основу и доработать, имхо будет быстрее работать чем мой вариант :)))
---
mymyka, первый случай
---
должно прокатить
---
sannt,
Лучше вот так сделать:

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    НовыйСправочник.Ссылка
    ИЗ
    Справочник.НовыйСправочник КАК НовыйСправочник
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.НовыйСправочник КАК НовыйСправочник1
    ПО (ВЫБОР
    КОГДА НовыйСправочник.Ссылка = НовыйСправочник1.Ссылка
    ТОГДА ЛОЖЬ
    КОГДА ВЫБОР
    КОГДА НовыйСправочник.Реквизит1 = НовыйСправочник1.Реквизит1
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит2 = НовыйСправочник1.Реквизит2
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит3 = НовыйСправочник1.Реквизит3
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит4 = НовыйСправочник1.Реквизит4
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит5 = НовыйСправочник1.Реквизит5
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит6 = НовыйСправочник1.Реквизит6
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит7 = НовыйСправочник1.Реквизит7
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит8 = НовыйСправочник1.Реквизит8
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит9 = НовыйСправочник1.Реквизит9
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит10 = НовыйСправочник1.Реквизит10
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит11 = НовыйСправочник1.Реквизит11
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ + ВЫБОР
    КОГДА НовыйСправочник.Реквизит12 = НовыйСправочник1.Реквизит12
    ТОГДА 1
    ИНАЧЕ 0
    КОНЕЦ > 6
    ТОГДА ИСТИНА
    ИНАЧЕ ЛОЖЬ
    КОНЕЦ)
```

В любом случае это не решает задачи. Так как в задаче сказано сделать так, чтобы в результат попали только те, которые между собой (все) совпадают по 7-ми реквизитам. А в этом случае выбираются все те, которые хоть с одним совпадают по 7-ми реквизитам.
---
на вот, код из (12) на твоей базе

```1c
    "ВЫБРАТЬ
    | Табличка.Ссылка,
    | Табличка.Ссылка1
    |ИЗ
    | (ВЫБРАТЬ
    | ВЫБОР
    | КОГДА Справочник1.Первый = Справочник2.Первый
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П1,
    | ВЫБОР
    | КОГДА Справочник1.Второй = Справочник2.Второй
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П2,
    | ВЫБОР
    | КОГДА Справочник1.Третий = Справочник2.Третий
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П3,
    | ВЫБОР
    | КОГДА Справочник1.Четвертый = Справочник2.Четвертый
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П4,
    | ВЫБОР
    | КОГДА Справочник1.Пятый = Справочник2.Пятый
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П5,
    | ВЫБОР
    | КОГДА Справочник1.Шестой = Справочник2.Шестой
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П6,
    | ВЫБОР
    | КОГДА Справочник1.Седьмой = Справочник2.Седьмой
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П7,
    | ВЫБОР
    | КОГДА Справочник1.Восьмой = Справочник2.Восьмой
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П8,
    | ВЫБОР
    | КОГДА Справочник1.Девятый = Справочник2.Девятый
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П9,
    | ВЫБОР
    | КОГДА Справочник1.Десятый = Справочник2.Десятый
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П10,
    | ВЫБОР
    | КОГДА Справочник1.Одиннадцатый = Справочник2.Одиннадцатый
    | ТОГДА 1
    | ИНАЧЕ 0
    | КОНЕЦ КАК П11,
    | Справочник1.Ссылка КАК Ссылка,
    | Справочник2.Ссылка КАК Ссылка1
    | ИЗ
    | Справочник.Справочник1 КАК Справочник1
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Справочник1 КАК Справочник2
    | ПО Справочник1.Ссылка <> Справочник2.Ссылка) КАК Табличка
    |
    |СГРУППИРОВАТЬ ПО
    | Табличка.Ссылка,
    | Табличка.Ссылка1
    |
    |ИМЕЮЩИЕ
    | СУММА(Табличка.П1 + Табличка.П2 + Табличка.П3 + Табличка.П4 + Табличка.П5 + Табличка.П6 + Табличка.П7 + Табличка.П8 + Табличка.П9 + Табличка.П10 + Табличка.П11) > 6"
```
---
хотя не, для (32) вообще ничего не надо - там и так всё работает
---
Чем (32) не подходит ?
---
Ёпрст, я только проверять начал
---
Ёпрст,я просто базу урезанную вам бросал там на самом деле 30 реквизитов из ни на совпадение минимум 20 и справочник состоит из около 120 тысяч:).уже пол часа формирует
---
Ёпрст, мне кажется из кода(32) он не проверяет с предыдущими найдеными элементами или я ошибаюсь?
---
че ?
запрос в (32) для каждого элемента находит все элементы , которые совпадают с ним по любым 7 реквизитам.
Как они там между собой найденые должны совпадать, в задаче вроде как не сказано, разве нет ?
---
Как вариант использовать запрос из (32), получить все элементы которые совпадают с главным.
Потом в цикле уже перебирать только эти элементы на равенство между собой. Должно быть быстрее чем просто циклом всё делать.
Хотя считаться будет всё равно очень долго. Не факт что вы дождетесь когда оно закончится)
А вообще зачем это надо то? или вы просто на примере такой задачи хотите поучится 1с?
---
Sevens,да нет не поучится а реальная задача решение которой мне нужно было но действитело ждать результата придется очень очень очень долго
---
silai89, Проверяй! )
Строит конечно результат около минуты на моем компе, быстрее вряд ли будет.
Для получения результата в обработке "Обработка1" надо нажать кнопку "Сформировать".
---
Sabfir, как я понимаю он не проверяет найденные элементы с предыдущими найдеными на совпадение
---
silai89, Алгоритм работает следующим образом:
С набора исходящих данных выбираются пары, у которых минимум 7 реквизитов совпадает. Запрос не ищет, чтобы у всех полученных элементов совпадали 7 реквизитов между собой, а только у пары. Если надо, чтобы алгоритм искал, чтобы у всех элементов была связь с предыдущим, то тут как минимум необходимо задать точку отсчета, отталкиваясь от которой необходимо выстроить цепочку.
---
Sabfir, попробую твой в твой код встаить мысль из (16)
---
Sabfir, у которых минимум 7 реквизитов совпадает. Запрос не ищет, чтобы у всех полученных элементов совпадали 7 реквизитов между собой

а как они могут не совпадать???
---
то есть берем первый элемент ищем элемент который совпадает с первым минимум по 7 реквизитам потом ищет еще элемент который совпадает минимум по 7 любых реквизитам с первым элементам и минимум по 7 любых реквизитов с уже найденым элементов
---
Как это сделать кто поможет
---
Я сам думаю что цикл в цикле делать вложеный цикл будет использоватся для вновь найденного элемента в сравнении для каждого предыдущего
---
но как это описать не знаю
---
а на время пофиг
---
Выгружаешь значения всех реквизитов для первого элемента в ТЗ. Передаешь в запрос, через МВТ. Делаешь тоже самое для следующего элемента, выполняешь запрос из 2 таблиц с внутренним соединением. Если в выборке менее 7 записей переходишь к следующему элементу, повторяешь. Как нашел нужный элемент записываешь в сводную коллекцию(двумерный массив) первый элемент и начинаешь сначала, только для найденного элемента. При обходе исключаешь уже найденные в этой итерации элементы. Работать будет пару часов минимум, но нужный эффект будет достигнут.
---
любые из 7 реквизитов совпадают с условием... отвечают условию... ??
---
```1c
    ищим
```
- нет, я не играю
---
mymyka помоги кодом если не сложно
---
я бы попробывал выбрать все в временную таблицу, и со связями пограться для того чтобы получить поля НЕ NULL где условие совпадения 7 реквизитов выполнено... составил бы такую табличку
Объект, ОбъектСвязи, УсловиеВыполнено ..
Группируем по Объект и получаем что то типа:
Объект
-ОбъектСвязи1, УсловиеВыполнено
-ОбъектСвязи2, УсловиеНеВыполнено
-ОбъектСвязи3, УсловиеВыполнено
...
Ну потом отфильтровать условием Где не составляет труда
...
Это в теории, а что на практике надо пробывать
---
а что такое т1 и т1
---
А что если взять за основу поиск и замена дублей и доработать соотвествующим образом?
---
tristarr1, пробывал что то не получается
---
точнее как их описать
---
я б пробовал циклом) не знаю как насчет производительности, но всё же делал бы как-то так.

```1c
    НачалоПродедуры
    ТЗ = Новый таблицаЗначений;
    Тз.Колонки.Добавить("Элемент",Новый ОписаниеТипов("СправочникСсылка.Справочник");
    Тз.Колонки.Добавить("ЭлементСоответствия",Новый ОписаниеТипов("СправочникСсылка.Справочник");

    Для каждого стр из Справочник Цикл
    Для каждого строка из Справочник Цикл
    А=0;
    Если Стр.Ссылка = Строка.Ссылка Тогда
    Продолжить;
    КонецЕсли;
    Если стр.Реквизит1=Строчка.реквизит1 Тогда
    А=А+1;
    КонецЕсли;
    Если стр.Реквизит2=Строчка.реквизит2 Тогда
    А=А+1;
    КонецЕсли;
    ..............
    Если стр.Реквизит12=Строчка.реквизит12 Тогда
    А=А+1;
    КонецЕсли;
    Если А>6 и ПолучитьСопоставленияСОстальными(ТЗ,стр.ссылка,строчка.Ссылка) Тогда

    НоваяСтрока = Тз.Добавить();
    НоваяСтрока.Элемент = стр.Ссылка;
    НоваяСтрока.ЭлементСоответствия = Строчка.Ссылка;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    КонецПроцедуры

    Функция ПолучитьСопоставленияСОстальными (ТЗ,Элемент,НовыйЭлемент)
    Запрос = Новый Запрос;
    Запрос.Текст ="Выбрать
    ТЗ.Элемент
    ТЗ.ЭлементСоответствия
    Поместить ТЗ1
    Из
    &Тз как ТЗ
    ;
    Выбрать
    ТЗ1.Элемент
    ТЗ1.ЭлементСоответствия
    Из
    ТЗ1 как ТЗ1
    Где ТЗ1.Элемент = &Элемент";
    Запрос.установитьПараметр("Элемент",Элемент);
    ВремТЗ = Запрос.Выполнить().Выгрузить();
    КолВоСовпадений=0;
    Для каждого стр из ВремТЗ Цикл
    А=0;
    Если Стр.ЭлементСопоставления.Реквизит1=НовыйЭлемент.реквизит1 Тогда
    А=А+1;
    КонецЕсли;
    Если Стр.ЭлементСопоставления.Реквизит2=НовыйЭлемент.реквизит2 Тогда
    А=А+1;
    КонецЕсли;
    ..............
    Если Стр.ЭлементСопоставления.Реквизит12=НовыйЭлемент.реквизит12 Тогда
    А=А+1;
    КонецЕсли;
    Если А>6 Тогда
    КолВоСовпадений=КолВоСовпадений+1;
    КонецЕсли;
    КонецЦикла;
    Если КолВоСовпадений >= ВремТЗ.Количество() Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции
```

П.с. Набросал на вскидку, могут быть ошибки)
---
Sevens, что то вроде то сейчас буда проверять
---
Sevens, Вы не можете сделать?
---
silai89,
Сегодня явно нет, завтра гляну :)
Может кто-то быстрее чего-то придумает :)
(27) С малым кол-вом реквизитов - это хорошо, но вот когда их больше запрос будет большим и не шибко читабельным=(
---
Sevens, чего то мне кажется что вариантов перестановок 10, и насчет производительности тоже уверен что все нормально
---
jeck122, Про производительность я даже не спорю :)
и Вариант с запросом явно лучше, чем перебор циклом.
---
правильная идея но что то не получается реализовать на моей базе
---
че то не получается.я только начиная программировать. вот база со справочником.кто допишит тому большое спасибо
---
база
---
сдается мне что задача простая, только попробую ее упростить для лучшего понимания:
например не 10 реквизитов а 3, и не по 7 совпадение, а по 2, то есть возможны 3 варианта связи по реквизитам: 1=1 и 2=2 или 1=1 и 3=3 или 2=2 и 3=3. Внутреннее соединение справочника с самим собой с указанием всех возможных видов связи (с исключением возможности замыкания на себя), не решает проблемы?
---
jeck122, Решает проблему.
Получается в результате таблица вида:
спр1|спр2
спр1|спр3
спр1|спр4
спр2|спр5
спр2|спр7
спр2|спр1
спр3|спр1
спр4|спр1
спр5|спр2
спр7|спр2
То есть как бы задваиваются. Надо еще этот вопрос как то решить. В запросе мне что-то не получилось, хотя думаю, что возможно. А можно просто обходом.
---
это напоминает задачу про рукопожатия, есть таблица с людьми всем со свсеми надо пожать руки, написать запрос который бы вывел таблицу с двумя столбцами этих рукопожатий :)
---
на задвоение пофиг на производительность тоже
---
1 элемент 1(а)2(а)3(а)4(а)5(а)6(а)7(а)8(а)9(а)10(а)11(а)12(а)
 1 элемент наиденный 1(а)2(а)3(а)4(а)5(а)6(а)7(а)8(б)9(б)10(б)11(б)12(б)
 2 элемент наиденный 1(в)2(в)3(в)4(в)5(б)6(а)7(а)8(а)9(а)10(а)11(а)12(а)

вот так могут не совпадать то есть найденые элементы совпадают по 7 реквизитов с 1 элементом а между собой совпадают только по 2 реквизита+
---
в (32) в условие , где соединение таблиц пихай что сумма строковых полей = сумме строковых полей второй таблички и усё.
---
то есть нашли мы второй элемент который с любыми 7 совпадает с элементом по которому ищим + он должен совпадать с любыми 7 с первым нашедшем элементом . здесь на примере показано
(40)
---
ой (40) это наоборот не правильный извиняюсь
---
а надо чтобы "второй найденый элемент" совпадал и с "первым найденным элементом" минимум по 7 реквизитам
---
Я бы посмотрел в сторону матрицы корреляции между элементами
---
Можно уточнить пару моментов:
1. Элемент, по которому будет выполнятся сравнение должен выбираться вручную или для каждого элемента искать сравнения.

2. Правильное условие какое?

Второй элемент совпадает с первым по 7 реквизитам, Третий элемент совпадает со вторым, четвертый с третьим и.т.д

ИЛИ

Второй, третий, четвертый элементы совпадают с первым по любым семи, при этом между собой тоже совпадают по семи любым реквизитам
---
snipers88, 1 Для каждого элемента 2 Второй, третий, четвертый элементы совпадают с первым по любым семи, при этом между собой тоже совпадают по семи любым реквизитам
---
silai89,то есть 4 найденный элемент должен совпадать любым 7 реквизитам 3 найденому и 2 найденому и 1 найденому ну и конечно самому элементу по которому искали
---
в задаче было - любые 7 совпадают.
а не конкретные 7 в каждом элементе.
---
все правильно любые семь
---
вообще-то сказано
---
Тогда только рекурсия, в запросе в снеговике, врят ли .. в чистом скуле- как нефик делать. тупо написав хранимку.
---
Ёпрст, из (59) я понял слово только запрос и снеговик)))
---
тогда у тебя будет куча кортежей.
Однозначности в задачи не будет
---
Будет так к примеру
для искомого
нашли первый элемент, а совпадений этого элемента со всеми остальными нет.
но есть второй элемент для искомого, который имеет совпадение с остальными элементами..
и т.д..

так надо ?
---
и будут у тебя куски

искомый-первый-десятый
искомый-второй-пятый-сорок пятый
искомый-третий
и т.ддд

тут искомый совпадает с со всеми по 7 реквизитам, но первый не совпадает со вторым и с третьим и т.д..
---
и количество решений у тебя будет... миллиарды, и считаться это будет, годами
---
всем спасибо