|   |   | 
| 
 | Итерация по соответствию на платформе 8.3.18.1363 идёт в обратном порядке | ☑ | ||
|---|---|---|---|---|
| 0
    
        sapphire 14.08.21✎ 00:49 | 
        При итерировании соответствия порядок в коллекции обратный, т.е. сначала идёт последний элемент коллекции
 Ы=Новый Соответствие(); Для а=1 по 10 Цикл Ы.Вставить( а); КонецЦикла; Для Каждого КлючИЗначение Из Ы Цикл Сообщить(КлючИЗначение.Ключ); КонецЦикла; Если сделать тоже самое для структуры, то будет по мере добавления. | |||
| 1
    
        TormozIT гуру 14.08.21✎ 07:35 | 
        В 8.3.19 тоже получаю такой порядок.
 В 8.3.12 и ниже, 8.2, 8.1, 8.0 - это неверно. Порядок этот не гарантирован и может быть нестабильным даже в одной версии платформы. Если важен порядок обхода, то нужно использовать таблицу значений. Тогда будет всегда и везде работать как заложишь. | |||
| 2
    
        ДенисЧ 14.08.21✎ 07:41 | 
        Соответствие НИКОГДА не гарантирует порядка итерации.
 Если тебе нужен именно порядок - используй более другие коллекции, например, список, массив или ТЗ. | |||
| 3
    
        vi0 14.08.21✎ 07:44 | 
        (0) если в документации порядок не описан то на него нельзя закладываться, даже если он есть     | |||
| 4
    
        Вафель 14.08.21✎ 09:24 | 
        Поменяли получается функцию хэша. Ведь внутри соответствия все равно лежит массив | |||
| 5
    
        mistеr 14.08.21✎ 10:04 | 
        В Go эту проблему решили кардинально: итерация выдает элементы в случайном порядке. Это очень быстро отучило всех закладываться на порядок итерации.
 Надо бы и 1С так сделать. Не в ущерб производительности, конечно. P.S. Странно, почему об этом говорю я, а не наш Go евангелист. :) | |||
| 6
    
        Волшебник модератор 14.08.21✎ 10:06 | 
        (4) Это вряд ли...
 (5) Оригинально | |||
| 7
    
        mistеr 14.08.21✎ 10:08 | 
        (4) Инфа 100%?     | |||
| 8
    
        Чинухов 14.08.21✎ 10:09 | 
        (5) Ну так и в 1С тоже в псевдослучайном порядке выдаёт :)     | |||
| 9
    
        ДенисЧ 14.08.21✎ 10:09 | 
        (5) Любая итерация? Расстрелять за это.     | |||
| 10
    
        Жан Пердежон 14.08.21✎ 10:35 | 
        (0) для структуры этот код работать не будет     | |||
| 11
    
        Жан Пердежон 14.08.21✎ 10:43 | 
        (7) Вафель херни не скажет, даже не смотря на то, что там лежит дерево)     | |||
| 12
    
        Yardman 14.08.21✎ 10:51 | 
        (4) Внутри соответствия лежит std::unordered_map
 Конечно, можно сказать что бакеты это массив - ну тогда в платформе внутри всего лежат массивы. Ведь любой кусок памяти это массив... (5) Это какой-то дебильный способ решения. Нормальный, например - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/LinkedHashMap.html Порядок обхода соответствует порядку добавления. | |||
| 13
    
        Жан Пердежон 14.08.21✎ 10:54 | 
        (12) std::unordered_map в веб-клиенте? чем смотрел, что курил?     | |||
| 14
    
        Вафель 14.08.21✎ 11:25 | 
        (11) какое дерево. это же хэш мап. хэш функция дает индекс массива     | |||
| 15
    
        mistеr 14.08.21✎ 12:18 | 
        (14) Хеш мап несколько сложнее массива.     | |||
| 16
    
        mistеr 14.08.21✎ 12:23 | 
        (12) Фиксированный порядок обхода это дополнительные накладные расходы. И невозоможность заменить реализацию на более оптимальную в будущем.
 Для случаев, когда порядок обхода важен, есть другие коллекции. | |||
| 17
    
        Злопчинский 14.08.21✎ 13:24 | 
        А для чего для соответствия ключ-значение должен быть фиксированный порядок обхода? зачем?     | |||
