Имя: Пароль:
1C
1С v8
ошибка перебора соответствия на платформе 8.3.17.1851
0 kauksi
 
11.02.21
15:19
Если выполнить следующий код на платформе 8.3.17.1851

                СведенияПоСерии = Новый Соответствие;
                
                НомерСтроки=1;
                
                Для Н=1 По 100 Цикл
                              
                               СведенияПоСтроке = Новый Структура;
                               СведенияПоСтроке.Вставить("НомерСтроки",НомерСтроки);
                              
                               СведенияПоСерии.Вставить(НомерСтроки,СведенияПоСтроке);
                               НомерСтроки = НомерСтроки + 1;
                
                КонецЦикла;    
                
                
                
                Для Каждого Стр Из СведенияПоСерии Цикл
                                  Выборка = Стр.Значение;
                                  Сообщить(Выборка.НомерСтроки);
                КонецЦикла;      

То результатом будет

9
65
1
2
3
4
5
6
7
8
10
11

Т.е. перебор элементов соответствия идет не в том порядке, с цифры 9

На платформах 8.3.10.2699 и 8.3.18.1208 поведение ожидаемо

10
9
8
7
6
5
4
3
2
1

проблема проявляется, когда размер соответствия больше 9ти
1 Престарелый Заяц
 
11.02.21
15:21
А че он должен быть в каких то порядках ?
2 d4rkmesa
 
11.02.21
15:22
(0) Порядок элементов же не гарантирован? Да, для каких-то простых ключей порядок сохранялся, в отдельных случаях, но он не был никогда гарантирован.
3 kauksi
 
11.02.21
15:23
Ну если это массив в памяти, то первым ожидается элемент, добавленный последним.
4 kauksi
 
11.02.21
15:24
короче это фича... но в некоторых конфигурациях приводит к тому что первой печатается строка 9 а не 1
5 Ненавижу 1С
 
гуру
11.02.21
15:25
(0) даже в СП написано, что порядок перебора не гарантирован
6 Почему 1С
 
11.02.21
15:26
(4) Используй Массив вместо соответствия
7 kauksi
 
11.02.21
15:32
(6)Да эт понятно, я так не пишу, просто у клиента вылезло именно на этой платформе...

К элементам некоторым коллекций в 1С:Предприятии 8 можно обращаться с помощью числового индекса. Для таких коллекций перебор элементов может осуществляться и итератором, и с помощью индекса. Примером такой коллекции является Массив.

Однако для некоторых коллекций обращение по индексу недоступно, так как коллекция не имеет определенной последовательности. В этих случаях итератор "Для каждого..." позволяет обойти коллекцию. Однако это не значит, что порядок выдачи элементов при обходе коллекции будет являться порядком элементов в коллекции. Если коллекция неупорядочена, то порядок обхода итератором "Для каждого..." в общем виде не определен, то есть может быть любым. Соответственно, для таких коллекций нельзя опираться на этот порядок в алгоритмах использующих коллекцию. Примером такой коллекции является Соответствие.
8 Ненавижу 1С
 
гуру
11.02.21
16:20
(7) ну и? для таких коллекций просто нет понятия порядка
9 Cyberhawk
 
11.02.21
16:37
(8) Чем "в порядке добавления" не порядок?
10 Вафель
 
11.02.21
16:42
порядок есть, но это порядок индексов от хэшей,
но никак не порядок добавления
11 Ненавижу 1С
 
гуру
11.02.21
18:39
(9) тем, что Структура его не хранит, а так придумать разных порядков можно
12 ДенисЧ
 
11.02.21
19:27
Перечисление это не массив. В нём нет порядка.
13 Сияющий в темноте
 
11.02.21
22:28
если в соответствие добавлять строковые ключи,то они очень забавно пляшут в порядке следования.
ну,и то,что в разных платформах разный порядок говорит,что они используют разную оптимизацию при хранении.
14 Cyberhawk
 
12.02.21
11:22
(11) Я "не хранит порядок" и "нет понятия порядка" трактую по-разному
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.