|   |   | 
| 
 | Как правильно обойти элементы в связке многие-ко-многим? Garykom, RomanYS, АгентБезопаснойНацио, Михаил Козлов, PR, RVN, Fedor-1971, Bigbro, Группа неравнодушных, Terrixus, Redaktor, ndrv, глазковыколупыватель, Lazy Stranger, 2S, craxx, Seriy_Volk, T32, piter3, maxab72, alexela, DrZombi, phabeZ, H A D G E H O G s, strange2007, Масянька, privetik, vicof, Hawk_1c, Mafiozaa, СвинТуз, AntiBuh, mmg, abfm, Ёпрст, Буковка, nick86, Rovan, Zapal, dimm7310, bushd, elka302, Chameleon1980 | ☑ | ||
|---|---|---|---|---|
| 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 поисков норм результат?     
 | |||
| 25
    
        RomanYS 28.05.25✎ 12:03 | 
        (22) а вот поиск по аналогичному массиву (1 млн элементов) в 3000 медленнее     
 | |||
| 26
    
        Garykom гуру 28.05.25✎ 12:10 | 
        (23) (24) нормальный, пойдет
 Соответствие в 1С это индексированная HashMap по сути | |||
| 27
    
        Garykom гуру 28.05.25✎ 12:11 | 
        (25) угу как раз к Массив.Найти у меня была претензия     | |||
| 28
    
        Garykom гуру 28.05.25✎ 12:18 | 
        (25) проверь еще:
 &НаСервере Процедура Команда2НаСервере() М1 = Новый Массив; ГСЧ = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах()); Для Сч = 1 По 100000 Цикл М1.Добавить(ГСЧ.СлучайноеЧисло(1, 2000000)); КонецЦикла; ММ = Новый Массив(3000000); Для Сч = 1 По 1000000 Цикл ММ[ГСЧ.СлучайноеЧисло(1, 2000000)] = Истина; КонецЦикла; Для Сч = 0 По 99999 Цикл Рез = ММ[М1[Сч]] <> Неопределено; КонецЦикла; КонецПроцедуры | |||
| 29
    
        RomanYS 28.05.25✎ 12:49 | 
        (28) такой вариант в два раза быстрее соответствия. Но ограничения слишком жесткие:
 - ИД тольео неотрицательные целые числа - память придётся пропорционально максимальному значению ИД, а не их реальному количеству. | |||
| 30
    
        Garykom гуру 28.05.25✎ 12:57 | 
        (29) на самом деле такой вариант не в два раза а примерно на порядок быстрее
 просто в 1С массивы по сути связные списки а не обычные простейшие массивы в выделенной памяти | |||
| 31
    
        Garykom гуру 28.05.25✎ 13:00 | 
        (29)
 - ИД тольео неотрицательные целые числанет, можно любые даже строки привести к целым - память придётся пропорционально максимальному значению ИД, а не их реальному количеству.в реальных задачах ИД обычно последовательные | |||
| 32
    
        RomanYS 28.05.25✎ 13:02 | 
        (30) Ну мы же про 1С говорим. Для массива типизированных значений (не 1С) понятно, что сложность получения по индексу массива O(1), а сложность проверки по map O(log(N))     | |||
| 33
    
        Garykom гуру 28.05.25✎ 13:03 | 
        (32) угу я пробовал в 1С вместо массива заюзать COMSafeArray
 получилась какая-то хрень | |||
| 34
    
        RomanYS 28.05.25✎ 13:05 | 
        (31) "в реальных задачах ИД обычно последовательные"
 ХЗ. В типовых уже полно мест, где в качестве ИД используется ГУИД. В общем использование соответствия для многочисленного поиска можно считать отраслевым стандартом | |||
| 35
    
        Garykom гуру 28.05.25✎ 13:06 | 
        (34) хе, насчет УИД
 попробуй свой код на УИДах вместо целых ID | |||
| 36
    
        RomanYS 28.05.25✎ 13:18 | 
        (35) Какие-то сомнения? Соответствия будут работать     | |||
| 37
    
        Garykom гуру 28.05.25✎ 13:19 | 
        (36) конечно будут, только тормозней     | |||
| 38
    
        RomanYS 28.05.25✎ 13:23 | 
        (37) Ничего подобного 0.23 секунды     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |