§ 3.3. Разворачиваем «Объект»: откуда в форме реквизиты товара

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

1. Что внутри

Развёрнутый основной реквизит показывает всё, из чего состоит запись справочника.

Объект   (СправочникОбъект.Товары)
├── Ссылка
├── Код
├── Наименование
├── Родитель
├── ПометкаУдаления
├── Артикул
└── ЕдиницаИзмерения
Здесь будет снимок экранасписок реквизитов формы элемента «Товаров», «Объект» развёрнут

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

2. Откуда: из типа, а не из копирования

Реквизиты товара форма к себе по одному не копировала. В её описании хранится одна строка — реквизит «Объект» с типом объекта справочника «Товары», — а состав этого типа платформа берёт из описания справочника. Развернуть «Объект» — значит заглянуть в этот тип.

образ    опись состава, а не склад
         значений
строго   реквизит формы типа
         СправочникОбъект.Товары
адрес    реквизиты формы, «Объект»,
         значок раскрытия

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

Реквизиты объекта в форме не лежат, а видны: форма смотрит на них через тип основного реквизита.

3. Данные идут за объектом, раскладка — нет

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

чтоидёт ли за объектомпочему
реквизиты внутри «Объекта»дачитаются из типа
элементы — поля на экраненетхранятся в форме

Новый реквизит у формы есть — данными. Пользователю его не видно, потому что поля для него никто не положил. Вывести его — дело одного перетаскивания из реквизитов в элементы, того самого жеста, о котором шла речь в разговоре о редакторе формы.

Своя форма отстаёт от объекта не данными, а раскладкой. Состав данных у неё всегда свежий, а поля — те, что положили.

4. Путь через точку

У каждой строки внутри «Объекта» есть полный адрес: имя основного реквизита, точка, имя реквизита объекта. Артикул товара в форме — это Объект.Артикул, единица — Объект.ЕдиницаИзмерения, наименование — Объект.Наименование.

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

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

5. У документа внутри есть и таблица

То же правило работает у документов, и там в «Объекте» видна ещё одна вещь. У справочника «Товары» табличных частей нет, у документа поступления есть, и развёрнутый «Объект» покажет её вместе с колонками.

Объект   (ДокументОбъект.ПоступлениеТоваров)
├── Номер, Дата
├── Контрагент, Склад, СуммаДокумента
└── Товары          ← табличная часть
    ├── Товар
    ├── Количество
    ├── Цена
    └── Сумма

Путь к колонке длиннее на одно звено: Объект.Товары.Количество. Табличная часть — тоже данные записи, и приходит она тем же путём: из типа.

6. Как этим пользоваться при чтении чужой формы

В списке реквизитов чужой формы реквизиты объекта перечислены не будут — там одна строка «Объект». Отсюда два правила чтения.

видимделаем
нужен реквизит объектаразворачиваем основной реквизит
строка вне «Объекта»реквизит формы: сам он в дереве объекта не найдётся

Второе правило избавляет от целого класса поисков вслепую. Если поле на форме связано не с «Объект.…», его значение не хранится в этой записи, как бы похоже на реквизит товара оно ни выглядело. Проверим оба правила в редакторе.

7. В Конфигураторе

  1. Откройте форму элемента «Товаров», разверните «Объект» и сравните состав с деревом справочника.

  2. Добавьте справочнику «Товары» реквизит «Вес» с типом Число.

  3. Вернитесь в форму и снова разверните «Объект»: «Вес» уже там.

  4. Посмотрите на предпросмотр внизу: поля «Вес» на нём нет — раскладку никто не менял.

  5. Удалите реквизит «Вес» из справочника: он был нужен для опыта, а база серии должна остаться такой, какой её знают другие книги.

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

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


Всё, что внутри «Объекта», пришло из записи. Но форме нужны и такие данные, которых в записи нет и быть не должно. Где их держать?

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

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

Упражнения

По образцу. Разверните «Объект» у формы элемента «Контрагентов» и выпишите, какие строки пришли из дерева справочника, а какие стандартные.

Своё: предскажите путь. Не открывая редактор, запишите полные пути к ИНН контрагента и к цене в строке поступления. Потом сверьте.

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

Обратный ход. В чужой форме поле связано с путём «Объект.Комментарий». Что можно сказать о «Комментарии», не открывая дерево объекта?

На чтение. В списке реквизитов формы поступления две строки: «Объект» типа ДокументОбъект.ПоступлениеТоваров и «ИтогоВес» типа Число. Что из этого хранится в базе, а что форма держит у себя?

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