Как "перемотать" динамический список в начало при открытии? (или некоторые нюансы получения данных динамического списка)

03.11.16

Разработка - Работа с интерфейсом

В современных интерфейсах (новостях, социальных сетях и прочим) принято размещать новые данные сверху, более старые - внизу. К сожалению, в 1C сделано несколько по-другому - по умолчанию списки документов отсортированы по возрастанию даты и далее возможно два варианта: либо список при открытии проматывается в конец, либо список может запоминать "последнюю" текущую строку.

В процессе "осовременивания интерфейса" возникла необходимость воспроизвести подобное поведение, т.е. сделать так, чтобы список при открытии был отсортирован по убыванию даты и был перемотан в самое начало. По умолчанию направление сортировки запоминается, но список перематывается в конец и мы оказываемся на первом созданном документе. Промежуточный вариант с запоминанием текущей строки списка по ряду причин не подходит.

К счастью, это поведение можно исправить. Для этого "всего лишь" нужно получить реальный исполняемый запрос ДС, выполнить его и установить текущий элемент списка. Положение усложняется тем, что у ДС есть несколько видов поиска, которые недоступны через его настройки. К счастью, фирма 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 делать то, что вам надо, самостоятельно.

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

Надеюсь, вы почерпнули немного полезного в этой статье и найдете не только такое узкое применение для работы с программным выполнением СКД, работой со схемой запроса и прочими плюшками (внимательные читатели заметили комментарии с упоминанием некоторых из них).

ЗЫ: А теперь выкинте весь код и внимательно посмотрите палитру свойств, там есть подозрительный пункт:

который делает то же самое, но без всего того, что написано выше. Но это же не интересно, правда? Иначе как бы вы узнали про исполняеую схему и прочие плюшки, не понабивали бы шишек раскрывая для себя немного внутреннего устройства?

Управляемые формы СКД программная работа с СКД Схема запроса Юзабилити

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61698    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54313    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16623    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10563    745    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9484    150    acces969    31    

115

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3577    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12010    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. MiniMuk 10 03.11.16 05:39 Сейчас в теме

+ еще настроить список -> сортировка плохие варианты?
dimisa; rpgshnik; CyberCerber; +3 Ответить
2. Fragster 1137 03.11.16 09:20 Сейчас в теме
(1) MiniMuk, да, так можно, но на самом деле статья не про то :)
3. alxarz 31 03.11.16 11:16 Сейчас в теме
(2) а читая анонс можно подумать что именно про это :)
rpgshnik; CyberCerber; +2 Ответить
5. Fragster 1137 03.11.16 16:17 Сейчас в теме
(3) alxarz, статья про то, что в 1с есть много разных прикольных возможностей, но сложный путь не всегда верный.
8. Fragster 1137 04.11.16 11:37 Сейчас в теме
(3) alxarz, дополнил заголовок статьи
4. MiniMuk 10 03.11.16 11:31 Сейчас в теме
(2) за ссылку отдельное спасибо.
6. Fragster 1137 03.11.16 16:56 Сейчас в теме
(4) кстати, в зазеркалье подписаться на рассылку новых статей можно
7. BigBoss 2 04.11.16 06:07 Сейчас в теме
Я начиная читая статью, подумал что автор не знает про тот пункт в палитре свойств. Статья интересная
9. Fragster 1137 04.11.16 14:14 Сейчас в теме
эй! куда подевался код!
10. Fragster 1137 04.11.16 16:39 Сейчас в теме
11. Danil.Potapov 514 05.11.16 23:41 Сейчас в теме
вот интересно, 1с рассказывает про постоянное тестирование, и т. д., но как только сделаешь шаг в сторону напарываешься минимум на пару ошибок или особенностей платформы. До сих пор не могу понять как они разрабатывали интерфейс тонкого клиента, если все настройки динамического списка в настройках, а вот изменить вывод списка полей в список настраивается через изменить форму, при этом группировка полей все равно в настройках.
12. Fragster 1137 07.11.16 10:46 Сейчас в теме
(11) Danil.Potapov, раздражает, что не всё, что делает пользователь доступно программно (даже состояние, не говоря уж о самих действиях), и не на все действия есть события. Например весьма пригодилось бы событие на изменение пользовательских настроек ДС. Или подписка на изменение определенного типа данных (например для ДС без основной таблицы). И оповещение об изменении данных с сервера для всех клиентов (реактивность).
Те же Список.КомпоновщикНастроек.ПолучитьНастройки() не содержат то, что пользователь отобрал через "найти".
13. Danil.Potapov 514 07.11.16 15:06 Сейчас в теме
(12) да, точно, сколько лет прошло а воз и ныне там.
14. starik-2005 3031 07.11.16 15:12 Сейчас в теме
Это только с ДС с основной таблицей? А как быть с ДС произвольным? Есть там возможность спозиционироваться на чем-нибудь, отличном от начала или окончания?
15. Fragster 1137 07.11.16 15:42 Сейчас в теме
(14) starik-2005, там текущая строка похожа на порядковый номер строки в результате компоновки. т.е. для позиционирования на произвольной строке нужно получить позицию в полной выборке. Ну а для первой - 1, для последней - количество(*)
16. Yashazz 4707 07.11.16 20:53 Сейчас в теме
Сначала было собрался ругаться, что автор не знает азы, но, к счастью, это оказался такой грамотный стёб. Зачёт) Вещи, в целом, очевидные, но полезные.
Вообще, не зря эту хрень прозвали "демонический список". Постоянно сюрпризы))
17. Dementor 1014 09.11.16 16:11 Сейчас в теме
Статья интересна в плане "у меня есть какой-то код - давайте заставим его работать".

У Вас немного неправильное восприятие сайта Зазеркалья. Это НЕ документация по платформе. Это анонсы функциональности, которые разработчики сейчас у себя внутри тестируют и планируют когда-то включить в рабочие сборки платформ. То, что параметров не хватает, или указаны лишние, или у функций могут оказаться совсем другие названия - это нормальные рабочие моменты. Поэтому, каждый раз на форуме, когда кто-то выдает подобные вашим претензии к примерам, то им вежливо объясняют, что их путь должен последовать на its.1c.ru . Раз даже до смешного дошло - один разработчик жаловался на неработающую фичу, про которую он прочитал в Зазеркалье, но которую на тот момент еще даже в тестовую сборку не включили :)
18. Fragster 1137 09.11.16 19:31 Сейчас в теме
(17) Dementor, к сожалению, поиск по its.1c.ru фраз "ПолучитьИсполняемуюСхемуКомпоновкиДанных" или "Получить Исполняемую Схему Компоновки Данных" не приводит к ни к какому результату. Равно как и нет информации про отсутствие сортировки в "реальном" запросе СКД или про "ДополнительноеПолеПорядка".
19. Dementor 1014 12.11.16 17:27 Сейчас в теме
(18) Fragster, странно. Почему же у меня получилось? http://its.1c.ru/db/v839doc#bookmark:dev:TI000001476
Кстати, ошибка не у разработчиков с неправильным примером, а у вас. Тип генератора макета по-умолчанию установлен в значение для вывода в табличный документ. И в примере происходит вывод как раз в табличный документ! Чуть ниже ссылка для желающих вывести данные в таблицу значений - http://its.1c.ru/db/v839doc#bookmark:dev:TI000000626 и там уже правильно переопределен генератор макета.

О Зазеркалье повторюсь - это не документация и даже не блог разработчиков конфигураций. Это просто анонсы, что бы иметь представление о том, что будет реализовано в ближайших релизах. К примеру, я сегодня полистал красивые новые диаграммы - молодцы, но когда новый функционал будет в платформе, то я буду готов, что настройки назовут немного по другому, что-то не сделают всего обещанного или что-то возможно удивят и добавят нового, не описанного в этой свежей статье.
20. Fragster 1137 12.11.16 17:48 Сейчас в теме
(19) Dementor, повторюсь, увидев анонс в зазеркалье, я взял пример кода из него. И там именно вывод в коллекцию значений. То, что на ИТС ты смог найти документацию - поздравляю. Но по почему-то по названию ключевых функций оно не ищется. За ссылку, конечно, спасибо (кстати, пример там уже с табличным документом, в отличии от зазеркалья).

Я рассматриваю зазеркалье как сборник интересных особенностей платформы, с приблизительными примерами и указанием, когда оно (будет) реализовано. Не всегда хватает сил прочитать (и запомнить) v8update, да и самих примеров (с картинками :) ) он не содержит.

Про диаграммы - да, реализовано кое что, особенно порадовало условное оформление для СКД. Но сильно востребованные вещи типа логарифмической шкалы или двух шкал - не так и не реализованы, так что продолжим пользоваться полем HTML документа.
21. Fragster 1137 12.11.16 17:52 Сейчас в теме
(19) Dementor, я понял, как получилось найти информацию. Поиск по ИТС запоминает раздел. Из-за этого у меня результат оказался пуст, пока не переключишься в "разработка и администрирование".
22. Fragster 1137 17.01.17 13:26 Сейчас в теме
(19) предложил на партнерском вставлять ссылку на ИТС в статью в зазеркалье. Пока думают.
23. it@contlog.ru 30.07.18 20:51 Сейчас в теме
Или кривокод или что?
Смотрю СхемаЗапроса модифицирует запрос, но дальше нигде не используется?
Fragster; +1 Ответить
24. Fragster 1137 31.07.18 17:05 Сейчас в теме
(23) Согласен, пропустил установку запроса обратно в схему. Но глобально это ни на что не влияет :)
Даже на сообщаемые сведения про "дополнительное поле порядка"
Радует, что хоть кто-то внимательно это прочитал :)
25. Hatson 528 15.10.18 11:26 Сейчас в теме
26. acsent 1198 04.03.20 16:12 Сейчас в теме
а если не модифицировать запрос на выбрать первые 1, а в самой скда установить аналогичный параметр?
27. Fragster 1137 05.03.20 17:54 Сейчас в теме
(26) Разве есть в СКД аналогичный параметр?
29. Fragster 1137 17.03.20 11:41 Сейчас в теме
(28) не уверен, что оно работает не в постобработке
Оставьте свое сообщение