Коллеги, всем привет!
Столкнулся я тут с интересной и совсем не очевидной ситуацией) На всякий случай напишу, вдруг кому пригодится)
При работе с выделенными строками таблицы, как известно, мы их можем получить через свойство элемента "ВыделенныеСтроки", где хранится список индексов всех строк, которые были выделены.
Далее мы получаем сами строки через поиск по идентификатору.
Небольшой пример:
ВыбранныеСтроки = Новый Массив;
Для каждого ИндексСтроки Из Элементы.Продукция.ВыделенныеСтроки Цикл
ВыбранныеСтроки.Добавить(Объект.Продукция.НайтиПоИдентификатору(ИндексСтроки));
КонецЦикла;
И вот тут-то и всплыл интересный момент.
Если вам важно сохранить последовательность выделенных строк именно такой, в которой они идут в документе, то нужно, чтобы текущая строка была первой или последней в выделенном диапазоне!
В моём случае была ситуация, когда выделенные строки должны были обрабатываться последовательно. Результат обработки первой выделенной строки влиял на алгоритм обработки следующей строки.
Каково же было моё удивление, когда, выделяя ОДИНАКОВУЮ последовательность строк и нажимая на одну и ту же кнопку, пользователи начали получать РАЗНЫЕ результаты.
Оказывается, платформа ставит текущую строку первой в списке выделенных. И это поведение совершенно не очевидно для пользователей.
Кто-то стоял на 4 строке таблицы, а потом нажат Ctrl + A и выделил всю таблицу.

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

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

Для него массив выделенных строк будет такой:
1, 0, 2, 3, 4

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

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

Следить за такой мелочью – очень сложно. Если от такой мелочи меняется результат расчёта – это катастрофа.
Как я выкрутился из положения:
- Создал таблицу значений
- Заполнил её индексами всех выбранных строк.
- Отсортировал таблицу значений по возрастанию индексов
- Уже перебирая отсортированные индексы в таблице значений, сформировал массив выбранных строк для дальнейшей обработки.
ТЗВыбранныхСтрок = Новый ТаблицаЗначений;
ТЗВыбранныхСтрок.Колонки.Добавить("НомерИндекса");
Для каждого ИндексСтроки Из Элементы.Продукция.ВыделенныеСтроки Цикл
НС = ТЗВыбранныхСтрок.Добавить();
НС.НомерИндекса = ИндексСтроки;
КонецЦикла;
ТЗВыбранныхСтрок.Сортировать("НомерИндекса Возр");
ВыбранныеСтроки = Новый Массив;
Для каждого Строка Из ТЗВыбранныхСтрок Цикл
ВыбранныеСтроки.Добавить(Объект.Продукция.НайтиПоИдентификатору(Строка.НомерИндекса));
КонецЦикла;
В общем, как-то так… Костыли на пустом месте приходится сооружать)) Если кому-то поможет в будущем, буду рад) Всем удачи!
Вступайте в нашу телеграмм-группу Инфостарт
