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