(1) Vanch90, если тупо факт наличия дублей, без вычисления каких именно,
то просто в таблицу значений, свернуть, и количество строк.
Если оно меньше чем строк документа, значит есть дубли - и в отказ от проведения. Пусть пользак сам ищет что задублировал.
Это самый быстрый способ.
А если надо ткнуть пальцем, и сказать пользователю что конкретно имеет дубли - тогда надо выеживаться с алгоритмом.
(2) alljoke, (7) damayorov, (10) v3rter, попробуйте объяснить, почему "запросом быстрее". Много раз сталкиваюсь с этим ЗАБЛУЖДЕНИЕМ. Не могу понять, откуда оно взялось. Специально проверял: ЗАПРОСОМ МЕДЛЕННЕЕ!
И это легко объясняется, потому, что еще нужно передать таблицу значений в запрос. Это делается путем ее сериализации и десериализации. На это уходит гораздо больше времени, чем на выполнение "свернуть". В (10) основное время уходило, думаю, не на "Свернуть", а на Товары.Выгрузить() - то есть на получение таблицы значений из базы данных, а не на ее обработку. Так что код в (10), несмотря на неверные выводы, - это и есть самый быстрый способ, когда таблица уже в памяти.
Медленнее на новом несохраненном документе или на сохраненном?
Неужели табличные части документов хранятся в SQL настолько неестественным образом, что обратиться к ним напрямую невозможно?
Особенности платформы?
(15) v3rter, медленнее на новом не сохраненном документе. Я, как и многие здесь, понял вопрос так, что этой ТЧ в базе пока нет: есть таблица значений в памяти и в ней нужно найти дубли.
Конечно, если ТЧ в базе данных, то запрос будет быстрее.
Когда-то делал на таблицах значений, документы были с тысячами строк, пользователям надо было видеть в каких именно строках дубли.
ТоварыВременно = Товары.Выгрузить(); // Имя табличной части
ТоварыВременно.Колонки.Добавить("Дубли");
ТоварыВременно.ЗаполнитьЗначения(1,"Дубли");
ТоварыВременно.Свернуть("Номенклатура","Дубли");
Если ТоварыВременно.Количество() < Товары.Количество() Тогда // дубли есть
Для Каждого СтрокаТоварыВременно из ТоварыВременно Цикл
Если СтрокаТоварыВременно.Дубли > 1 Тогда
// ...
Показать
Работало, но медленно. Так что запросом с условием типа ИМЕЮЩИЕ СУММА( ... ) >= 1
Всем привет. Может кому пригодится запрос на отбор документов, в которых повторяются строки по Номенклатуре и Характеристикам. Работает в УНФ.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РасходнаяНакладная.Дата, ДЕНЬ) КАК Дата,
РасходнаяНакладная.Ссылка КАК Накладная,
РасходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура,
ЕСТЬNULL(ПРЕДСТАВЛЕНИЕ(РасходнаяНакладнаяЗапасы.Характеристика), "") КАК Характеристика,
РасходнаяНакладнаяЗапасы.Ссылка КАК Запасы
ПОМЕСТИТЬ РасхНакл
ИЗ
Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная
ПО (РасходнаяНакладнаяЗапасы.Ссылка = РасходнаяНакладная.Ссылка)
ГДЕ
РасходнаяНакладнаяЗапасы.Характеристика = РасходнаяНакладнаяЗапасы.Характеристика
И РасходнаяНакладнаяЗапасы.Номенклатура = РасходнаяНакладнаяЗапасы.Номенклатура
СГРУППИРОВАТЬ ПО
РасходнаяНакладная.Дата,
РасходнаяНакладная.Ссылка,
РасходнаяНакладнаяЗапасы.Номенклатура,
РасходнаяНакладнаяЗапасы.Характеристика,
РасходнаяНакладнаяЗапасы.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РасходнаяНакладнаяЗапасы.Ссылка) > 1
ИНДЕКСИРОВАТЬ ПО
Дата