| 18
    
        acanta 14.08.21✎ 13:26 | 
        Не понимаю - если есть обход, то почему его порядок случайный?     | |||
| 19
    
        Злопчинский 14.08.21✎ 13:52 | 
        (18) э, это уже частности! давайте от общего к частностям.
 обход - то бишь перебор - может быть и фиксированным и случайным. Почему для ключ-значение НУЖЕН фиксированный? практический смысл? | |||
| 20
    
        acanta 14.08.21✎ 13:57 | 
        Не понимаю. Если перебор случайный, зачем вообще ключ-значение в СУБД?     | |||
| 21
    
        acanta 14.08.21✎ 13:59 | 
        Или точнее зачем нужен перебор, если есть ключ-значение.     | |||
| 22
    
        acanta 14.08.21✎ 14:04 | 
        Грубо говоря - если в системе ЭТОТ объект использует метод ДЛЯ КАЖДОГО, то каждый следующий в ОДНОМ обходе должен соответствовать каждому следующему в ДРУГОМ обходе. Почему нет?     | |||
| 23
    
        Вафель 14.08.21✎ 14:23 | 
        В 1с не случайный, но не совпадает с порядком добавления.     | |||
| 24
    
        mistеr 14.08.21✎ 15:58 | 
        (22) А почему да?
 А - абстракция. | |||
| 25
    
        mistеr 14.08.21✎ 15:59 | 
        Бывают коллекции вообще без обхода.     | |||
| 26
    
        acanta 14.08.21✎ 20:15 | 
        Сорян, погорячилась.     | |||
| 27
    
        oslokot 14.08.21✎ 21:05 | 
        Порядок в соответствиях зависит от фазы Луны, давно известный факт     | |||
| 28
    
        VS-1976 14.08.21✎ 21:26 | 
        (0) Скорее всего это происходит из-за того, что память выделяется постепенно. В каждом элементе коллекции есть ссылка на предыдущий элемент ( что бы уменьшить объём выделения памяти ) и так мы имеем:
 Ы -> Ссылка на структуру последний элемент. Последний элемент Ключ, Значение Ссылка на предпоследний ... Куски занятой памяти Предпоследний элемент Ключ, Значение Ссылка на Предпоследний элемент - 1 ... По этому перебор идёт так от последнего, хотя соответствие по идее имеет по идее ещё и упорядоченный индекс, могли бы брать элементы и от туда... | |||
| 29
    
        VS-1976 14.08.21✎ 21:58 | 
        (28) По идее должно быть так:
 Структура это 2 массива 1-й массив это упорядоченный ключ 2-й массив ( условно ) это хранящиеся значения. Что бы в случае замещения значения с имеющимся ключём освободить память значения, выделить новый кусок памяти под новое значение ( плавающее по размеру ). Элемент ключа Ссылка на предыдущий элемент Ссылка на Значение Почему так: Да по тому что вставляя элемент ищется куда его вставить для упорядочивания ключа 1. Выделяется свободный кусок памяти. Далее ищется куда в цепочке засунуть новый элемент Прописываются ссылка в зависимости от вставки Ссылка разрываемого элемента корректируется В те элемент, который разрывается корректируем ссылку: Элемент 1 Элемент 3 Вставляем элемент 2 к примеру: Так как Элемент 3 ссылается на Элемент 1 и нужно это подправить ( данные в памяти разумеется никто не передвигает ): Элемент 1 <------+ | Элемент 3------+ | | | +-- Элемент 2<-+ | +----------------+ PS: Обычно "узлы" знают предшественника и последующий элемент, что бы по структуре можно было гулять в разные стороны... | |||
| 30
    
        VS-1976 14.08.21✎ 22:07 | 
        (27) Скорее всего из ходя из домыслов в (29). Соответствие тупо выбирается из упорядоченного массива     | |||
| 31
    
        Злопчинский 14.08.21✎ 22:25 | 
        (21) вот именно, это и интересно.     | |||
| 32
    
        Хосе 14.08.21✎ 22:32 | 
        (0) а никто и не обещал     | |||
| 33
    
        Хосе 14.08.21✎ 22:33 | 
        Вот например: https://infostart.ru/public/117041/     | |||
