Доброго времени суток,

Есть запрос который выбирает мне все элементы справочника. Их около 46000.
Я хочу обойти все элементы и найти дубликаты по одному из реквизитов. Попросту элементы у которых реквизит Заводской номер совпадает, считаются дубликатами.

```1c
    ТЗ = РезультатЗапроса.Выгрузить();
    ТЗДубликатов = Новый ТаблицаЗначений;
    Счетчик = 0;
    Пока Счетчик < ТЗ.Количество() Цикл
    СчетчикВнутр = 0;
    Пока СчетчикВнутр < ТЗ.Количество() Цикл
    Если ТЗ[Счетчик].ЗаводскойНомер = ТЗ[СчетчикВнутр].ЗаводскойНомер Тогда
    НоваяСтрока = Объект.УдвоенныеПриборыУчета.Добавить();
    НоваяСтрока.Код = ТЗ[Счетчик].Код;
    НоваяСтрока.ЗаводскойНомер = ТЗ[Счетчик].ЗаводскойНомер;
    НоваяСтрока.ЛицевойСчет = ТЗ[Счетчик].ЛицевойСчет;
    Иначе
    КонецЕсли;
    СчетчикВнутр = СчетчикВнутр + 1;
    КонецЦикла;
    Счетчик = Счетчик + 1;
    КонецЦикла;
```

Хотелось бы уточнить насколько это корректная конструкция, потому что сейчас Табличная часть Приборы учета заполняются чем-то не понятным. Скорее всего допущена ошибка, но я не могу её увидеть.
---
сейчас Табличная часть Приборы учета заполняются чем-то не понятным. Попробую угадать: сейчас табличная часть заполняется дубликатами плюс все элементы справочника.
 Скорее всего допущена ошибка, но я не могу её увидеть. Ошибка в том, что вы не проверяете условие "СчетчикВнутр равно Счетчик", поэтому в ТЧ попадут все элементы ТЗ - заводской номер каждого элемента ведь равен самому себе?

Исправить эту ошибку несложно:

```1c
    Пока Счетчик < ТЗ.Количество() Цикл
    СчетчикВнутр = 0;
    Пока СчетчикВнутр < ТЗ.Количество() Цикл
    Если СчетчикВнутр = Счетчик Тогда
    ИначеЕсли ТЗ[Счетчик].ЗаводскойНомер = ТЗ[СчетчикВнутр].ЗаводскойНомер Тогда
    НоваяСтрока = Объект.УдвоенныеПриборыУчета.Добавить();
    НоваяСтрока.Код = ТЗ[Счетчик].Код;
    НоваяСтрока.ЗаводскойНомер = ТЗ[Счетчик].ЗаводскойНомер;
    НоваяСтрока.ЛицевойСчет = ТЗ[Счетчик].ЛицевойСчет;
    КонецЕсли;
    СчетчикВнутр = СчетчикВнутр + 1;
    КонецЦикла;
    Счетчик = Счетчик + 1;
    КонецЦикла;
```
---
сейчас Табличная часть Приборы учета заполняются чем-то не понятным. Попробую угадать: сейчас табличная часть заполняется дубликатами плюс все элементы справочника.
 Скорее всего допущена ошибка, но я не могу её увидеть. Ошибка в том, что вы не проверяете условие "СчетчикВнутр равно Счетчик", поэтому в ТЧ попадут все элементы ТЗ - заводской номер каждого элемента ведь равен самому себе?

Исправить эту ошибку несложно:

