В процессе "осовременивания интерфейса" возникла необходимость воспроизвести подобное поведение, т.е. сделать так, чтобы список при открытии был отсортирован по убыванию даты и был перемотан в самое начало. По умолчанию направление сортировки запоминается, но список перематывается в конец и мы оказываемся на первом созданном документе. Промежуточный вариант с запоминанием текущей строки списка по ряду причин не подходит.
К счастью, это поведение можно исправить. Для этого "всего лишь" нужно получить реальный исполняемый запрос ДС, выполнить его и установить текущий элемент списка. Положение усложняется тем, что у ДС есть несколько видов поиска, которые недоступны через его настройки. К счастью, фирма 1C осознала эту недоработку и в "зазеркалье" некоторое время назад была опубликована статья, которая рассказывает о костыле, который был придуман специально для этого: https://wonderland.v8.1c.ru/blog/poluchenie-dannykh-dinamicheskogo-spiska/
Итак, пытаемся применить полученные знания и "копипастим код" из статьи, допустим в ПриОткрытии формы списка:
ИсполняемаяСхема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
ИсполняемыеНастройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных()
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных();
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Элементы.Список.ТекущаяСтрока = Результат[0].Ссылка;
Запускаем и...
... видим, что 1C не сильно запаривается в составлении тестовых примеров. Копаемся в синтакс-помощнике, видим, что у метода Выполнить компоновщика макета есть параметр, который отвечает за "тип макета". Оставим это, ИМХО, усложнение, на совести разработчиков платформы, испоравляем строку на
ИсполняемаяСхема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
ИсполняемыеНастройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных()
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных();
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Элементы.Список.ТекущаяСтрока = Результат[0].Ссылка;
Запускаем и...
... видим, что "оптимизация" запроса ДС действительно работает. Мы не выводим в ДС поле "Ссылка", и в результирующем запросе его нет. Немного поколдовав с отладчиком, видим, что выбранные поля в ДС задаются не на корневом уровне настроек, а внутри детальных записей, которые указаны без автополя. Слава богу, ДС имеет простые настройки и не надо всяких рекурсивных обходов для добавления выбранных полей во все ветки. Меняем код:
ИсполняемаяСхема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
ИсполняемыеНастройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных()
ВыбранноеПоле = ИсполняемыеНастройки.Структура[0].Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных();
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Элементы.Список.ТекущаяСтрока = Результат[0].Ссылка;
Запускаем, и... Если у вас список спозиционировался на первой строке, то вам не просто повезло, а очень повезло. Смотрим реальный запрос с помощью
Сообщить(МакетКомпоновки.НаборыДанных[0].Запрос)
видим, что в результирующем запросе отсутствуют сортировки, которые есть в настройках, об этом также сказал отладчик. Вообще отладчик - полезная штука :)
Ну что ж. Нужно править текст запроса. Заодно можно оптимизировать запрос, выбрав "первые 1". Тут на ум приходит объект "СхемаЗапроса", про который также писали в зазеркалье: https://wonderland.v8.1c.ru/blog/upravlyaemyy-konstruktor-zaprosa-i-obektnaya-model-skhemy-zaprosa/
Тут возможно два варианта - либо менять результирующий текст запроса, либо менять исполняемый запрос СКД. Я выбрал второй вариант, чтобы не заморачиваться с параметрами запроса (параметрами самого запроса ДС и отборами). Опять пишем код, потратив время на изучение СП и набив немного шишек с типами данных, получается что-то типа того
ИсполняемаяСхема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
ИсполняемыеНастройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
ВыбранноеПоле = ИсполняемыеНастройки.Структура[0].Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ИсполняемаяСхема.НаборыДанных[0].Запрос);
ПоследнийЗапрос = СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1); // да, в 8.3.8 в ДС появились пакетные запросы
Для каждого ОператорВыбрать Из ПоследнийЗапрос.Операторы Цикл
ОператорВыбрать.КоличествоПолучаемыхЗаписей = 1; // выбрать первые 1
КонецЦикла;
Для каждого ЭлементПорядка Из ИсполняемыеНастройки.Порядок.Элементы Цикл
ПолеПорядка = "" + ЭлементПорядка.Поле;
ЭлементПорядкаСхемы = ПоследнийЗапрос.Порядок.Добавить(ПолеПорядка);
ЭлементПорядкаСхемы.Направление = ?(ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр, НаправлениеПорядкаСхемыЗапроса.ПоВозрастанию, НаправлениеПорядкаСхемыЗапроса.ПоУбыванию);
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(ИсполняемаяСхема, ИсполняемыеНастройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных();
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Элементы.Список.ТекущаяСтрока = Результат[0].Ссылка;
Опять запускаем, и...
Не волнуйтесь, мы уже в конце пути, осталось совсем немного :))
Немного гугла, яндекса и наблюдений за ДС с различными вариантами сортировки и становится понятно, что это "дополнительное поле порядка 2" очень похоже на УИД. Ну что ж, немного плохого кода (я действительно не знаю, как из "ДополнительноеПолеПорядка2" получить "Ссылка"):
Для каждого ЭлементПорядка Из ИсполняемыеНастройки.Порядок.Элементы Цикл
ПолеПорядка = "" + ЭлементПорядка.Поле;
Попытка
ЭлементПорядкаСхемы = ПоследнийЗапрос.Порядок.Добавить(ПолеПорядка);
Исключение
ЭлементПорядкаСхемы = ПоследнийЗапрос.Порядок.Добавить("Ссылка");
КонецПопытки
ЭлементПорядкаСхемы.Направление = ?(ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр, НаправлениеПорядкаСхемыЗапроса.ПоВозрастанию, НаправлениеПорядкаСхемыЗапроса.ПоУбыванию);
КонецЦикла;
Запускаем и... бинго! Тут должен быть скриншот, но я вам его не покажу. В общем, для ДС с основной таблицей документов - работает, испытайте некоторое чувство удовлетворения от того, что заставили 1C делать то, что вам надо, самостоятельно.
Задания на дом: Сделать то же, но без использования процессора компоновки (вы же уже знаете, как получить настоящий текст запроса). Сделать то же для независимого периодического РС или регистра накопления. Ответить на вопрос, можно ли использовать не исполняемую схему и исполняемые настройки, а настройки из реквизита формы? Добавить самосортировку по убыванию даты. Погоревать о том, что нет события на интерактивное изменение настроек ДС. Сделать вариант для ДС с группировкой (кстати, так не надо делать, посмотрите профайлером, почему).
Надеюсь, вы почерпнули немного полезного в этой статье и найдете не только такое узкое применение для работы с программным выполнением СКД, работой со схемой запроса и прочими плюшками (внимательные читатели заметили комментарии с упоминанием некоторых из них).
ЗЫ: А теперь выкинте весь код и внимательно посмотрите палитру свойств, там есть подозрительный пункт:
который делает то же самое, но без всего того, что написано выше. Но это же не интересно, правда? Иначе как бы вы узнали про исполняеую схему и прочие плюшки, не понабивали бы шишек раскрывая для себя немного внутреннего устройства?