| 34
    
        acanta 15.08.21✎ 08:26 | 
        Вероятно, обсуждается работа с ключ-значение внутри запросов и всякие соединения с данными и временными таблицами?     | |||
| 35
    
        ДедМорроз 15.08.21✎ 08:38 | 
        ХэшФункция никогда не дает однозначности
 Будет массив хэшей и массив массивов значений хэшей. Что касается самих значений,то размер переменной в любом языке фиксирован,что не влезло (строки,объекты и т.п.) хранятся в отдельной памяти. Опять же,реализация через одно или двухсвязные списки - это самое простое,но в реальности,проще работать с блоками памяти,причем или фиксированного размера или нескольких фиксированных размеров,тогда фрагментация памяти меньше влияет на производительность. Сделать перебор в случайном порядке - сложно,а вот начать перебор с текущего элемента можно. И порядок элементов позволяет в процессе перебора добавлять элементы в коллекцию,зная,что они будут в конце. Если этого нет,то добавление элемента в процессе перебора будет приводить к странным последствиям. | |||
| 36
    
        Хосе 15.08.21✎ 09:47 | 
        (35) но ведь 1с не обещала порядок перебора? Значит на это рассчитывать нельзя     | |||
| 37
    
        ДенисЧ 15.08.21✎ 09:51 | 
        (35) Изменение перебираемой коллекции в общем случае - UB. А за такое по рукам линейкой шлёпают.     | |||
| 38
    
        tgu82 15.08.21✎ 10:46 | 
        Помнится в ТП 5.5 успешно пользовался кучей и указателями. Можно было такие фишки выделывать, такую настраиваемость универсальность создавать при решении задач а главное всем управляешь сам - вплоть до оверлеев и до ассемблерных вставок. Это была Жизнь :)     | |||
| 39
    
        tgu82 15.08.21✎ 10:48 | 
        (38)+ Хотя в 1с все это же присутствует в т.ч. в виде внешних компонент.     | |||
| 40
    
        ДенисЧ 15.08.21✎ 11:31 | 
        (38) В ТП5 оверлеии и ассемблер были искаропки.     | |||
| 41
    
        Злопчинский 15.08.21✎ 11:33 | 
        (38) а в Фортране можно было оверлеи делать на области данных...     | |||
| 42
    
        Злопчинский 15.08.21✎ 11:34 | 
        (38) Жизнь была на Ассемблере только, остальное все - извращения нетолерантные... ;-)     | |||
| 43
    
        welwel 15.08.21✎ 11:45 | 
        (1) а для массивов при переборе элементов в цикле Для каждого порядок тоже может отличаться от цикла Для i=0 и получения элементов через А[i]?     | |||
| 44
    
        ДенисЧ 15.08.21✎ 11:52 | 
        (43) Массив гарантирует последовательность.     | |||
| 45
    
        ДедМорроз 16.08.21✎ 21:42 | 
        (37) А в чем проблема?
 Вполне реальные задачи - перебрать коллекцию и добавить что-то в нее же. При нормальной реализации,проблем быть не должно,даже при удалении перебираемого элемента. Но,все используют кривую реализацию и потом говорят,что так нельзя. | |||
| 46
    
        NorthWind 16.08.21✎ 21:50 | 
        (0) А где-то обещали порядок? "Для каждого" озачает, что каждый элемент будет извлечен внутрь операторных скобок цикла, но что это будет в определенном порядке - где это обещали? Покажите мне это место в доке.     | |||
| 47
    
        acanta 16.08.21✎ 21:52 | 
        А повторно уже ранее полученный элемент может быть?     | |||
| 48
    
        NorthWind 16.08.21✎ 21:55 | 
        (47) нет. Каждый элемент один раз. Но порядок может быть произвольным, т.е. может быть подряд, может быть обратный, может быть и случайный.     | |||
| 49
    
        BeerHelpsMeWin 16.08.21✎ 22:18 | 
        (0) А что не так?
 Хотите упорядочивание - используйте конструкции, где есть упорядочивание. | |||
| 50
    
        BeerHelpsMeWin 16.08.21✎ 22:19 | 
        а так это как в "выбрать первые 1 из ...." без упорядочивания, вот всегда возвращалась правильная ссылка, а теперь неправильная!!!! ПЛОХАЯ 1С НЕГОДНАЯ     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |