Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Экспортируемые процедуры формы
Дальше: Глава 3.7. Работа с данными объекта в форме

Глава 3.6. Контекстные и внеконтекстные серверные вызовы

Теперь рассмотрим подробнее, что происходит при контекстных и при внеконтекстных серверных вызовах в форме. Для упрощения рассказа мы опустим тонкости оптимизации и кеширования, которые выполняет при этом платформа, так как на суть описываемых действий это не влияет.

Когда из клиентской процедуры/функции вызывается серверная (с директивой компиляции &НаСервере) процедура/функция, происходит передача всей формы на сервер.

Сначала контекст формы (реквизиты формы, элементы формы, параметры формы) специальным образом упаковываются и подготавливаются к передаче на сервер (рис. 3.24).

Рис. 3.24. Подготовка контекста формы и передача его на сервер

На рисунке темным цветом выделены те данные, которые, возможно, были изменены на клиенте.

На сервере создается серверная часть формы, полученный контекст разворачивается в данные, элементы и реквизиты формы, после чего инициализируется модуль формы (рис. 3.25).

Рис. 3.25. Получение контекста формы и инициализация серверной части модуля формы

После того как программный объект формы будет полностью подготовлен к работе, выполняется код той процедуры/функции, которая была вызвана на клиенте (рис. 3.26).

Рис. 3.26. Выполнение кода на встроенном языке из модуля формы

На рисунке темным цветом выделены те данные, которые, возможно, были изменены на сервере в процессе выполнения серверной процедуры.

После того как исполнение кода на сервере будет закончено, происходит обратное действие. Контекст формы упаковывается и передается обратно на клиент, в клиентскую часть формы (рис. 3.27).

Рис. 3.27. Упаковка контекста формы и передача его на клиент

На клиенте происходит синхронизация контекста формы: имеющийся контекст заменяется контекстом, полученным с сервера. А на сервере происходит уничтожение серверной части формы (рис. 3.28).

Рис. 3.28. Замена контекста на клиенте и уничтожение серверной части формы

Таким образом, контекстный вызов формы – довольно затратный и непростой процесс. Использовать все время только контекстные вызовы сервера было бы расточительно и непроизводительно. Поэтому контекстные вызовы сервера рекомендуется использовать тогда, когда обойтись без них очень трудно или невозможно вообще.

В то же время есть масса ситуаций, когда нужно выполнять некоторые действия на сервере, но контекст формы при этом не нужен. Для этого используются внеконтекстные серверные вызовы, когда из клиентской процедуры вызывается серверная процедура с директивой компиляции &НаСервереБезКонтекста.

В этом случае из модуля клиентской части формы выполнение кода сразу же передается на сервер, во внеконтекстную процедуру. После ее выполнения осуществляется возврат на клиент (рис. 3.29).

Рис. 3.29. Внеконтекстный вызов серверной процедуры/функции

Внеконтекстный вызов проще, эффективнее и производительнее. Именно его рекомендуется использовать в большинстве случаев.

Однако не стоит увлекаться фанатичной погоней за производительностью, осуществляя только внеконтекстные вызовы и передавая контекст формы в параметрах вызываемой процедуры.

Во-первых, всегда следует искать золотую середину между «читабельностью» программы и ее производительностью. Можно так «заоптимизировать» прикладное решение, что разобраться в нем через некоторое время не сможет уже никто, включая самого автора.

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

Поэтому если на сервере требуется обращаться к большому массиву данных, которые хранятся в данных формы, то выгоднее выполнить именно контекстный серверный вызов. Потому что в этом случае платформа эффективно выполнит передачу данных формы на сторону сервера, там сконструирует соответствующий контекст и обратно перешлет данные на клиент.

Назад: Экспортируемые процедуры формы
Дальше: Глава 3.7. Работа с данными объекта в форме