В каком порядке возвращаются элементы в массиве ВыделенныеСтроки таблицы значений в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на управляемых формах 1С:Предприятие 8 часто возникает задача обработки нескольких строк, выбранных пользователем в таблице. Типичный сценарий: пользователь выделяет несколько документов, нажимает кнопку, и система должна их обработать. Однако здесь кроется важный нюанс — в каком порядке эти строки попадут в массив ВыделенныеСтроки? Рассмотрим эту ситуацию подробно, разберем поведение платформы и выясним, как гарантировать правильную последовательность обработки данных.

Суть проблемы и механизм идентификаторов

Проанализируем ситуацию: пользователь может выделять строки в произвольном порядке. Например, сначала он кликает по 5-й строке, затем, удерживая клавишу Ctrl, по 3-й, а после — по 1-й. Возникает вопрос: вернет ли свойство Элементы.Таблица.ВыделенныеСтроки массив в порядке нажатия [5, 3, 1] или в порядке их расположения в таблице [1, 3, 5]?

Прежде всего, важно понимать техническую природу элементов этого массива. Свойство ВыделенныеСтроки содержит не номера строк (индексы) и не сами данные, а идентификаторы строк. Идентификатор — это уникальное число, которое платформа присваивает строке при ее появлении в коллекции на форме. Он не меняется при сортировке или фильтрации, в отличие от индекса строки в объекте ТаблицаЗначений. Поэтому сам по себе вопрос о «порядке чисел» в массиве идентификаторов вторичен по отношению к тому, каким данным эти идентификаторы соответствуют.

Как платформа формирует массив на самом деле

Рассмотрим, как ведет себя платформа 1С v8.3 в различных условиях. Существует несколько факторов, влияющих на последовательность элементов в массиве:

  1. Визуальный порядок: В большинстве случаев в тонком клиенте платформа возвращает идентификаторы в том порядке, в котором строки отображаются на экране — сверху вниз. Если вы выделили строки 10, 2 и 5, массив, скорее всего, будет содержать их в порядке [2, 5, 10].
  2. Влияние клиентского приложения: Поведение может различаться между тонким и веб-клиентом. В веб-клиенте порядок формирования массива часто зависит от браузера и особенностей обработки событий DOM-дерева. Полагаться на автоматическую сортировку здесь категорически нельзя.
  3. Интерактивная сортировка: Если пользователь нажал на заголовок колонки «Дата» и таблица перестроилась, то при новом получении свойства ВыделенныеСтроки массив будет отражать новый визуальный порядок.
  4. Программное выделение: Если вы программно добавляете элементы в массив ВыделенныеСтроки, они будут расположены в том порядке, в котором вы их добавляли, до тех пор, пока пользователь не произведет интерактивное действие.

Важный вывод: Поведение платформы по автоматической сортировке массива не является задокументированным стандартом. Это «особенность реализации», которая может измениться в любом релизе. Если ваша бизнес-логика требует строгого порядка (например, обработка документов строго по дате), полагаться на порядок элементов в ВыделенныеСтроки — это «мина замедленного действия».

Разберем правильный алгоритм обработки

Выясним, как написать надежный код, который не будет зависеть от капризов платформы. Если нам важно обрабатывать документы в хронологическом порядке, мы должны выполнить явную сортировку данных после их получения. Рассмотрим по шагам, как это реализовать:

Шаг 1. Получаем массив идентификаторов из элемента формы.

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

Шаг 3. Находим данные в исходной коллекции по идентификаторам и переносим их в таблицу для сортировки.

Шаг 4. Выполняем метод Сортировать().

Посмотрим на пример кода, реализующего этот алгоритм:


&НаСервере
Процедура ОбработатьВыделенныеСтрокиНаСервере()
    
    // Получаем массив идентификаторов выделенных строк
    МассивИдентификаторов = Элементы.СписокДокументов.ВыделенныеСтроки;
    
    // Создаем временную ТЗ для упорядочивания данных
    ТЗДляСортировки = Новый ТаблицаЗначений;
    ТЗДляСортировки.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("ДокументСсылка.РеализацияТоваровУслуг"));
    ТЗДляСортировки.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
    
    // Заполняем временную ТЗ данными из коллекции формы
    Для Каждого Идентификатор Из МассивИдентификаторов Цикл
        // Используем метод НайтиПоИдентификатору для получения строки данных
        СтрокаДанных = Объект.СписокДокументов.НайтиПоИдентификатору(Идентификатор);
        
        Если СтрокаДанных <> Неопределено Тогда
            НоваяСтрока = ТЗДляСортировки.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДанных);
        КонецЕсли;
    КонецЦикла;
    
    // Явно сортируем данные по дате, чтобы гарантировать хронологию
    ТЗДляСортировки.Сортировать("Дата Возр");
    
    // Теперь выполняем обработку в нужном порядке
    Для Каждого СтрокаДляОбработки Из ТЗДляСортировки Цикл
        // Здесь вызывается логика проведения или обработки документа
        ОбработатьДокумент(СтрокаДляОбработки.Ссылка);
    КонецЦикла;
    
КонецПроцедуры

Почему это лучший подход?

Проанализируем преимущества такого решения. Во-первых, вы становитесь независимы от версии платформы (8.3.10, 8.3.25 и т.д.). Во-вторых, ваш код становится самодокументированным: любой другой разработчик, читая его, сразу поймет, что документы обрабатываются по дате. В-третьих, это решает проблему интерактивных сортировок — даже если пользователь отсортировал список по «Сумме» или «Контрагенту», ваш алгоритм все равно обработает их по «Дате», как того требует бизнес-логика.

Полезный совет: Если вы работаете с очень большим объемом данных в таблице, помните, что метод НайтиПоИдентификатору работает очень быстро, так как платформа индексирует эти значения внутри коллекции управляемой формы. Однако перебор идентификаторов в цикле всё же требует серверного вызова, если обработка происходит на сервере.

Резюме

Мы выяснили, что массив ВыделенныеСтроки — это динамический объект, порядок элементов в котором может казаться предсказуемым, но на деле не гарантирован. Для профессиональной разработки в среде «1С:Предприятие» придерживайтесь правила: если порядок важен — сортируйте явно. Используйте вспомогательные таблицы значений и метод Сортировать(), чтобы обеспечить стабильную работу ваших механизмов обработки данных в любых условиях эксплуатации.

← На главную