```1c
    Пока Счетчик < ТЗ.Количество() Цикл
    СчетчикВнутр = 0;
    Пока СчетчикВнутр < ТЗ.Количество() Цикл
    Если СчетчикВнутр = Счетчик Тогда
    ИначеЕсли ТЗ[Счетчик].ЗаводскойНомер = ТЗ[СчетчикВнутр].ЗаводскойНомер Тогда
    НоваяСтрока = Объект.УдвоенныеПриборыУчета.Добавить();
    НоваяСтрока.Код = ТЗ[Счетчик].Код;
    НоваяСтрока.ЗаводскойНомер = ТЗ[Счетчик].ЗаводскойНомер;
    НоваяСтрока.ЛицевойСчет = ТЗ[Счетчик].ЛицевойСчет;
    КонецЕсли;
    СчетчикВнутр = СчетчикВнутр + 1;
    КонецЦикла;
    Счетчик = Счетчик + 1;
    КонецЦикла;
```
---
Сделал по другому, выгружаю весь результат в ТЗ, добавляю колонку Количество где проставляю 1, сворачиваю и вывожу только те где больше 2. Думаю это как минимум быстрее будет отрабатывать чем первое решение. Но Вам спасибо за помощь.
---
Думаю это как минимум быстрее будет отрабатывать чем первое решение. Быстрее - несомненно: трудно представить что-то медленнее, чем 46000 раз в цикле обходить ТЗ из 46000 элементов.

Другое дело, если надо получить полную информацию обо всех дублях (например, для их последующей обработки) - как после свертки установить, какие были Код и ЛицевойСчет у дублей?

Впрочем, вы вашу задачу знаете лучше, если устраивают результаты свертки - пусть будет свертка.
---
Да, вот такую проблему сейчас и обнаружил
---
вот такую проблему сейчас и обнаружил Если с получением дублей запросом возникают сложности (у меня - да, я бы не взялся составить такой запрос) и условия задачи допускают сортировку ТЗ по нужному реквизиту, то можно оптимизировать алгоритм до одного цикла:
1. Сортируем ТЗ по заводскому номеру.
2. Обходим ТЗ начиная со Счетчик = 1 (не с 0!) и до конца
3. Сравниваем заводской номер текущего элемента с заводским номером предыдущего, то есть [Счетчик -1] - если совпадают - это дубли.

Фсё!.. Ну, почти всё - надо еще контролировать номер последнего выведенного дубля, чтобы в группе из трех (или больше) дублей подряд второй элемент не выводился дважды - когда он текущий и когда предыдущий.
---
Как-то так:

```1c
    Выбрать
    ЗаводскойНомер
    Поместить ВТЗаводскиеНомера
    ИЗ Номенклатура
    СГРУППИРОВАТЬ ПО
    ЗаводскойНомер
    ИМЕЮЩИЕ(КОЛИЧЕСТВО Ссылка) > 1
    ;
    Выбрать
    МИНИМУМ(Код) КАК Код,
    ЗаводскойНомер
    ПОМЕСТИТЬ ВТКодыУникальных
    Из Номенклатура
    ГДЕ ЗаводскойНомер В (Выбрать Т.ЗаводскойНомер ИЗ ВТЗаводскиеНомера КАК Т)
    СГРУППИРОВАТЬ ПО
    ЗаводскойНомер
    ;
    Выбрать
    Ссылка
    ИЗ Номенклатура
    ГДЕ ЗаводскойНомер В (Выбрать Т.ЗаводскойНомер ИЗ ВТЗаводскиеНомера КАК Т)
    И НЕ Код В (ВЫБРАТЬ Т.Код ИЗ ВТКодыУникальных КАК Т)
```

И не нужно городить весь этот код + скорость получения результата заметно выше
---
(9)сейчас попробую
---
ГДЕ ЗаводскойНомер В (Выбрать Т.ЗаводскойНомер ИЗ ВТЗаводскиеНомера КАК Т)

Вроде как всё равно в inner join трансформруется. Но я бы сразу внутреннее соединение сделал бы.
---
можно и inner join - без особой разницы, ИМХО
---
запросом получите дубли, чтобы не городить весь этот код.
---
Я бы наверное вот еще как сделал, взял 2 ТЗ, пошел по справочнику обходом и начал заполнять первую ТЗ, при проверки на реквизит, если вщдруг совпадает, то я бы этот элемент добавил во вторую ТЗ и как итог у нас получается вторая ТЗ с дублями.
---
И не нужно городить весь этот код + скорость получения результата заметно выше Каждому - свое... а мне - чужое?

Объясняю: я - не автор ветки, мне не нужен ни этот код, ни авторский, ни "скорость получения результата". :)