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

Первый вариант решения

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

Для этого создадим форму документа и ее команду ПересчетЦен. Перетащим команду в командную панель таблицы формы Товары. Обработчик команды заполним следующим образом (листинг 4.17).

Листинг 4.17. Обработчик команды «ПересчетЦен»

&НаКлиенте

Процедура ПересчетЦен(Команда)

 

Для Каждого ТекСтрокаТовары Из Объект.Товары Цикл

ТекСтрокаТовары.Цена = ТекСтрокаТовары.Цена * 1.1;

ТекСтрокаТовары.Сумма = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Цена;

 

КонецЦикла;

 

КонецПроцедуры

В этом обработчике мы в цикле обходим табличную часть документа и пересчитываем цены и суммы товаров.

ПРИМЕЧАНИЕ

Этот пример можно посмотреть в демонстрационной конфигурации «04 (вар. 1) Использование контекстных серверных процедур для пересчета данных коллекций форм».

Запустим «1С:Предприятие», откроем документ РасходнаяНакладная № 2 (он содержит 1000 позиций товаров) и нажмем кнопку Пересчет цен. После этого цены и суммы товаров пересчитаются по заданному нами алгоритму (рис. 4.30).

Пересчет всех строк табличной части произойдет непосредственно на клиенте. Но при нажатии кнопки Пересчет цен произойдет двадцать восемь вызовов сервера (рис. 4.31).

Рис. 4.31. Показатели производительности

Так происходит потому, что при открытии формы на клиент передается 35 строк табличной части, и затем, по мере программного обращения, остальные строки «дочитываются» с сервера порциями по 35 строк (1015 = 28 * 35 + 35).

В процессе пересчета все недостающие (965 = 1000 - 35) строки «приедут» с сервера на клиент. При следующем контекстном вызове все измененные данные, то есть все 1000 строк, «поедут» обратно на сервер (рис. 4.32).

Рис. 4.32. Схема программного взаимодействия сервера и клиента

Например, сделаем команду Вызов сервера, после пересчета цен вызовем из нее пустую серверную контекстную процедуру и посмотрим на показатели производительности (рис. 4.33).

Рис. 4.33. Показатели производительности

Для наглядности рассмотрим схему передачи данных между клиентом и сервером (рис. 4.34).

Рис. 4.34. Схема передачи данных между клиентом и сервером

Рассмотрим подробнее, сколько вызовов сервера при этом произойдет и каков будет объем передаваемых данных между клиентом и сервером. Мы специально рассматриваем пример документа с большой табличной частью, так как на нем лучше сравнивать показатели производительности.

Таблица 4.1. Показатели производительности

Текущие вызовы Отправлено Принято
Открытие формы 2 1811 16343
Пересчет табличной части 28 11327 161774
Контекстный серверный вызов 1 205591 1106

При открытии формы 2 вызова сервера происходят при открытии формы в первый раз, при следующем открытии – 1 вызов.

Объем принятых данных отражает ситуацию, когда на клиент «приезжают» форма и «видимые» 35 строк табличной части.

При пересчете табличной части 28 вызовов сервера тратятся на «дочитывание» строк табличной части документа на клиент порциями по 35 строк.

Объем принятых данных отражает ситуацию, когда табличная часть «доехала» в форму документа на клиент.

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

При следующем контекстном вызове объем отправленных данных отражает ситуацию, когда все 1000 измененных строк табличной части «уезжают» на сервер.

Таким образом, объем принятой информации – 16 343 + 161 774 = 178 117 байтов, а объем отправленной – 205 591 байт.

Если сравнить объем принятых и переданных данных, то получится, что форма и 1000 строк, переданные на клиент, меньше, чем 1000 строк, переданных с клиента на сервер. Это действительно так, потому что обратно передаются не только строки, но и служебная информация о том, что строка изменена.

Таким образом, в первом случае 161 774 байта информации передается на клиент и 205 591 байт передается на сервер. Как видите, объем передаваемых данных будет довольно большим (161 774 + 205 591 = 367 365 байтов). На самом деле, как будет показано ниже, более эффективно этот расчет будет работать на сервере.

Назад: Использование контекстных серверных процедур для пересчета данных коллекций форм
Дальше: Второй вариант решения