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