Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Итерация по соответствию на платформе 8.3.18.1363 идёт в обратном порядке

Итерация  по соответствию на платформе 8.3.18.1363 идёт в обратном порядке
Я
   sapphire
 
14.08.21 - 00:49
При итерировании соответствия порядок в коллекции обратный, т.е. сначала идёт последний элемент коллекции
Ы=Новый Соответствие();
Для а=1 по 10 Цикл
  Ы.Вставить( а);
КонецЦикла;

Для Каждого КлючИЗначение Из Ы Цикл
  Сообщить(КлючИЗначение.Ключ);
КонецЦикла;
Если сделать тоже самое для структуры, то будет по мере добавления.
   TormozIT
 
1 - 14.08.21 - 07:35
В 8.3.19 тоже получаю такой порядок.
В 8.3.12 и ниже, 8.2, 8.1, 8.0 - это неверно.
Порядок этот не гарантирован и может быть нестабильным даже в одной версии платформы.
Если важен порядок обхода, то нужно использовать таблицу значений. Тогда будет всегда и везде работать как заложишь.
   ДенисЧ
 
2 - 14.08.21 - 07:41
Соответствие НИКОГДА не гарантирует порядка итерации.
Если тебе нужен именно порядок - используй более другие коллекции, например, список, массив или ТЗ.
   vi0
 
3 - 14.08.21 - 07:44
(0) если в документации порядок не описан то на него нельзя закладываться, даже если он есть
   Вафель
 
4 - 14.08.21 - 09:24
Поменяли получается функцию хэша.
Ведь внутри соответствия все равно лежит массив
   mistеr
 
5 - 14.08.21 - 10:04
В Go эту проблему решили кардинально: итерация выдает элементы в случайном порядке. Это очень быстро отучило всех закладываться на порядок итерации.

Надо бы и 1С так сделать. Не в ущерб производительности, конечно.

P.S. Странно, почему об этом говорю я, а не наш Go евангелист. :)
   Волшебник
 
Модератор
6 - 14.08.21 - 10:06
(4) Это вряд ли...

(5) Оригинально
   mistеr
 
7 - 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) Вафель херни не скажет, даже не смотря на то, что там лежит дерево)
   Yardman
 
12 - 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) какое дерево. это же хэш мап. хэш функция дает индекс массива
   mistеr
 
15 - 14.08.21 - 12:18
(14) Хеш мап несколько сложнее массива.
   mistеr
 
16 - 14.08.21 - 12:23
(12) Фиксированный порядок обхода это дополнительные накладные расходы. И невозоможность заменить реализацию на более оптимальную в будущем.

Для случаев, когда порядок обхода важен, есть другие коллекции.
   Злопчинский
 
17 - 14.08.21 - 13:24
А для чего для соответствия ключ-значение должен быть фиксированный порядок обхода? зачем?
   acanta
 
18 - 14.08.21 - 13:26
Не понимаю - если есть обход, то почему его порядок случайный?
   Злопчинский
 
19 - 14.08.21 - 13:52
(18) э, это уже частности! давайте от общего к частностям.
обход - то бишь перебор - может быть и фиксированным и случайным. Почему для ключ-значение НУЖЕН фиксированный? практический смысл?
   acanta
 
20 - 14.08.21 - 13:57
Не понимаю. Если перебор случайный, зачем вообще ключ-значение в СУБД?
   acanta
 
21 - 14.08.21 - 13:59
Или точнее зачем нужен перебор, если есть ключ-значение.
   acanta
 
22 - 14.08.21 - 14:04
Грубо говоря - если в системе ЭТОТ объект использует метод ДЛЯ КАЖДОГО, то каждый следующий в ОДНОМ обходе должен соответствовать каждому следующему в ДРУГОМ обходе. Почему нет?
   Вафель
 
23 - 14.08.21 - 14:23
В 1с не случайный, но не совпадает с порядком добавления.
   mistеr
 
24 - 14.08.21 - 15:58
(22) А почему да?

А - абстракция.
   mistеr
 
25 - 14.08.21 - 15:59
Бывают коллекции вообще без обхода.
   acanta
 
26 - 14.08.21 - 20:15
Сорян, погорячилась.
   oslokot
 
27 - 14.08.21 - 21:05
Порядок в соответствиях зависит от фазы Луны, давно известный факт
   VS-1976
 
28 - 14.08.21 - 21:26
(0) Скорее всего это происходит из-за того, что память выделяется постепенно. В каждом элементе коллекции есть ссылка на предыдущий элемент ( что бы уменьшить объём выделения памяти ) и так мы имеем:

Ы -> Ссылка на структуру последний элемент.

Последний элемент
   Ключ,
   Значение
   Ссылка на предпоследний

... Куски занятой памяти

Предпоследний элемент
   Ключ,
   Значение
   Ссылка на Предпоследний элемент - 1

...

По этому перебор идёт так от последнего, хотя соответствие по идее имеет по идее ещё и упорядоченный индекс, могли бы брать элементы и от туда...
   VS-1976
 
29 - 14.08.21 - 21:58
(28) По идее должно быть так:

Структура это 2 массива
1-й массив это упорядоченный ключ

2-й массив ( условно ) это хранящиеся значения. Что бы в случае замещения значения с имеющимся ключём освободить память значения, выделить новый кусок памяти под новое значение ( плавающее по размеру ).

Элемент ключа
Ссылка на предыдущий элемент
Ссылка на Значение

Почему так:

Да по тому что вставляя элемент ищется куда его вставить для упорядочивания ключа

1. Выделяется свободный кусок памяти.
Далее ищется куда в цепочке засунуть новый элемент
Прописываются ссылка в зависимости от вставки
Ссылка разрываемого элемента корректируется

В те элемент, который разрывается корректируем ссылку:

Элемент 1
Элемент 3

Вставляем элемент 2 к примеру:

Так как Элемент 3 ссылается на Элемент 1 и нужно это подправить ( данные в памяти разумеется никто не передвигает ):

Элемент 1 <------+
                 |
Элемент 3------+ |
               | |
+-- Элемент 2<-+ |
+----------------+

PS: Обычно "узлы" знают предшественника и последующий элемент, что бы по структуре можно было гулять в разные стороны...
   VS-1976
 
30 - 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/
   acanta
 
34 - 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. А за такое по рукам линейкой шлёпают.
   tgu82
 
38 - 15.08.21 - 10:46
Помнится в ТП 5.5 успешно пользовался кучей и указателями. Можно было такие фишки выделывать, такую настраиваемость универсальность создавать при решении задач а главное всем управляешь сам - вплоть до оверлеев и до ассемблерных вставок. Это была Жизнь :)
   tgu82
 
39 - 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) Жизнь была на Ассемблере только, остальное все - извращения нетолерантные... ;-)
   welwel
 
43 - 15.08.21 - 11:45
(1) а для массивов при переборе элементов в цикле Для каждого порядок тоже может отличаться от цикла Для i=0 и получения элементов через А[i]?
   ДенисЧ
 
44 - 15.08.21 - 11:52
(43) Массив гарантирует последовательность.
   ДедМорроз
 
45 - 16.08.21 - 21:42
(37) А в чем проблема?
Вполне реальные задачи - перебрать коллекцию и добавить что-то в нее же.
При нормальной реализации,проблем быть не должно,даже при удалении перебираемого элемента.
Но,все используют кривую реализацию и потом говорят,что так нельзя.
   NorthWind
 
46 - 16.08.21 - 21:50
(0) А где-то обещали порядок? "Для каждого" озачает, что каждый элемент будет извлечен внутрь операторных скобок цикла, но что это будет в определенном порядке - где это обещали? Покажите мне это место в доке.
   acanta
 
47 - 16.08.21 - 21:52
А повторно уже ранее полученный элемент может быть?
   NorthWind
 
48 - 16.08.21 - 21:55
(47) нет. Каждый элемент один раз. Но порядок может быть произвольным, т.е. может быть подряд, может быть обратный, может быть и случайный.
   BeerHelpsMeWin
 
49 - 16.08.21 - 22:18
(0) А что не так?
Хотите упорядочивание - используйте конструкции, где есть упорядочивание.
   BeerHelpsMeWin
 
50 - 16.08.21 - 22:19
а так это как в "выбрать первые 1 из ...." без упорядочивания, вот всегда возвращалась правильная ссылка, а теперь неправильная!!!! ПЛОХАЯ 1С НЕГОДНАЯ


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.