vk fb tw rss

Анатомия платформы. Как устроен динамический список.

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

УРОВЕНЬ БАЗЫ ДАННЫХ

При открытии списка

В тестовой конфигурации создан справочник «Товары», в котором добавлен реквизит «Артикул» типа «Строка». Для примеров справочник заполнен пятью тысячами элементов. Заполнение произведено специальной обработкой «ЗаполнениеСправочникаТоваров», которая также находится в составе демонстрационной конфигурации.
При открытии формы списка справочника «Товары», динамический список будет содержать группы верхнего уровня, которые пользователь может разворачивать для просмотра вложенных элементов. SQL-запрос, формируемый платформой при открытии списка, будет выглядеть следующим образом:
SQL-запрос при открытии динамического списка
SQL-запрос при открытии динамического списка

Опишем полученный запрос. Мы выбираем первые 42 записи из таблицы «_Reference7». Именно в этой таблице хранятся записи для всех элементов справочника «Товары». Почему выбирается именно 42 записи? Найти что-либо, что повлияет на эту цифру я не смог (ни размер экрана, ни общее количество записей в таблице). Делаю вывод, что платформа по умолчанию выбирает 42 записи при открытии динамического списка.

Предопределенный и помеченный на удаление

Поля выборки содержат те данные, которые будут отображаться непосредственно в динамическом списке. На рисунке подписано как каждое из полей отображается в режиме 1С:Предприятие. Может возникнуть логичный вопрос: «Для чего в выборке присутствует поле ‘Предопределенный’ и ‘Пометка удаления’?». Нужны эти поля для того, чтобы платформа соответствующими пиктограммами могла выделять помеченные на удаление и предопределенные элементы.

В разделе «ORDER BY» обозначены поля для сортировки результирующей выборки: «ЭтоГруппа», «Наименование», «Ссылка» (см. подписи полей выборки). В разделе наложения условий указывается отбор по родителю для выбираемых элементов. В нашем случае, поскольку динамический список был только открыт, отбираются записи без родительского элемента. В переменную условия «P1» передается пустое значение ссылки на элемент родителя.В результате выполнения запроса мы увидим следующие данные в динамическом списке:

При раскрытии группы с элементами

Раскрывая группу элементов в динамическом списке, платформа 1С:Предприятие формирует следующий запрос:
Полученный запрос похож на рассматриваемый нами ранее. Отличие заключается лишь в количестве выбираемых записей и накладываемом условии на выборку данных. В случае, когда происходит открытие группы элементов, то платформа задает выбор только для первых 22-х элементов.
Условие осталось прежним — выбираются записи только определенного родительского элемента, только в этом случае в параметр уже передается ссылка на открываемую группу элементов. На скриншоте вы видите ссылку на группу «Группа 1 — 1».
Подобный запрос формируется и в тех случаях, когда пользователь разворачивает группу, в состав которой входят другие группы справочника.

Пролистываем список элементов

Ранее уже было сказано, что при раскрытии группы справочника платформа формирует запрос на выборку первых 22-х элементов. Но что происходит, когда пользователь листает динамический список и выбранные элементы заканчиваются? В таком случае платформа формирует новый запрос и выбирает последующую порцию данных для просмотра:
Запрос для выборки следующей порции элементов
Запрос для выборки следующей порции элементов
Важным моментом в формировании данного запроса является условие выборки. В нем для тех полей, которые участвуют в сортировке результата запроса, накладываются дополнительные условия для получения последующих 22-х записей. В нашем случае это поля «_Foder», «_Description» и «_IDRRef».
Примечание: поле «_Folder» указывает на принадлежность записи таблицы группе или элементу справочника. Если значение в поле равно «0x00», тогда это группа. Если же значение «0x01», тогда это элемент справочника. Для того, чтобы разработчику было удобно работать с данным полем, его преобразовывают обратным образом. В запросе имеется выражение: . То есть, если для платформы значение «0x00» (Ложь) указывает, что запись принадлежит группе, то для разработчика то же самое значение говорит, что запись принадлежит элементу.

Для всех полей, кроме ссылки, условие имеет вид «больше или равно». Для ссылки оно всегда «больше». В параметры передаются данные от последней выбранной записи в динамическом списке. Например, когда мы разворачивали группу элементов «Группа — 1 — 1», то последний из 22-х отобранных элементов был «Элемент — 1 — 1 — 118». В параметры запроса передается ссылка на родителя, флаг «ЭтоГруппа», наименование и ссылка на элемент «Элемент — 1 — 1 — 118» для, соответственно, «P1», «P2», «P3» и «P4».

Прежде чем формировать выборку последующих 22-х элементов, платформа получает данные для последнего выбранного элемента:
Получение данных по последней выбранной записи
Получение данных по последней выбранной записи
Передав ссылку на последний элемент, запрос получает все данные для передачи параметров в запрос для выборки следующей порции элементов (предыдущий запрос выше).

НАСТРОЙКА ОТОБРАЖЕНИЯ СПИСКА

Для динамического списка возможны три варианта просмотра: иерархия, список, дерево. Для просмотра в виде дерева и иерархии запросы к базе данных практически одинаковые и соответствуют тем примерам, которые мы рассматривали выше.В нашем примере мы работали с иерархическим справочником. Но какие запросы будут для справочника без иерархии, если режим просмотра для него установлен «списком»? Все просто. Запросы будут аналогичными, с учетом того, что поле «родитель» будет всегда пустым. Запросы, которые будет формировать платформа, походят на SQL-запросы при раскрытии группы с элементами и при прокрутке списка.

ГРУППИРОВКИ ДИНАМИЧЕСКОГО СПИСКА

При использовании группировок динамического списка, получаемые данные будут группироваться по выбранному полю (полям). Включение группировок приведет к усложнению SQL-запросов к базе, так как платформе необходимо получать дополнительные данные для группировок выборки:

Обратите внимание на появившееся дополнительное левое соединение и дополнительные операции для полей выборки.

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

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

ДИНАМИЧЕСКОЕ СЧИТЫВАНИЕ ДАННЫХ

Реквизит формы с типом «Динамический список» имеет настройку «Динамическое считывание данных» (см. след. скриншот).
Для всех рассматриваемых ранее примеров эта опция была включена. Именно поэтому при прокрутке списка элементов справочника платформа формировала запросы для получения новых порций данных. Если же динамическое считывание данных отключить, то порционное считывание больше не будет работать так, как мы видели в примерах выше.
Вспомните, что порции, которыми платформа «дочитывала» просматриваемый список, составляли 22 записи. При отключенной опции запрос к базе данных будет выглядеть следующим образом:
Как мы видим, количество выбираемых записей в одной порции увеличилось до 1000. Не трудно догадаться, что если в группе справочника содержится более 1000 элементов, то при развертывании группы программа может надолго задуматься, особенно если динамический список содержит сложный произвольный запрос.
Динамическое считывание данных доступно только в том случае, если для динамического списка установлена основная таблица. В нашем примере это справочник «Товары». Если основной таблицы нет, то платформа не может определять порции выбираемых данных. Предполагается, что если нет основной таблицы, то невозможно определить позицию одной записи среди других по ссылке для объектных типов или ключу записи для регистров.

ОТБОР И СОРТИРОВКА

Поскольку динамические списки работают на системе компоновки данных, то для них есть возможность в пользовательском режиме устанавливать отборы и поля сортировки. При построении запросов  к базе данных в таких случаях платформа ведет себя весьма предсказуемо. Для примера, установим отбор по полю «Родитель» и сортировку по полю «Артикул». В результате платформой будет сформирован следующий запрос на выборку данных:
В запросе добавилось условие выборки по параметру «P2» и сортировка по полю «_Fld8». На рисунке новые части запроса обведены серой линией. В параметр «Р2» передается ссылка на значение отбора, выбранного пользователем для родителя. В поле «_Fld8» хранятся значения артикула, и именно по этому полю была установлена сортировка. Таким образом, для пользователей платформа предоставляет очень удобный механизм настройки динамических списков данных, а основанный на системе компоновки данных.

ВЫВОДЫ

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

Автор: Юрий Пермитин

Понравилась статья? Подпишитесь на обновления!



Лучшие материалы по теме

Расскажите своим друзьям
Вам ничего не стоит, а им будет интересно
Подпишитесь на обновления
Ваш e-mail: * Ваше имя: *


Обсудить Вконтакте


Обсудить в Facebook

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *