Неожиданная последовательность выделенных строк в табличной части

17.02.26

Разработка - Механизмы платформы 1С

Столкнулся с неочевидным поведением платформы при сортировке массива выделенных строк в табличной части.

Коллеги, всем привет!

Столкнулся я тут с интересной и совсем не очевидной ситуацией) На всякий случай напишу, вдруг кому пригодится)

При работе с выделенными строками таблицы, как известно, мы их можем получить через свойство элемента "ВыделенныеСтроки", где хранится список индексов всех строк, которые были выделены.

Далее мы получаем сами строки через поиск по идентификатору.

Небольшой пример:

ВыбранныеСтроки = Новый Массив;

Для каждого ИндексСтроки Из Элементы.Продукция.ВыделенныеСтроки Цикл

     ВыбранныеСтроки.Добавить(Объект.Продукция.НайтиПоИдентификатору(ИндексСтроки));

КонецЦикла;

И вот тут-то и всплыл интересный момент.

Если вам важно сохранить последовательность выделенных строк именно такой, в которой они идут в документе, то нужно, чтобы текущая строка была первой или последней в выделенном диапазоне!

В моём случае была ситуация, когда выделенные строки должны были обрабатываться последовательно. Результат обработки первой выделенной строки влиял на алгоритм обработки следующей строки.

Каково же было моё удивление, когда, выделяя ОДИНАКОВУЮ последовательность строк и нажимая на одну и ту же кнопку, пользователи начали получать РАЗНЫЕ результаты.

Оказывается, платформа ставит текущую строку первой в списке выделенных. И это поведение совершенно не очевидно для пользователей.

Кто-то стоял на 4 строке таблицы, а потом нажат Ctrl + A и выделил всю таблицу.

 

 

Для него массив выделенных строк будет выглядеть так (нумерация индексов начинается с 0):

3, 0, 1, 2, 4

 

 

Кто-то выделил строки , находясь на 2 строке.

 

 

Для него массив выделенных строк будет такой:

1, 0, 2, 3, 4

 

 

Но это правило не работает, если мы находимся на последней строке выделенной области.

 

 

В таком случае последовательность корректная.

 

 

Следить за такой мелочью – очень сложно. Если от такой мелочи меняется результат расчёта – это катастрофа.

Как я выкрутился из положения:

  1. Создал таблицу значений
  2. Заполнил её индексами всех выбранных строк.
  3. Отсортировал таблицу значений по возрастанию индексов
  4. Уже перебирая отсортированные индексы в таблице значений, сформировал массив выбранных строк для дальнейшей обработки.
ТЗВыбранныхСтрок = Новый ТаблицаЗначений;
ТЗВыбранныхСтрок.Колонки.Добавить("НомерИндекса");

Для каждого ИндексСтроки Из Элементы.Продукция.ВыделенныеСтроки Цикл

     НС = ТЗВыбранныхСтрок.Добавить();
     НС.НомерИндекса = ИндексСтроки;   

КонецЦикла;

ТЗВыбранныхСтрок.Сортировать("НомерИндекса Возр");

ВыбранныеСтроки = Новый Массив;

Для каждого Строка Из ТЗВыбранныхСтрок Цикл

     ВыбранныеСтроки.Добавить(Объект.Продукция.НайтиПоИдентификатору(Строка.НомерИндекса));          

КонецЦикла;

В общем, как-то так… Костыли на пустом месте приходится сооружать)) Если кому-то поможет в будущем, буду рад) Всем удачи!

Вступайте в нашу телеграмм-группу Инфостарт

Выделенные строки табличная часть

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    28725    TitanLuchs    106    

148

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    15720    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    18236    user2122906    9    

64

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    29008    dsdred    89    

144

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    26173    bayselonarrend    22    

175

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    14190    dsdred    22    

