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

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

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

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

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

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

Следить за такой мелочью – очень сложно. Если от такой мелочи меняется результат расчёта – это катастрофа.
Как я выкрутился из положения:
- Создал таблицу значений
- Заполнил её индексами всех выбранных строк.
- Отсортировал таблицу значений по возрастанию индексов
- Уже перебирая отсортированные индексы в таблице значений, сформировал массив выбранных строк для дальнейшей обработки.
ТЗВыбранныхСтрок = Новый ТаблицаЗначений;
ТЗВыбранныхСтрок.Колонки.Добавить("НомерИндекса");
Для каждого ИндексСтроки Из Элементы.Продукция.ВыделенныеСтроки Цикл
НС = ТЗВыбранныхСтрок.Добавить();
НС.НомерИндекса = ИндексСтроки;
КонецЦикла;
ТЗВыбранныхСтрок.Сортировать("НомерИндекса Возр");
ВыбранныеСтроки = Новый Массив;
Для каждого Строка Из ТЗВыбранныхСтрок Цикл
ВыбранныеСтроки.Добавить(Объект.Продукция.НайтиПоИдентификатору(Строка.НомерИндекса));
КонецЦикла;
В общем, как-то так… Костыли на пустом месте приходится сооружать)) Если кому-то поможет в будущем, буду рад) Всем удачи!
Вступайте в нашу телеграмм-группу Инфостарт
Выделенные строки табличная часть
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45725 TitanLuchs 109
Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)
Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.
19.06.2025 18729 zeegin 15
Механизмы платформы 1С Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).
03.02.2025 26067 bayselonarrend 127
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.
30.01.2025 33359 user2122906 10
Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 Бесплатно (free)
Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.
17.01.2025 55916 user2122906 13
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46888 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26497 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40504 bayselonarrend 24
Кто заранее правильно скажет, в каких случаях сортировка записей сохраняется?
1. ТЗ = ТаблЧасть.Выгрузить();
2. ТЗ = РезультатЗапроса.Выгрузить();
3. ТЗ = ТаблЗначений.Скопировать();
Что вы скажете по вопросу из сообщения (8) :
Кто заранее правильно скажет, в каких случаях сортировка записей сохраняется?
1. ТЗ = ТаблЧасть.Выгрузить();
2. ТЗ = РезультатЗапроса.Выгрузить();
3. ТЗ = ТаблЗначений.Скопировать();
1. ТаблЧасть была заранее отсортирована - метод Выгрузить сохранит сортировку или нет?
2. В запросе записи заранее отсортированы - метода Выгрузить сохранит сортировку записей?
3. Таблица значений изначально была отсортирована, копирование ее сохранит сортировку или нет?
1. и 3. - это аналог массива строк, т.е. упорядоченная коллекция
2. - это таблица результата, порядок в которой определяется выборкой в запросе
И еще здесь стабильность важна для того, чтобы можно было выгружать/загружать данные колонок.
В общем хорошо, что здесь порядок стабильный.
в документацию я не смотрел - да и не понятно, что вбирает в себя слово "документация 1С" - весь справочник итс-онлайн , кто что под этим имел в виду?
мой вопрос чисто риторический - про очевидность и здравый смысл....как автор данной статьи написал , что при выделении Ctrl+A, оказывается, имеет значение какая текущая строка выделена системой в данный момент...
ну если для простых случаев все очевидно, вот вам вопросы на засыпку:
1. ТаблЧасть отсортирована по полю1, далее выгружайте ТЗ с отбором по неупорядоченному полю2:
ТаблЧасть.Выгрузить(Новый Структура("Поле2", ЗначениеПоля2))
2. РезультатЗапроса содержит упорядочение по полю ФИО, встречаются полные совпадения ФИО - то есть у каждого пользователя РезультатЗапроса будет упорядочивать записи по разному, но при выгрузке будет выгружать ровно то же самое из результата запроса...
об этом в СП не сказано, эти примеры тестируются, если заранее забыли об этом, то рано или поздно всплывет ошибка....
Но в случае ВыделенныхСтрок придется тестировать с учетом текущей строки три раза - первая , последняя, в середине... Явно это ошибка платформы. Только вот как правильно классифицировать такой род ошибок, непонятно....
Если бы у программистов был свод правил, можно было бы сказать: "нарушено правило 1 - все что влияет на результат метода, должно передаваться в качестве параметра метода"
Условно говоря, ВыделенныеСтроки - теперь уже не коллекция, а метод - и метод с параметром НомерТекСтроки - поскольку результат будет разным в зависимости от НомераТекСтроки.
ПС. Намудрил я, напудрил мозги тут всем :)
- вот так я на мир смотрю
Задокументировать все на 100% невозможно, иначе мы получим не документацию, а код исполнения. Скорее всего нужно стремиться документировать общие принципы, механизмы и придерживаться их в различных механизмах. Например, принцип сохранения порядка (стабильность). Принцип работы с коллекциями типа: структура, массив, множество.
вот это поведение не совпадает с вашей теорией -
Что до очевидности, просто представьте что выделенные строки вам надо собирать самому и у вас есть событие ПриВыделенииСтроки, и напишите код.
Такое поведение кажется не логичным, т.к. нарушает общее поведение. Т.е. получается последняя строка особенная... Хотя вот в таком сценарии последняя строка встраивается в общий порядок:
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]
Если это для всех было так очевидно заранее, то окей, значит я дурак, сразу не догадался) Можете обкидывать помидорами) Но что-то мне подсказывает, что я не один такой, и кому-то данная статья поможет не наступить на грабли)
Уже чувствую себя дедом, поэтому это не ново.
1С как вы понимаете уже 20 лет на 8, многое известно, но новичкам это в диковинку.
Поэтому иногда стоит писать в 1С, чтобы они хоть что-то с этим сделали. Но пока не вижу проблемы выделанная строка должна как-то быть раньше других?
Так же режим выделения бывает разный. Игрались с этим?
Строки в Сообщениях тоже подвержены аналогичному эффекту:
при позиционировании на 3-ю строку и дальнейшем выделении всех строк получите порядок: 3, 1, 2, 4, 5.
Мне как пользователю до лампочки что там 1С считает верным.
Если я выделил диапазон, то ожидаю, что он будет последовательным, а не возьмется некая текущая строка как первая, а уже потом все остальное, в итоге разорванный диапазон получаем с другим порядком элементов.
А Система сначала добавляет в Массив/Коллекцию текущую строку (если выделена), а затем подтаскивает перебором остальные?
Я бы просто получил номера строк по идентификатору, отсортировал сей массив и передал бы дальше для обработки. У тебя пример какой-то неудачный.
Строки = РаботаСМассивом.АТДМассив(Элементы.Продукция.ВыделенныеСтроки)
.Отобразить("Контекст.НайтиПоИдентификатору(Элемент)", Объект.Продукция)
.СортироватьПо("НомерСтроки")
.ВМассив()
;
Что с порядком строк?
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 2618696
Создание 17.02.26 16:30
Обновление 17.02.26 16:30
Просмотры 3644
Загрузки 0
Рейтинг
29
Комментарии 42
Код открыт Да
Рубрики Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С 8.3
Конфигурация Универсальные
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)