Почему не работает обратный порядок при выборке по реквизиту в 1С 7.7 и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Причина возникновения проблемы

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

Таким образом, использование ОбратныйПорядок(1) совместно с выборкой по реквизиту не приведет к изменению порядка следования элементов, так как платформа продолжает обход индекса в его стандартном, заложенном при индексации, порядке.

Решение №1: Использование таблицы значений

Если вам необходимо отсортировать данные, полученные через ВыбратьЭлементыПоРеквизиту, самым универсальным решением будет выгрузка результатов выборки в ТаблицаЗначений. Это позволит вам гибко управлять порядком сортировки, не завися от ограничений индексного поиска платформы.

Рассмотрим пошаговый алгоритм реализации:

  1. Создаем объект ТаблицаЗначений.
  2. Добавляем в неё колонки для хранения необходимых данных (например, код, наименование, значение реквизита).
  3. Заполняем таблицу путем обхода выборки элементов.
  4. Применяем метод Сортировать() к таблице значений с нужными параметрами.

Пример программной реализации:


// Создаем таблицу значений
тзРезультат = СоздатьОбъект("ТаблицаЗначений");
тзРезультат.НоваяКолонка("Код");
тзРезультат.НоваяКолонка("Наименование");

спрТМЦ = СоздатьОбъект("Справочник.Номенклатура");
спрТМЦ.ВыбратьЭлементыПоРеквизиту("ШтрихКод", "8410261100012", 0, 0);

// Наполняем таблицу данными
Пока спрТМЦ.ПолучитьЭлемент() = 1 Цикл
    тзРезультат.НоваяСтрока();
    тзРезультат.Код = спрТМЦ.Код;
    тзРезультат.Наименование = спрТМЦ.Наименование;
КонецЦикла;

// Сортируем таблицу в обратном порядке по коду
тзРезультат.Сортировать("Код-");

Решение №2: Использование прямого запроса

Для более продвинутых разработчиков, использующих внешние компоненты, такие как 1С++, существует более производительный путь — использование Запрос с прямым обращением к SQL-серверу (в случае SQL-версии платформы). Прямой запрос позволяет делегировать задачу сортировки оптимизатору SQL-сервера.

В тексте запроса вы можете явно указать направление сортировки с помощью ключевого слова УПОРЯДОЧИТЬ ПО ... УБЫВ. Это избавляет от необходимости перебирать элементы в цикле и вручную сортировать их в оперативной памяти клиента, что значительно повышает производительность при больших объемах справочников.

Важные рекомендации

Разбираясь в архитектуре 1С 7.7, мы видим, что даже «неработающие» на первый взгляд функции имеют свои логические ограничения. Использование альтернативных подходов, таких как работа с ТаблицаЗначений, позволяет нам гибко решать задачи любой сложности, сохраняя при этом контроль над порядком данных в системе.

← На главную