85
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1587 17.02.26 16:48 Сейчас в теме
Синтакс-помощник и документация 1С не обещают то, что коллекция ВыделенныеСтроки будет упорядочена абсолютно в том же порядке сортировки, что и у пользователя
kalyaka; ardn; akR00b; qwinter; +4 Ответить
2. XilDen 785 17.02.26 16:55 Сейчас в теме
(1) Всё верно, но многие ли об этом знают? Подсветить такой неочевидный момент совсем не лишним будет)
BiboMiho; user2125207; RustIG; +3 Ответить
40. StanislavA86 24.02.26 09:30 Сейчас в теме
(2) тоже столкнулся с такой неприятностью. Заметил, что при выделении шифтом, первая строка становится последней. При выделении котнрл. Все ок. Пришлось выворачиваться, отслеживать значение идентификатора последней строки, и в случае пересорта, копировать последнюю строку в начало и удалять последнюю строку
4. RustIG 1942 17.02.26 19:04 Сейчас в теме
(1) а есть примеры, где синтакс-помощник что-то обещает? И в частности сохранение какой-либо последовательности?
EvgeniyOlxovskiy; ixijixi; +2 Ответить
5. RustIG 1942 17.02.26 19:11 Сейчас в теме
(1) в быту и в жизни, что-то есть или чего-то нет. А в программировании появляется еще одна сущность Неопределено - когда информации нет об объекте. Так вот СП либо обещает, либо не обещает, либо неопределено - когда самим проверять надо.
6. RustIG 1942 17.02.26 19:19 Сейчас в теме
(1) кто читает про коллекции именно документацию 1С ? достаточно СП...Артур, не понятен ваш комментарий выше...
29. starik-2005 3213 18.02.26 16:09 Сейчас в теме
(1) Идентификатор может быть любым в принципе. Это хорошо видно, когда данные в таблице постоянно изменяются.
3. MiniMuk 10 17.02.26 17:10 Сейчас в теме
Про текущую строку первой постоянно сталкиваюсь когда копирую в эксель.
Сильно надо по порядку, есть порядковый номер строки.
starik-2005; +1 Ответить
7. RustIG 1942 17.02.26 19:21 Сейчас в теме
(3)
Сильно надо по порядку, есть порядковый номер строки.
то есть после выделения строк вы предлагаете сортировать по номеру строки?
32. kalyaka 1146 18.02.26 18:32 Сейчас в теме
(7) если требуется порядок, то так и нужно сделать. Т.е. если по задаче требуется порядок, то нужна сортировка обязательно
8. RustIG 1942 17.02.26 19:29 Сейчас в теме
(0) СП ни в одном из примеров ни о чем не предупреждает и ничего не обещает.
Кто заранее правильно скажет, в каких случаях сортировка записей сохраняется?
1. ТЗ = ТаблЧасть.Выгрузить();
2. ТЗ = РезультатЗапроса.Выгрузить();
3. ТЗ = ТаблЗначений.Скопировать();
13. RustIG 1942 17.02.26 22:26 Сейчас в теме
(9)
Что вы скажете по вопросу из сообщения (8) :
Кто заранее правильно скажет, в каких случаях сортировка записей сохраняется?
1. ТЗ = ТаблЧасть.Выгрузить();
2. ТЗ = РезультатЗапроса.Выгрузить();
3. ТЗ = ТаблЗначений.Скопировать();

1. ТаблЧасть была заранее отсортирована - метод Выгрузить сохранит сортировку или нет?
2. В запросе записи заранее отсортированы - метода Выгрузить сохранит сортировку записей?
3. Таблица значений изначально была отсортирована, копирование ее сохранит сортировку или нет?
33. kalyaka 1146 18.02.26 18:42 Сейчас в теме
(13) сохраняется :) Могу предположить, что
1. и 3. - это аналог массива строк, т.е. упорядоченная коллекция
2. - это таблица результата, порядок в которой определяется выборкой в запросе
И еще здесь стабильность важна для того, чтобы можно было выгружать/загружать данные колонок.
В общем хорошо, что здесь порядок стабильный.
36. RustIG 1942 19.02.26 08:49 Сейчас в теме
(33) вы интуитивно предполагаете, основываетесь на некий опыт и здравый смысл... но ведь в СП ничего об этом не сказано.

