Имя: Пароль:
1C
 
Как правильно обойти элементы в связке многие-ко-многим?
0 1сПупс
 
26.05.25
15:28
привет!
Есть табличная часть документа Заказ в производство (в которой есть колонки ID и значение), и есть массив значений ( содержащий только ID). Как правильно обойти элементы ТЧ чтобы все строки с совпадающими ID получили значение 1 (скрин)?

Если бы табличная часть сравнивалась с одним элементом массива, была бы связь один ко многим (один элемент массива к строкам ТЧ). Тут все легко. А Как действовать в случае связи многие ко многим?

Обходить ТЧ и внутри каждого элемента ТЧ делать цикл на сравнение с одним из элементов массива?
1 maxab72
 
26.05.25
15:31
Обходить массив значений а строки из Заказа отбирать по фильтру по ИД.
2 H A D G E H O G s
 
26.05.25
15:32
MergeJoin
5 Fedor-1971
 
27.05.25
10:50
(0) Не совсем понятно что нужно
1. Есть массив ИД
2. Есть таблица значений (ТЧ Заказа в производство) с ИД и Значением

Что собрался делать?
Заполнять некую другую ТЧ по ИД выдавать там значение из п.2?
Проверять, что для ИД из п.1 заполнены все значения в таблице из п.2? (решение предложено в (1))
8 СвинТуз
 
27.05.25
14:22
Если обойти, а не загнать в запрос,
то видимо "НайтиСтроки"
9 СвинТуз
 
27.05.25
14:23
Можно отсортировать по ключу и идти синхронно по двум таблицам
10 СвинТуз
 
27.05.25
14:24
+ тупой перебор
11 СвинТуз
 
27.05.25
14:25
Итого как минимум четыре способа
Есть и еще
"Барометр" короче от Нильса Бора
12 Garykom
 
гуру
27.05.25
14:30
(9) Сортировка это тоже затраты
13 Garykom
 
гуру
27.05.25
15:21
(0) Засунуть массив в ТЗ, передать в запрос, соединить
14 Garykom
 
гуру
27.05.25
14:33
(13)+ Хотя парю, если надо просто 1 для совпадающих строк то прямо массив передаем в запрос
И делаем условие ID В(&Массив)
15 H A D G E H O G s
 
27.05.25
14:33
(9) Это называется СоединениеСлиянием, MergeJoin.
Вот тут даже алгоритм есть, прям на русском.
wiki:Алгоритм_соединения_слиянием_сортированных_списков
16 Garykom
 
гуру
27.05.25
14:34
(15) Еще один
А затраты на сортировку???
17 Garykom
 
гуру
27.05.25
14:42
Для целочисленных ID при наличии дофига памяти и (Макс(ID)-Мин(ID)) укладывается в нее
Наиболее быстрый алгоритм это однопроходный алгоритм на простых массивах (не которые 1С а напрямую в памяти)
Сначала по массиву значений, пишем 1 в ПростойМассив[ID]
Затем по ТЧ, тупо смотрим ?(ПростойМассив[ID] = 1, 1, 0)
18 СвинТуз
 
28.05.25
09:12
(17)
Типа соответствие? Номер строки в первой ключ. Значение массив строк во второй. Или массив номеров?
19 RomanYS
 
28.05.25
09:58
1. Простейший вариант. ТЧ обходим, в массиве ищем (Мас.Найти(...))
1+. Тоже самое, но массив заменяем на соотвествие
2. Если значений в массиве заведомо мало (это не случай из (0)). Обходим массив и ТЧ.НайтиСтроки()
3,4... Мерджи, соединение запросом и прочее. Тоже не случай ТС
20 Garykom
 
гуру
28.05.25
11:24
(19) поиск в массиве или соответствии с 5 лямов элементов?
обрати внимание на ID в (0)
21 RomanYS
 
28.05.25
11:30
(20) То, что макс. значение ID 5+ млн, вовсе не означает, что столько значений в выборке.
При 5 млн строк речи про ТЧ бы вообще не было.
Ну и в соответствии это будет вполне приемлемо, если конечно не повторять 5 млн раз)
22 Garykom
 
гуру
28.05.25
11:33
(21) допустим в ТЧ 100к строк
а в массиве значений с ID 1 лям элементов

?
23 RomanYS
 
28.05.25
11:48
(22)
24 RomanYS
 
28.05.25
11:49
(22) 0.27 секунд на 100000 поисков норм результат?
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший