Рег.ОбратныйПорядок(1) - до или после инициализации выборки..?

Автор Злоп, 13 августа 2025, 23:14

« назад - далее »

Злоп

Постоянно туплю на этом вопросе.

Вариант1
   РегП = СоздатьОбъект("Регистр.Продажи");
   РегП.ОбратныйПорядок(1);
   РегП.ВыбратьДвиженияДокумента(ВыбДок);
   Пока РегП.ПолучитДвижение() = 1 Цикл

Вариант2
   РегП = СоздатьОбъект("Регистр.Продажи");
   РегП.ВыбратьДвиженияДокумента(ВыбДок);
   РегП.ОбратныйПорядок(1);
   Пока РегП.ПолучитДвижение() = 1 Цикл

Какой вариант правильный?

vladmenleo

Конечно первый. по аналогии с объектом периодический, про который написано Замечание:
Метод используется до вызова метода ВыбратьЗначения. Так и тут

Харлампий Дымба

Свои 5 копеек, просто в копилочку:
Для справочников, документов и периодического - ОбратныйПорядок() меняет только флажок направления, но не влияет на текущее позиционирование. При открытии выборки (в момент вызова .Выбрать...) выборка будет спозиционирована в зависимости от этого флажка - на первый или на последний элемент.
То есть по факту порядок выборки можно развернуть в любой момент перебора, даже после открытия выборки:
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
 Если Спр.Наименование="с этого элемента идём обратно" Тогда
  Спр.ОбратныйПорядок(1);
 КонецЕсли;
КонецЦикла;
Не смог, правда, придумать практического применения этой фишке, ну да ладно.

А вот для регистров так не работает - там установка флажка ОбратныйПорядок() после начала выборки игнорируется.
Это вот, кстати, интересный момент: такие отклонения - обычно маркер какой-то заплатки, исправления в релизе платформы. Ну или того, что подсистему регистров писал прог со своим видением логики работы системы)

Харлампий Дымба

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