в документацию я не смотрел - да и не понятно, что вбирает в себя слово "документация 1С" - весь справочник итс-онлайн , кто что под этим имел в виду?

мой вопрос чисто риторический - про очевидность и здравый смысл....как автор данной статьи написал , что при выделении Ctrl+A, оказывается, имеет значение какая текущая строка выделена системой в данный момент...

ну если для простых случаев все очевидно, вот вам вопросы на засыпку:
1. ТаблЧасть отсортирована по полю1, далее выгружайте ТЗ с отбором по неупорядоченному полю2:
ТаблЧасть.Выгрузить(Новый Структура("Поле2", ЗначениеПоля2))
2. РезультатЗапроса содержит упорядочение по полю ФИО, встречаются полные совпадения ФИО - то есть у каждого пользователя РезультатЗапроса будет упорядочивать записи по разному, но при выгрузке будет выгружать ровно то же самое из результата запроса...
об этом в СП не сказано, эти примеры тестируются, если заранее забыли об этом, то рано или поздно всплывет ошибка....

Но в случае ВыделенныхСтрок придется тестировать с учетом текущей строки три раза - первая , последняя, в середине... Явно это ошибка платформы. Только вот как правильно классифицировать такой род ошибок, непонятно....

Если бы у программистов был свод правил, можно было бы сказать: "нарушено правило 1 - все что влияет на результат метода, должно передаваться в качестве параметра метода"

Условно говоря, ВыделенныеСтроки - теперь уже не коллекция, а метод - и метод с параметром НомерТекСтроки - поскольку результат будет разным в зависимости от НомераТекСтроки.

ПС. Намудрил я, напудрил мозги тут всем :)
- вот так я на мир смотрю
pavlov_dv; +1 Ответить
37. kalyaka 1146 19.02.26 09:06 Сейчас в теме
(36)
Явно это ошибка платформы
Это можно было бы назвать ошибкой, если бы в документации это поведение было бы описано, а так просто нужно принять, что порядок не как в таблице.
на некий опыт и здравый смысл...
Верно! И тесты конечно. Еще бы открыли код платформы :)

Задокументировать все на 100% невозможно, иначе мы получим не документацию, а код исполнения. Скорее всего нужно стремиться документировать общие принципы, механизмы и придерживаться их в различных механизмах. Например, принцип сохранения порядка (стабильность). Принцип работы с коллекциями типа: структура, массив, множество.
9. qwinter 683 17.02.26 22:00 Сейчас в теме
(0) Как вообще ПРОГРАММИСТ!!! может думать, что строки будут в порядке строк в таблице? Строки вставляются в массив в порядке их выделения, это же очевидно как 2х2.
ardn; Grigoriy251; +2 3 Ответить
11. RustIG 1942 17.02.26 22:19 Сейчас в теме
(9) Павел, вы умный программист, но не внимательно прочитали исследование автора статьи:
Но это правило не работает, если мы находимся на последней строке выделенной области.
-

вот это поведение не совпадает с вашей теорией -
Строки вставляются в массив в порядке их выделения
kalyaka; user2122906; +2 Ответить
14. qwinter 683 17.02.26 22:29 Сейчас в теме
(11) вы же не серьезно? Ну скажите что не серьезно????? Факта что люди не в курсе как работает функция вставить() в массиве (хотя там скорее всего список, но это принципиально ничего не меняеет) я не выдержу.

Что до очевидности, просто представьте что выделенные строки вам надо собирать самому и у вас есть событие ПриВыделенииСтроки, и напишите код.
21. RustIG 1942 18.02.26 09:03 Сейчас в теме
(14) вы как будто не вникли в суть статьи. И почему Вставить(), а не Добавить()? Я бы сам делал через добавить
user2122906; +1 Ответить
38. kalyaka 1146 19.02.26 09:33 Сейчас в теме
(9) вот нет :) Это правило работает, пока не произошло выделение всех строк. Если отметить строки в заданном порядке - будет порядок выделения. Если затем выделить все, то последняя строка, которая в порядке выделения могла быть 1-ой или 2-й - она выпадает из этого списка и в полном списке выделенных строк всегда оказывается последней.

Такое поведение кажется не логичным, т.к. нарушает общее поведение. Т.е. получается последняя строка особенная... Хотя вот в таком сценарии последняя строка встраивается в общий порядок:
1. поставить текущую строку, например 5
2. выделить все строки (1-7)
3. вывести порядок: [ 5, 1, 2, 3, 4, 6, 7]
4. убрать 5, 7: [ 1, 2, 3, 4, 6]
5. добавить 7, 5: [ 1, 2, 3, 4, 6, 7, 5]

В исходном сценарии:
1. выделить 7, 5, 3: [ 7, 5, 3]
2. выделить все: [ 5, 3, 1, 2, 4, 6, 7]
10. tormozit 7337 17.02.26 22:11 Сейчас в теме
https://www.hostedredmine.com/issues/881648
https://partners.v8.1c.ru/forum/t/1928636/m/1928636
В ИР есть функция ирКлиент.ВыделенныеСтрокиТабличногоПоляЛкс, дающая управление этим поведением в большинстве случаев.
user2154904; user2122906; Somebody1; Boris_Pulin; user2125207; XilDen; RustIG; +7 Ответить
12. RustIG 1942 17.02.26 22:22 Сейчас в теме
(0) я для динамических списков на обычных формах научился выделять строки - элегантно - показал здесь https://infostart.ru/1c/tools/1228866/
15. Xershi 1540 18.02.26 07:32 Сейчас в теме
Каково было мое удивление, когда обработав одинаковый массив строк в разной последовательности можно было получить разный результат!!
16. XilDen 785 18.02.26 07:40 Сейчас в теме
(15) В этом то как раз нет ничего удивительного, так что ваш сарказм здесь не уместен) Суть была в том, что нажимая Ctrl+A в таблице, эта последовательность может быть разная в зависимости от текущей позиции курсора.
Если это для всех было так очевидно заранее, то окей, значит я дурак, сразу не догадался) Можете обкидывать помидорами) Но что-то мне подсказывает, что я не один такой, и кому-то данная статья поможет не наступить на грабли)
rusmil; user2154904; BiboMiho; +3 Ответить
25. Xershi 1540 18.02.26 10:25 Сейчас в теме
(16) не знаю сколько лет назад, но да, это известный баг или фича.
Уже чувствую себя дедом, поэтому это не ново.
1С как вы понимаете уже 20 лет на 8, многое известно, но новичкам это в диковинку.
Поэтому иногда стоит писать в 1С, чтобы они хоть что-то с этим сделали. Но пока не вижу проблемы выделанная строка должна как-то быть раньше других?
Так же режим выделения бывает разный. Игрались с этим?
30. starik-2005 3213 18.02.26 16:14 Сейчас в теме
(16)
что я не один такой, и кому-то данная статья поможет не наступить на грабли
Да много кому поможет, а сейчас просто плюсов огребет (думаю, 30) и забудется. Но сама статья так называется, что гуглить проблему поможет с трудом
17. aximo 2587 18.02.26 07:42 Сейчас в теме
Приведите пример, где по индексу работать в выделенном диапазоне строк?
18. XilDen 785 18.02.26 07:53 Сейчас в теме
(17) Перераспределение/пересчет количества производимой продукции в выделенных строках с учетом перевыпуска продукции в предыдущей строке. Изначально алгоритм был написан под обработку всей ТЧ, позже появилось требование - применять алгоритм только к выделенным строкам. Пользователь устанавливает фильтр в таблице по определенной позиции номенклатуры, нажимает Ctrl+A и выполняет пересчет только для конкретной позиции.
19. aximo 2587 18.02.26 08:36 Сейчас в теме
(18) "в выделенных строках с учетом перевыпуска продукции в предыдущей строке" - это где же такое весьма интересное??? ... а строки имеют дату? ... если они перепутаются сортировкой
20. XilDen 785 18.02.26 08:55 Сейчас в теме
(19) Это планирование производства такое специфическое на предприятии, все вешаются)) Дату имеют, да. Тут вы правы, ручная сортировка таблицы пользователем может также сломать расчет. Пожалуй стоит добавить сортировку выделенных строк по номенклатуре и дате выпуска.
22. SerVer1C 1024 18.02.26 09:10 Сейчас в теме
Тема давняя, странно, что вы про неё не знали.
Строки в Сообщениях тоже подвержены аналогичному эффекту:
при позиционировании на 3-ю строку и дальнейшем выделении всех строк получите порядок: 3, 1, 2, 4, 5.
Прикрепленные файлы:
Brawler; ardn; starik-2005; +3 Ответить
23. SergMuravev 877 18.02.26 10:03 Сейчас в теме
(22) Тема давняя, но как было неудобно, так и осталось. Особенно в сообщениях, которые теперь приходится часто копировать для ИИ.
user2122906; RustIG; +2 Ответить
24. SerVer1C 1024 18.02.26 10:08 Сейчас в теме
(23) Наверное, единственный вариант - флудить канал @platform_suggestions - может в платформе 8.5.100 и исправят это поведение ))
41. Brawler 465 24.02.26 14:20 Сейчас в теме
(22) Да давняя дичь!
Мне как пользователю до лампочки что там 1С считает верным.
Если я выделил диапазон, то ожидаю, что он будет последовательным, а не возьмется некая текущая строка как первая, а уже потом все остальное, в итоге разорванный диапазон получаем с другим порядком элементов.
26. V.Nikonov 124 18.02.26 12:37 Сейчас в теме
Кстати, подозреваю, что оказаться не в последней выделенной строке можно не только выделяя ВСЕ строки (Ctrl+A). Можно индивидуально выделять в Произвольном порядке...
А Система сначала добавляет в Массив/Коллекцию текущую строку (если выделена), а затем подтаскивает перебором остальные?
27. XilDen 785 18.02.26 13:26 Сейчас в теме
28. starik-2005 3213 18.02.26 16:07 Сейчас в теме
И что, для кого-то это новость? Выделите так вот строки и скопируйте в йоксель - получите массу лулзов...
31. svsrus 179 18.02.26 17:12 Сейчас в теме
В БСП много полезных методов, если что )

ОбщегоНазначенияКлиентСервер.ДополнитьТаблицуИзМассива(ТЗВыбранныхСтрок, Элементы.Продукция.ВыделенныеСтроки, "НомерИндекса");
rozer; XilDen; +2 Ответить
34. triviumfan 103 18.02.26 20:15 Сейчас в теме
Не очевидно, но многие уже натыкались на это.
Я бы просто получил номера строк по идентификатору, отсортировал сей массив и передал бы дальше для обработки. У тебя пример какой-то неудачный.
35. kalyaka 1146 18.02.26 22:45 Сейчас в теме
Предложу свой вариант
Как я выкрутился из положения:
	Строки = РаботаСМассивом.АТДМассив(Элементы.Продукция.ВыделенныеСтроки)
		.Отобразить("Контекст.НайтиПоИдентификатору(Элемент)", Объект.Продукция)
		.СортироватьПо("НомерСтроки")
		.ВМассив()
	;
39. user-z99999 77 19.02.26 12:07 Сейчас в теме
А в регистры как пишется? Там есть НомерСтроки.
Что с порядком строк?
Для отправки сообщения требуется регистрация/авторизация