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