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