При разработке конфигураций на платформе 1С:Предприятие 7.7 мы часто сталкиваемся с необходимостью отсортировать выборку данных определенным образом. Метод ОбратныйПорядок(1) кажется простым и логичным решением, однако при работе с методом ВыбратьЭлементыПоРеквизиту он зачастую не дает ожидаемого результата. Давайте разберемся, почему так происходит и как реализовать желаемое поведение программно.
Проанализируем ситуацию: когда вы вызываете метод ВыбратьЭлементыПоРеквизиту, платформа 1С 7.7 задействует индекс, построенный именно по выбранному реквизиту. Внутренний движок базы данных жестко привязан к структуре этого индекса. Метод ОбратныйПорядок() исторически спроектирован для воздействия на стандартные индексы справочников (код или наименование). Он не умеет «разворачивать» индекс произвольного реквизита «на лету» в процессе выполнения запроса.
Таким образом, использование ОбратныйПорядок(1) совместно с выборкой по реквизиту не приведет к изменению порядка следования элементов, так как платформа продолжает обход индекса в его стандартном, заложенном при индексации, порядке.
Если вам необходимо отсортировать данные, полученные через ВыбратьЭлементыПоРеквизиту, самым универсальным решением будет выгрузка результатов выборки в ТаблицаЗначений. Это позволит вам гибко управлять порядком сортировки, не завися от ограничений индексного поиска платформы.
Рассмотрим пошаговый алгоритм реализации:
ТаблицаЗначений.Сортировать() к таблице значений с нужными параметрами.Пример программной реализации:
// Создаем таблицу значений
тзРезультат = СоздатьОбъект("ТаблицаЗначений");
тзРезультат.НоваяКолонка("Код");
тзРезультат.НоваяКолонка("Наименование");
спрТМЦ = СоздатьОбъект("Справочник.Номенклатура");
спрТМЦ.ВыбратьЭлементыПоРеквизиту("ШтрихКод", "8410261100012", 0, 0);
// Наполняем таблицу данными
Пока спрТМЦ.ПолучитьЭлемент() = 1 Цикл
тзРезультат.НоваяСтрока();
тзРезультат.Код = спрТМЦ.Код;
тзРезультат.Наименование = спрТМЦ.Наименование;
КонецЦикла;
// Сортируем таблицу в обратном порядке по коду
тзРезультат.Сортировать("Код-");
Для более продвинутых разработчиков, использующих внешние компоненты, такие как 1С++, существует более производительный путь — использование Запрос с прямым обращением к SQL-серверу (в случае SQL-версии платформы). Прямой запрос позволяет делегировать задачу сортировки оптимизатору SQL-сервера.
В тексте запроса вы можете явно указать направление сортировки с помощью ключевого слова УПОРЯДОЧИТЬ ПО ... УБЫВ. Это избавляет от необходимости перебирать элементы в цикле и вручную сортировать их в оперативной памяти клиента, что значительно повышает производительность при больших объемах справочников.
ОбратныйПорядок() не является универсальным инструментом для всех видов обхода данных.ТаблицаЗначений будет работать быстро. Если объем данных огромен, используйте Запрос, чтобы не перегружать память клиента.Разбираясь в архитектуре 1С 7.7, мы видим, что даже «неработающие» на первый взгляд функции имеют свои логические ограничения. Использование альтернативных подходов, таких как работа с ТаблицаЗначений, позволяет нам гибко решать задачи любой сложности, сохраняя при этом контроль над порядком данных в системе.