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