§ 3.6. Форма и запись: две жизни одних данных

С изменённым артикулом не будет ничего: закроете окно, не записав, — в базе останется прежний. И это не милосердие платформы, а устройство. Форма работает не с записью, а с её копией, и копия живёт ровно столько, сколько открыто окно.

1. Два срока жизни

Запись и форма живут по-разному, и это главное различие главы.

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

Последняя строка объясняет многое. Один и тот же товар могут открыть трое — и у каждого будет своя форма со своей копией данных.

Запись одна, а форм у неё столько, сколько людей её открыли. Форма — не запись, а разговор о ней.

2. Что происходит при открытии

Открытие формы — это не «показать запись», а цепочка из трёх шагов, и в ней снова видно разделение на клиента и сервер.

1. сервер читает запись из базы
2. копия попадает в данные формы
3. клиент строит окно по описанию
   формы и показывает копию

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

3. Правка меняет копию

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

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

Блокировка означает не то, чего обычно пугаются. Сосед по-прежнему откроет тот же товар и всё в нём увидит. А вот изменить не сможет: платформа скажет, что данные заняты. Держится это до тех пор, пока первый не запишет или не закроет форму.

что делает платформазачем
помечает форму изменённойчтобы спросить при закрытии
запирает запись для правкичтобы двое не меняли её одновременно; смотреть можно

4. В базу — только явным действием

Копия уходит в базу не сама. Для этого есть действия, и все они видны пользователю кнопками.

действиечто происходит
«Записать»копия уходит в базу, окно остаётся открытым
«Записать и закрыть»то же, и окно закрывается
«Провести» (у документа)запись, а за ней движения по регистрам, если документ их делает

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

Данные попадают в базу только явным действием. Ни закрытие окна, ни переход в другое поле записью не являются.

5. Закрыли без записи — копии нет

Здесь и кроется ответ на вопрос из прошлого параграфа. Закрытие окна завершает жизнь формы: вместе с ней исчезают и её собственные реквизиты, и копия записи.

открыли  → копия в форме
правили  → копия изменилась
закрыли  → копии нет
           в базе — прежнее

Пользователю платформа даёт последний шанс: при закрытии изменённой формы спрашивает, сохранять ли. Ответ «нет» означает ровно то, что написано, — копия исчезает вместе с правками.

Слово на будущее: окно может открываться так, что пользователь обязан сначала закончить с ним, — это называется модальным открытием, — или параллельно с другими, немодально. Разрешены ли модальные окна вообще, задаёт свойство конфигурации: режим использования модальности. В новых конфигурациях он выключен, и окна открываются немодально.

6. В режиме Предприятия

Опыт на две минуты, и он стоит того, чтобы проделать его руками.

  1. Откройте карточку товара «Ручка шариковая» и запомните артикул.

  2. Измените артикул, ничего не нажимая.

  3. Откройте список товаров: в колонке артикула — прежнее значение. База правок не видела.

Здесь будет снимок экранакарточка с изменённым артикулом и список товаров с прежним значением рядом
  1. Вернитесь в карточку и закройте её. На вопрос о сохранении ответьте «нет».

  2. Откройте карточку снова: артикул прежний. Копия ушла вместе с окном.

  3. Повторите опыт, но нажмите «Записать и закрыть». Теперь и в списке новое значение. Верните прежний артикул: база серии должна остаться прежней.

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

Запись и форма — два разных существа с разными сроками жизни: запись лежит в базе, пока её не удалили, а форма живёт от открытия окна до закрытия, и у одной записи их столько, сколько людей её открыли. При открытии сервер читает запись и отдаёт копию на клиента, в данные формы; дальше пользователь правит копию, а в базе остаётся прежнее. С первой правки платформа помечает форму изменённой и запирает запись для правки — смотреть её сосед сможет, менять нет, — а при закрытии спрашивает, сохранять ли. В базу данные попадают только явным действием — «Записать», «Записать и закрыть», «Провести»; закрытие окна записью не является, и вместе с окном исчезают и копия записи, и собственные реквизиты формы.


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

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

  1. Сколько живёт форма и сколько — запись?
  2. Сколько форм может быть открыто у одной записи и что у каждой внутри?
  3. Что происходит, когда пользователь открывает карточку товара?
  4. Пользователь изменил артикул и не нажал ничего. Что увидит его сосед, открывший тот же товар?
  5. Какими действиями данные попадают в базу?
  6. Что теряется при закрытии формы без записи?
  7. Сосед открыл тот же товар, пока вы его правите. Что он увидит и что ему не удастся сделать?

Упражнения

По образцу. Проделайте опыт из параграфа на контрагенте: измените телефон, проверьте список, закройте без сохранения, откройте снова.

Своё: предскажите результат. Пользователь открыл товар, изменил наименование и, не записывая, нажал в карточке кнопку печати ценника (если бы она была). Какое наименование попало бы в ценник, если печать берёт данные из базы, и какое — если из формы?

Ловушка: «я же всё исправил». Кладовщик жалуется: «я поправил артикулы у десяти товаров, а в отчёте старые». Что он, скорее всего, делал и что ему объяснить?

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

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

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