§ 6.4. Динамический список: таблица, которая показывает базу
Откройте список товаров и поищите кнопку «Записать». Её нет — и не потому, что её забыли. Записывать нечего: строки этой таблицы не лежат ни в записи, ни в форме. Список их не хранит, а показывает — берёт из базы запросом и показывает то, что запрос вернул на момент выборки. Такой реквизит формы называется динамическим списком.
1. Что это такое
Динамический список — реквизит формы особого типа, о котором мы вскользь говорили в главе о данных. За ним стоит запрос к базе, и документация описывает его именно так: он даёт возможность описать в форме запрос, указать порядок сортировки, отборы, группировки и оформление.
| табличная часть | таблица значений | динамический список | |
|---|---|---|---|
| где строки | в записи | в данных формы | в базе |
| кто их кладёт | пользователь и код | код | запрос |
| записываются ли | вместе с записью | никогда | нечего записывать |
Третья колонка — главное отличие. Две первые таблицы держат строки у себя, динамический список держит только правило, по которому строки берутся.
Табличная часть и таблица значений хранят строки. Динамический список хранит вопрос к базе, а строки получает в ответ.
Строже: у этого реквизита заданы основная таблица — или текст запроса, если он написан вручную, — отбор, порядок и оформление; по ним платформа строит запрос, выполняет его и приносит строки.
2. Основная таблица: что показывать
Первое, что читают у динамического списка, — основную таблицу. Документация называет её таблицей, главной в запросе: например, справочник «Товары».
| что задали | что сделала платформа |
|---|---|
| основная таблица «Справочник.Товары» | сама построила запрос к товарам |
| ничего больше | колонки, сортировка, выбор — по умолчанию |
Это та же декларативность, что всюду в книге. Пока запрос строит платформа, никто не пишет «загрузи товары и выведи их в таблицу» — задают, что показывать, а как достать, решает она. Если стандартного запроса мало, у списка есть флажок произвольного запроса: с ним текст запроса пишет разработчик.
3. Запрос на сервере, строки на клиенте
Принцип клиента и сервера виден здесь нагляднее, чем где бы то ни было.
клиент: показать товары
│
сервер: запрос к базе
│
клиент: получил строки,
которые видны на экране
У динамического списка есть свойство «Динамическое считывание данных»; документация описывает его так: выбирать данные только при необходимости их отображения на экране. Когда оно включено, список из ста тысяч товаров не тянет все строки на клиент: приходит порция — столько, сколько нужно показать на экране и хватить на ближайшую прокрутку. Прокрутил — пришла следующая.
4. Почему список нельзя записать
Раз список только показывает и строк у себя не держит, записывать в нём нечего. Строки списка — не копия записей, а результат запроса, чаще всего по строке на запись. Править их прямо в списке обычно и не дают: правят запись, открывая её форму.
| что делает пользователь | что происходит |
|---|---|
| двойной щелчок по строке | открывается форма этого товара |
| правит и записывает карточку | меняется запись в базе |
| возвращается в список | список показывает новое значение |
Отсюда граница, которую стоит держать в голове: в табличной части правка строки — это правка документа; в динамическом списке правка строки — это правка другой записи, открытой из списка.
5. Сколько списков в форме
Основной реквизит формы списка — динамический список, и называется он обычно «Список». Но динамический список может жить и в другой форме, дополнительным реквизитом: например, в карточке контрагента можно показать его поступления.
| где | какой реквизит |
|---|---|
| форма списка товаров | основной реквизит «Список» |
| карточка контрагента | дополнительный реквизит — список его поступлений |
Во втором случае форма говорит о контрагенте, а список показывает связанные с ним записи — те самые «данные помимо записи», о которых шла речь в главе о данных, только берутся они из базы.
6. Как узнать динамический список в чужой форме
Признаки читаются по путям и типам.
| признак | где смотреть |
|---|---|
| реквизит формы типа «динамический список» | список реквизитов |
| путь таблицы — имя этого реквизита | свойства таблицы |
| пути колонок — «Список.Наименование» | свойства колонок |
| у таблицы нет кнопок добавления строк | командная панель таблицы |
Путь колонки здесь начинается не с «Объект.», а с имени списка, и дальше идёт имя поля запроса. А колонок может быть и больше, чем реквизитов у товара: какие поля даёт запрос и как их отбирают и сортируют — это уже настройки списка, о них разговор впереди.
7. В Предприятии
Опыт на то, что строки берутся из базы.
- Откройте список товаров. Найдите: есть ли кнопка «Записать», можно ли поменять наименование прямо в строке.
-
Откройте двойным щелчком ручку шариковую, поменяйте наименование на «Ручка шариковая синяя» и запишите.
-
Вернитесь в список: строка показывает новое наименование.
-
Верните прежнее наименование «Ручка шариковая» и запишите: база серии должна остаться прежней.
-
Отсортируйте список по коду и обратно по наименованию. Сортировка меняет только порядок показа — в базе ничего не произошло.
Главное в одном абзаце
Динамический список — реквизит формы, за которым стоит запрос к базе: он не хранит строки, а показывает то, что в базе есть сейчас. В отличие от табличной части, чьи строки живут в записи, и таблицы значений, чьи строки живут в форме, динамический список держит только правило, а строки получает в ответ на запрос. Главное его свойство — основная таблица: задали «Справочник.Товары», и платформа сама построила запрос; если этого мало, запрос пишут вручную, включив произвольный. Запрос выполняется на сервере, а на клиент уходит порция строк, видимых на экране, — поэтому большой список открывается быстро. Записывать список нечего: правят запись, открывая её форму, а список потом показывает новое. Основной реквизит формы списка — динамический список «Список», но такой список может жить и в другой форме, дополнительным реквизитом. В чужой форме его узнают по типу реквизита и по путям колонок, которые начинаются с его имени.
Динамический список мы видели в автоформе списка. Но где он живёт, когда форму списка собирают свою, и что меняется, если открыть её в редакторе?
Контрольные вопросы
- Где живут строки динамического списка и чем это отличает его от табличной части и таблицы значений?
- Что такое основная таблица динамического списка?
- Как здесь проявляется декларативность?
- Почему список из ста тысяч товаров открывается быстро?
- Почему у формы списка нет кнопки «Записать»?
- Может ли динамический список быть не основным реквизитом формы? Приведите пример.
- Как узнать динамический список в чужой форме?
Упражнения
По образцу. Проделайте тот же опыт на справочнике складов: поменяйте наименование склада в карточке, посмотрите список, верните.
Своё: где строки. Для каждой таблицы скажите, где живут её строки: товары в поступлении; список контрагентов; остатки по складам в карточке товара; поступления в карточке контрагента.
Ловушка: «отсортировал — испортил базу». Пользователь боится сортировать список товаров по артикулу: «вдруг товары перемешаются». Что вы объясните?
Обратный ход. В чужой форме таблица, у колонок пути начинаются с «Список.», кнопок добавления строк нет. Что за реквизит за этой таблицей и где искать правку строк?
На чтение. В карточке склада есть таблица с путём «ТоварыНаСкладе», и в списке реквизитов формы у этого реквизита тип «динамический список». Что показывает таблица и почему её не записывают вместе со складом?
Ответы — в конце части.