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