При разработке интерфейсов на управляемых формах 1С:Предприятие 8 часто возникает задача обработки нескольких строк, выбранных пользователем в таблице. Типичный сценарий: пользователь выделяет несколько документов, нажимает кнопку, и система должна их обработать. Однако здесь кроется важный нюанс — в каком порядке эти строки попадут в массив ВыделенныеСтроки? Рассмотрим эту ситуацию подробно, разберем поведение платформы и выясним, как гарантировать правильную последовательность обработки данных.
Проанализируем ситуацию: пользователь может выделять строки в произвольном порядке. Например, сначала он кликает по 5-й строке, затем, удерживая клавишу Ctrl, по 3-й, а после — по 1-й. Возникает вопрос: вернет ли свойство Элементы.Таблица.ВыделенныеСтроки массив в порядке нажатия [5, 3, 1] или в порядке их расположения в таблице [1, 3, 5]?
Прежде всего, важно понимать техническую природу элементов этого массива. Свойство ВыделенныеСтроки содержит не номера строк (индексы) и не сами данные, а идентификаторы строк. Идентификатор — это уникальное число, которое платформа присваивает строке при ее появлении в коллекции на форме. Он не меняется при сортировке или фильтрации, в отличие от индекса строки в объекте ТаблицаЗначений. Поэтому сам по себе вопрос о «порядке чисел» в массиве идентификаторов вторичен по отношению к тому, каким данным эти идентификаторы соответствуют.
Рассмотрим, как ведет себя платформа 1С v8.3 в различных условиях. Существует несколько факторов, влияющих на последовательность элементов в массиве:
[2, 5, 10].ВыделенныеСтроки массив будет отражать новый визуальный порядок.ВыделенныеСтроки, они будут расположены в том порядке, в котором вы их добавляли, до тех пор, пока пользователь не произведет интерактивное действие.Важный вывод: Поведение платформы по автоматической сортировке массива не является задокументированным стандартом. Это «особенность реализации», которая может измениться в любом релизе. Если ваша бизнес-логика требует строгого порядка (например, обработка документов строго по дате), полагаться на порядок элементов в ВыделенныеСтроки — это «мина замедленного действия».
Выясним, как написать надежный код, который не будет зависеть от капризов платформы. Если нам важно обрабатывать документы в хронологическом порядке, мы должны выполнить явную сортировку данных после их получения. Рассмотрим по шагам, как это реализовать:
Шаг 1. Получаем массив идентификаторов из элемента формы.
Шаг 2. Создаем вспомогательную таблицу значений для сортировки.
Шаг 3. Находим данные в исходной коллекции по идентификаторам и переносим их в таблицу для сортировки.
Шаг 4. Выполняем метод Сортировать().
Посмотрим на пример кода, реализующего этот алгоритм:
&НаСервере
Процедура ОбработатьВыделенныеСтрокиНаСервере()
// Получаем массив идентификаторов выделенных строк
МассивИдентификаторов = Элементы.СписокДокументов.ВыделенныеСтроки;
// Создаем временную ТЗ для упорядочивания данных
ТЗДляСортировки = Новый ТаблицаЗначений;
ТЗДляСортировки.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("ДокументСсылка.РеализацияТоваровУслуг"));
ТЗДляСортировки.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
// Заполняем временную ТЗ данными из коллекции формы
Для Каждого Идентификатор Из МассивИдентификаторов Цикл
// Используем метод НайтиПоИдентификатору для получения строки данных
СтрокаДанных = Объект.СписокДокументов.НайтиПоИдентификатору(Идентификатор);
Если СтрокаДанных <> Неопределено Тогда
НоваяСтрока = ТЗДляСортировки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДанных);
КонецЕсли;
КонецЦикла;
// Явно сортируем данные по дате, чтобы гарантировать хронологию
ТЗДляСортировки.Сортировать("Дата Возр");
// Теперь выполняем обработку в нужном порядке
Для Каждого СтрокаДляОбработки Из ТЗДляСортировки Цикл
// Здесь вызывается логика проведения или обработки документа
ОбработатьДокумент(СтрокаДляОбработки.Ссылка);
КонецЦикла;
КонецПроцедуры
Проанализируем преимущества такого решения. Во-первых, вы становитесь независимы от версии платформы (8.3.10, 8.3.25 и т.д.). Во-вторых, ваш код становится самодокументированным: любой другой разработчик, читая его, сразу поймет, что документы обрабатываются по дате. В-третьих, это решает проблему интерактивных сортировок — даже если пользователь отсортировал список по «Сумме» или «Контрагенту», ваш алгоритм все равно обработает их по «Дате», как того требует бизнес-логика.
Полезный совет: Если вы работаете с очень большим объемом данных в таблице, помните, что метод НайтиПоИдентификатору работает очень быстро, так как платформа индексирует эти значения внутри коллекции управляемой формы. Однако перебор идентификаторов в цикле всё же требует серверного вызова, если обработка происходит на сервере.
Мы выяснили, что массив ВыделенныеСтроки — это динамический объект, порядок элементов в котором может казаться предсказуемым, но на деле не гарантирован. Для профессиональной разработки в среде «1С:Предприятие» придерживайтесь правила: если порядок важен — сортируйте явно. Используйте вспомогательные таблицы значений и метод Сортировать(), чтобы обеспечить стабильную работу ваших механизмов обработки данных в любых условиях эксплуатации.