§ 3.5. Типы реквизитов формы: простые, ссылочные, особые

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

1. Три семьи

Типы реквизитов формы удобно делить на три семьи — по тому, что лежит в значении.

семьячто в значениипримеры
простыеодно значениеСтрока, Число, Дата, Булево
ссылочныеуказатель на записьссылка на «Товары», на «Склады»
особыецелая структуратаблица, список и дерево значений, динамический список

Первые две семьи у реквизита объекта тоже есть. Третья — только у формы. Реквизит объекта хранится в базе, и тип ему можно дать лишь такой, какой база умеет хранить в записи; таблицу значений в одну клетку записи не положишь — для строк у объекта есть табличная часть. А форме хранить ничего не надо: её данные живут, пока открыто окно, и тип им можно дать любой.

2. Простые: одно значение

С ними всё знакомо по реквизитам объекта. Флажок «показывать подробности» — булево, строка поиска — строка, итог по весу — число. Разница не в типе, а в хозяине: значение живёт в форме и по умолчанию пропадает с закрытием окна — если не включить сохранение данных в настройках, о котором шла речь в прошлом параграфе.

3. Ссылочные: указатель на запись

Реквизит формы может хранить ссылку на запись — например, на склад, по которому пользователь хочет посмотреть остаток товара.

реквизит формы  ВыбранныйСклад
тип             ссылка на «Склады»
значение        → «Основной»
                  (сама запись — в базе)

Здесь легко спутать два утверждения. Реквизит формы временный — любой, и ссылочный в том числе: закрыли окно, и выбор пропал. Но запись, на которую он указывает, — постоянная: склад «Основной» как лежал в базе, так и лежит. Форма хранит не склад, а палец, которым на него показывают. Кстати, временно в форме живут не только её собственные реквизиты: данные записи внутри «Объекта» тоже, пока их не записали, — к этому вернёмся в следующем параграфе.

Реквизит формы временный, а запись, на которую он указывает, — нет. Забыть можно выбор, но не сам склад.

4. Особые: таблица, которой нет в базе

Самый полезный из особых типов — таблица значений. У неё свои колонки, и задают их прямо в форме, как вложенные строки реквизита.

ОстаткиПоСкладам    таблица значений
├── Склад           ссылка на «Склады»
└── Количество      Число(15,3)

Похожа она на табличную часть, но устроена по-другому — и разница та же, что между реквизитом формы и реквизитом объекта.

табличная часть объектатаблица значений в форме
где заданав дереве объектав форме
где строкив базе, у записив данных открытой формы
кто видитлюбая форма и запростолько эта форма
путьОбъект.ТоварыОстаткиПоСкладам

Отсюда её работа: показать то, что посчитано, а не записано. Остаток товара по складам в записи товара не хранится — он в регистре, — но показать его в карточке таблицей удобно. Таблица значений даёт место, где такому результату жить, пока открыто окно. Сама она из базы ничего не читает: строки кладёт обработчик — или пользователь, если у таблицы на форме разрешено добавление строк.

5. Остальные особые типы — кратко

Остальные особые типы встретятся дальше в книге, здесь достаточно узнать их в лицо.

типдля чегогде встретится
список значенийнабор вариантов на выборв главе о связи полей с данными
дерево значенийстроки с вложенностью, когда таблице тесно в один уровеньдальше в книге не понадобится
динамический списокживой список записей из базыв главе о списках

Последней строке стоит удивиться. «Список» — основной реквизит формы списка, о котором говорилось, когда разбирали основной реквизит, — и есть реквизит особого типа. Он особый даже среди особых: у него свои свойства, а записи для него платформа получает из базы запросом, который строит по этим свойствам. Форме списка он достаётся от конструктора так же, как «Объект» форме элемента. Подробный разговор о нём — в главе о списках.

6. Тип решает, каким будет элемент

Как и у реквизита объекта, вид элемента на экране следует из типа. Перетащили реквизит в элементы — редактор предложит подходящий.

тип реквизитаэлемент по умолчанию
строка, число, датаполе ввода
булевополе, показанное флажком
ссылка на записьполе с кнопкой выбора
таблица значенийтаблица

Правило то же, что у автоформы: «вид поля — по типу реквизита». Только теперь это правило работает и для данных, которых в записи нет. Это короткий взгляд вперёд: как элемент связан с реквизитом — разговор следующей главы.

7. В Конфигураторе и в Предприятии

  1. Откройте форму элемента «Товаров» и добавьте реквизит формы «ОстаткиПоСкладам» с типом «Таблица значений».

  2. Добавьте ему две колонки: «Склад» — ссылка на «Склады», «Количество» — Число.

Здесь будет снимок экранареквизит формы «ОстаткиПоСкладам» с раскрытыми колонками в списке реквизитов
  1. Перетащите реквизит в элементы: на форме появится таблица с двумя колонками.

  2. Обновите конфигурацию базы данных и откройте карточку товара в Предприятии. Таблица есть — и пустая.

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

Главное в одном абзаце

Типы реквизитов формы делятся на три семьи: простые — одно значение, как у реквизитов объекта; ссылочные — указатель на запись; особые — целая структура, которой у реквизита объекта не бывает. Ссылочный реквизит формы временный, а запись, на которую он показывает, остаётся в базе: забыть можно выбор, но не сам склад. Главный из особых типов — таблица значений, рядом с ней список и дерево значений: колонки у неё задают прямо в форме, строки живут в данных открытого окна, и видит её только эта форма — этим она и отличается от табличной части, хотя похожа на неё. Такая таблица — место для того, что посчитано, а не записано, например для остатков по складам. Динамический список, основной реквизит формы списка, — тоже особый тип, со своими свойствами. Вид элемента по-прежнему следует из типа: поле ввода, поле-флажок, поле с кнопкой выбора, таблица.


У формы теперь есть свои данные — простые, ссылочные, целые таблицы, — и все они живут, пока открыто окно. Но и данные записи внутри «Объекта» тоже живут в форме. Что будет с изменённым артикулом, если окно закрыть, не записав?

Контрольные вопросы

  1. На какие три семьи делятся типы реквизитов формы?
  2. Какая семья есть только у реквизитов формы и почему?
  3. Реквизит формы хранит ссылку на склад. Что пропадёт, если закрыть окно, а что останется?
  4. Чем таблица значений в форме отличается от табличной части объекта?
  5. Для чего форме таблица, которой нет в базе? Приведите пример.
  6. К какой семье относится основной реквизит формы списка?
  7. Как тип реквизита формы связан с элементом на экране?

Упражнения

По образцу. Добавьте форме элемента «Контрагентов» реквизит «ПоследниеПоступления» типа «Таблица значений» с колонками «Документ» и «Сумма». Выведите его таблицей.

Своё: подберите тип. Какой тип вы дадите реквизиту формы для каждого значения: «склад, выбранный для просмотра остатка», «варианты сортировки на выбор», «строки с итогами по месяцам», «признак, что форма открыта только для просмотра»?

Ловушка: «удалил выбор — удалился склад». Пользователь боится очищать поле «Выбранный склад» в карточке товара: «вдруг склад пропадёт из базы». Что вы ему объясните?

Обратный ход. В чужой форме видна таблица, но в дереве объекта нет табличной части с такими колонками. Где искать её данные и что это говорит о том, откуда берутся строки?

На чтение. В списке реквизитов формы: «Объект», «Список» и «ИтогиПоМесяцам» типа «Таблица значений». Что здесь не так?

Ответы — в конце части.