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