Самый оптимальный способ проверка дублей строк в ТЧ?

1. Vanch90 22.04.16 07:53 Сейчас в теме
Какой самый оптимальный способ проверки дублей в табличной части документа?
Проверка при проведении документа.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. sssss_aaaaa_2011 22.04.16 16:52 Сейчас в теме
(1) Vanch90, "самый оптимальный" - тавтология.
9. Boneman 298 22.04.16 17:24 Сейчас в теме
(1) Vanch90, если тупо факт наличия дублей, без вычисления каких именно,
то просто в таблицу значений, свернуть, и количество строк.
Если оно меньше чем строк документа, значит есть дубли - и в отказ от проведения. Пусть пользак сам ищет что задублировал.
Это самый быстрый способ.

А если надо ткнуть пальцем, и сказать пользователю что конкретно имеет дубли - тогда надо выеживаться с алгоритмом.
RusskyPhX; akR00b; +2 Ответить
2. alljoke 22.04.16 08:20 Сейчас в теме
11. Vanch90 25.04.16 10:34 Сейчас в теме
(2) alljoke, Не, запросом не подходит, документ еще даже не записан.

Вывод конкретных строк был неважен, но поиск должен производится по 3м колонкам "номенклатура, характеристика, серия"

Из ТЧ документа скопировал в ТЗ с 3мя нужными колонками, свернул и проверил Количество.
12. akR00b 22 25.04.16 11:28 Сейчас в теме
(11) Vanch90, а почему тоже самое нельзя сделать в запросе по тз?
13. Serginio 938 25.04.16 11:49 Сейчас в теме
(12) В статье Лучшие методы сравнения таблиц значений показывается, что запрос самое медленное решение.

Алгоритм в 6 работает быстро, особенно если его заточить на дубли. Я им пользуюсь практически каждый день.
14. ildarovich 7865 25.04.16 12:07 Сейчас в теме
(2) alljoke, (7) damayorov, (10) v3rter, попробуйте объяснить, почему "запросом быстрее". Много раз сталкиваюсь с этим ЗАБЛУЖДЕНИЕМ. Не могу понять, откуда оно взялось. Специально проверял: ЗАПРОСОМ МЕДЛЕННЕЕ!
И это легко объясняется, потому, что еще нужно передать таблицу значений в запрос. Это делается путем ее сериализации и десериализации. На это уходит гораздо больше времени, чем на выполнение "свернуть". В (10) основное время уходило, думаю, не на "Свернуть", а на Товары.Выгрузить() - то есть на получение таблицы значений из базы данных, а не на ее обработку. Так что код в (10), несмотря на неверные выводы, - это и есть самый быстрый способ, когда таблица уже в памяти.
15. v3rter 25.04.16 12:52 Сейчас в теме
(14) ildarovich,
Специально проверял: ЗАПРОСОМ МЕДЛЕННЕЕ!
Медленнее на новом несохраненном документе или на сохраненном?
Неужели табличные части документов хранятся в SQL настолько неестественным образом, что обратиться к ним напрямую невозможно?
Особенности платформы?
16. ildarovich 7865 25.04.16 14:54 Сейчас в теме
(15) v3rter, медленнее на новом не сохраненном документе. Я, как и многие здесь, понял вопрос так, что этой ТЧ в базе пока нет: есть таблица значений в памяти и в ней нужно найти дубли.
Конечно, если ТЧ в базе данных, то запрос будет быстрее.
17. herfis 499 25.04.16 15:13 Сейчас в теме
(14) ildarovich, Первые отвечающие скорее всего имели в виду запрос именно ПРИ ПРОВЕДЕНИИ, когда к табличной части уже можно обращаться в БД.
18. ildarovich 7865 25.04.16 17:34 Сейчас в теме
(17) herfis, да, похоже, что так. Я поторопился с критикой - сработал шаблон.
3. alljoke 22.04.16 08:21 Сейчас в теме
Количество различные.
4. alljoke 22.04.16 08:26 Сейчас в теме
А вообще вспоминая уроки Павла Чистова, там не проверяется а сразу группируется.
5. r.moschenskiy 23 22.04.16 09:12 Сейчас в теме
Если в контексте формы, то
ТЧ.НайтиСтроки(ПараметрыОтбора).Количество() > 1
6. Serginio 938 22.04.16 13:04 Сейчас в теме
7. damayorov 2 22.04.16 16:36 Сейчас в теме
Запросом. Работает быстрее.
10. v3rter 22.04.16 17:27 Сейчас в теме
Когда-то делал на таблицах значений, документы были с тысячами строк, пользователям надо было видеть в каких именно строках дубли.
	ТоварыВременно = Товары.Выгрузить(); // Имя табличной части
	ТоварыВременно.Колонки.Добавить("Дубли");
	ТоварыВременно.ЗаполнитьЗначения(1,"Дубли");
	ТоварыВременно.Свернуть("Номенклатура","Дубли");
	Если ТоварыВременно.Количество() < Товары.Количество() Тогда // дубли есть
		Для Каждого СтрокаТоварыВременно из ТоварыВременно Цикл
			Если СтрокаТоварыВременно.Дубли > 1 Тогда
        // ...
Показать

Работало, но медленно. Так что запросом с условием типа ИМЕЮЩИЕ СУММА( ... ) >= 1

Видел нечто универсальное http://www.vdgb.ru/tehpodderzhka-1s/faq/funkciya-proverki-na-dubli-strok-v-tablichnoj-chasti-dokumenta/ , но не проверял.
demidrole; chehlov; +2 Ответить
19. Chameleon1980 25.04.16 17:37 Сейчас в теме
я в чем проблема выгрузить тч незаписанного (непроведенного) документа и запихнуть ее в запрос?
20. ZergKRSK 129 26.04.16 03:54 Сейчас в теме
(19) Chameleon1980, :D зачем читать всю тему, правда?
PhoenixAOD; 32ops; +2 Ответить
21. PhoenixAOD 62 26.04.16 08:04 Сейчас в теме
22. aaguselnikova 20 24.04.19 06:43 Сейчас в теме
// Сравнивает данные сложной структуры с учетом вложенности.
//
// Параметры:
//  Данные1 - Структура,    ФиксированнаяСтруктура,
//            Соответствие, ФиксированноеСоответствие,
//            Массив,       ФиксированныйМассив,
//            ХранилищеЗначения, ТаблицаЗначений,
//            Строка, Число, Булево - сравниваемые данные.
//
//  Данные2 - Произвольный - те же типы, что и для параметра Данные1.
//
// Возвращаемое значение:
//  Булево - Истина, если совпадают.

ТаблицаДоИзменения = Запрос.Выполнить().Выгрузить();
		
ТаблицаПослеИзменения = Запрос.Выполнить().Выгрузить();
		
Если Не ОбщегоНазначения.ДанныеСовпадают(ТаблицаДоИзменения, ТаблицаПослеИзменения) Тогда
	Результат.ЕстьИзменения = Истина;
КонецЕсли;
Показать
24. Gaudamus 04.03.24 23:04 Сейчас в теме
Всем привет. Может кому пригодится запрос на отбор документов, в которых повторяются строки по Номенклатуре и Характеристикам. Работает в УНФ.
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(РасходнаяНакладная.Дата, ДЕНЬ) КАК Дата,
	РасходнаяНакладная.Ссылка КАК Накладная,
	РасходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура,
	ЕСТЬNULL(ПРЕДСТАВЛЕНИЕ(РасходнаяНакладнаяЗапасы.Характеристика), "") КАК Характеристика,
	РасходнаяНакладнаяЗапасы.Ссылка КАК Запасы
ПОМЕСТИТЬ РасхНакл
ИЗ
	Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная
		ПО (РасходнаяНакладнаяЗапасы.Ссылка = РасходнаяНакладная.Ссылка)
ГДЕ
	РасходнаяНакладнаяЗапасы.Характеристика = РасходнаяНакладнаяЗапасы.Характеристика
	И РасходнаяНакладнаяЗапасы.Номенклатура = РасходнаяНакладнаяЗапасы.Номенклатура

СГРУППИРОВАТЬ ПО
	РасходнаяНакладная.Дата,
	РасходнаяНакладная.Ссылка,
	РасходнаяНакладнаяЗапасы.Номенклатура,
	РасходнаяНакладнаяЗапасы.Характеристика,
	РасходнаяНакладнаяЗапасы.Ссылка

ИМЕЮЩИЕ
	КОЛИЧЕСТВО(РасходнаяНакладнаяЗапасы.Ссылка) > 1

ИНДЕКСИРОВАТЬ ПО
	Дата
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот