Мінімізація кількості серверних викликів
1.1. Розробку керованого застосунку необхідно вести з контролем кількості викликів серверних процедур і функцій із клієнтського коду (серверних викликів), а в деяких випадках — також обсягу переданих даних між клієнтом і сервером (трафіку).Запуск клієнтського застосунку. Відкриття керованої форми. Виконання локальної команди керованої форми. Вибір із довідника. Виконання глобальної команди. Виконання команди формування звіту. Виконання підбору елементів. Див. також
Запуск клієнтського застосунку
Виконання локальної команди керованої форми
Виконання команди формування звіту
1.1. Розробку керованого застосунку необхідно вести з контролем кількості викликів серверних процедур і функцій із клієнтського коду (серверних викликів), а в деяких випадках – також обсягу переданих даних між клієнтом і сервером (трафіку).
Загальна кількість серверних викликів складається з
-
звернень до сервера, які виконує платформа 1С:Підприємство,
-
і викликів, які виконуються з клієнтського коду конфігурації – відхилення, що вноситься конфігурацією щодо платформи.
Загалом, під час проєктування клієнт-серверної взаємодії в конфігурації слід керуватися тим, що на кожну дію користувача в клієнтському коді конфігурації не повинно виконуватися додаткових викликів на сервер. Будь-які винятки з цього правила потребують додаткового обґрунтування.
1.2. Окремо для режиму з низькою швидкістю з’єднання слід оптимізувати не тільки кількість викликів, а й обсяг переданих даних між клієнтом і сервером (трафік). Налагодження клієнт-серверної взаємодії в цьому режимі роботи рекомендується проводити в режимі імітації затримок серверних викликів.
Нижче розглянуто типові дії користувача та наведено рекомендації щодо організації клієнт-серверної взаємодії.
Запуск клієнтського застосунку
2.1. У найпростішому випадку код конфігурації, що виконується під час запуску клієнтського застосунку, не повинен призводити до звернень на сервер. У тих випадках, коли все ж необхідно отримувати дані з сервера:
-
не слід безпосередньо викликати серверні процедури та функції з коду модуля застосунку, модуля керованого застосунку й модуля зовнішнього з’єднання.
-
правильно: за один виклик на сервер передавати на клієнт усі параметри, необхідні для запуску застосунку.
Якщо параметри для запуску клієнтського застосунку потрібно запитувати із сервера з різних місць клієнтського коду, слід розмістити таку функцію в загальному серверному модулі з повторним використанням значень, що повертаються. Під час першого виклику цієї функції відбувається одне звернення до сервера, після чого отримане значення автоматично кешується платформою на клієнті для всіх повторних викликів цієї функції.
Приклад:
// Фрагмент загального серверного модуля СтандартніПідсистемиПеревизначуваний з повторним використанням значень, що повертаються Функция ПараметрыРаботыКлиента() Параметры = Новый Структура(); Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); // Ініціалізація інших параметрів, необхідних на клієнті під час запуску застосунку // Параметры.Вставить(имя параметра, значение параметра); Возврат Параметры; КонецФункции
Приклад клієнтського коду, що використовує функцію ПараметрыРаботыКлиента :
ИнформационнаяБазаФайловая = СтандартныеПодсистемыПереопределяемый. ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая; Если ИнформационнаяБазаФайловая Тогда // обробка цього випадку в клієнтському коді //…
Див. також: Використання значень, що впливають на поведінку клієнтського застосунку
Відкриття керованої форми
3.1. Якщо відкриття форми виконується з коду, слід відкривати форму за один виклик за допомогою методу глобального контексту ОткрытьФорму (у разі використання версії платформи 1С:Підприємство 8.2 і більш ранніх версій — також ОткрытьФормуМодально). Для передавання параметрів у форму слід використовувати параметр цих методів Параметры.
3.2. Під час відкриття форми не допускається виконувати звернення до сервера з коду модуля форми в обробниках клієнтських подій форми, таких як ПриОткрытии і ПриПовторномОткрытии. За потреби звернення з них до серверних даних слід розміщувати ці дані в реквізитах форми в ПриСозданииНаСервере.
Наприклад, неправильно:
НастройкаПроксиСервера = СерверныйМодуль.НастройкаПроксиСервера(); ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера", Новый Структура("Настройка", НастройкаПроксиСервера));
правильно:
ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера");
при цьому отримання значення константи виконувати в обробнику ПриСозданииНаСервере форми ПараметрыПроксиСервера.
Виконання локальної команди керованої форми
4.1. Виконання локальної команди форми має призводити не більш ніж до одного виклику сервера.
- Якщо команда виконує лише клієнтські операції (призводить до відкриття нової форми, установлює відбір у списку, змінює стиль оформлення тощо), то всі необхідні дані для її виконання мають бути заздалегідь передані на клієнт. Рекомендується заздалегідь готувати ці дані в обробнику події форми ПриСозданииНаСервере і розміщувати їх у реквізитах форми.
Приклад:
Під час вибору товарів зі списку номенклатури потрібно заборонити користувачеві вибір груп номенклатури: при спробі вибрати групу програма має видавати зупинювальне повідомлення. Для перевірки, чи є вибраний елемент номенклатури групою, неправильно викликати окрему серверну функцію. Слід додати до таблиці значень, яка пов’язана з полем списку на формі, реквізит ЭтоГруппа і заповнювати його в обробнику події форми ПриСозданииНаСервере . Тоді перевірка на клієнті виконується без додаткового серверного виклику й має вигляд:
ТекущаяСтрока = Элемент.ТекущиеДанные; Если ТекущаяСтрока.ЭтоГруппа Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = НСтр("ru = 'Вибір групи заборонено.'"); Сообщение.Сообщить(); Возврат; КонецЕсли;
- Якщо команда пов’язана з виконанням бізнес-логіки, яку можливо відпрацювати лише на сервері, то вся вона має виконуватися за один серверний виклик.
Вибір із довідника
4.2. У загальному випадку під час вибору з довідника допускається виконувати лише один серверний виклик із коду, до якого призводить виклик методу глобального контексту ОткрытьФорму (або ОткрытьФормуМодально).
4.3. Якщо після вибору з довідника необхідно виконати бізнес-логіку, яку можливо відпрацювати лише на сервері, то допустимо виконувати її за один додатковий серверний виклик.
Виконання глобальної команди
5.1. Під час виконання глобальної команди допускається виконувати лише один серверний виклик із коду. Якщо команда відкриває форму, то цей виклик має виконуватися під час виклику методу глобального контексту ОткрытьФорму (або ОткрытьФормуМодально).
Виконання команди формування звіту
6.1. Під час виконання команди формування звіту не допускається виконувати додаткових серверних викликів із коду конфігурації.
Зокрема, під час відкриття форми звіту не допускається виконувати звернення до сервера з коду модуля форми в обробниках клієнтських подій форми, таких як ПриОткрытии і ПриПовторномОткрытии.
Наприклад, неправильно виконувати формування звіту, що використовує систему компонування даних, з обробника форми ПриОткрытии :
&НаКлиенте Процедура ПриОткрытии(Отказ) ВывестиОтчет(); КонецПроцедуры &НаСервере Процедура ВывестиОтчет() // код для формування звіту… КонецПроцедуры
правильно:
- відкривати форму звіту з параметром СформироватьПриОткрытии = Истина, або
- установити параметр форми СформироватьПриОткрытии у значення Истина в обробнику ПриСозданииНаСервере.
Виконання підбору елементів
7.1. Особливість клієнт-серверної взаємодії під час виконання підбору елементів полягає в необхідності передавати список вибраних елементів між формою об’єкта та формою підбору. При цьому обсяг переданих даних може бути досить великим.
У цьому випадку не рекомендується передавати потенційно великий масив даних як параметр форми підбору. Потенційно великий масив даних, що зберігається у формі підбору в параметрі типу ДанныеФормыКоллекция, може виявитися на клієнті неповним через оптимізацію роботи керованої форми. Як результат – для передавання параметра буде виконано додаткове «дочитування» даних форми із сервера.
7.2. З метою оптимізації передавання даних між формою об’єкта та формою підбору рекомендується використовувати тимчасове сховище, читання й запис до якого мають виконуватися на сервері.
Проілюструємо методику використання форми підбору на прикладі підбору елементів довідників Товары у табличну частину Товары документа РасходТовара. (З демонстраційної конфігурації для платформи 1С:Підприємство).
Відкриття форми підбору з клієнтського коду має призводити не більш ніж до двох звернень на сервер. З цією метою локальна команда відкриття форми підбору в модулі форми документа РасходТовара поміщає список товарів із табличної частини в тимчасове сховище (перший виклик) і відкриває форму підбору (другий виклик), передаючи адресу тимчасового сховища:
&НаКлиенте Процедура ОбработчикКомандыПодбора() АдресТоваровВХранилище = ПоместитьТоварыВХранилище(); ПараметрыПодбора = Новый Структура("АдресТоваровДокумента, ВидЦен, Склад", АдресТоваровВХранилище, Объект.ВидЦен, Объект.Склад); ФормаПодбора = ОткрытьФорму("Документ.РасходТовара.Форма.ФормаПодбора", ПараметрыПодбора, ЭтаФорма); КонецПроцедуры &НаСервере // Функція поміщає список товарів у тимчасове сховище та повертає адресу Функция ПоместитьТоварыВХранилище() Возврат ПоместитьВоВременноеХранилище(Объект.Товары.Выгрузить(,"Товар,Цена,Количество"), УникальныйИдентификатор); КонецФункции
Форма підбору отримує список вибраних товарів із тимчасового сховища в обробнику ПриСозданииНаСервере:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) АдресТоваровДокумента = Параметры.АдресТоваровДокумента; Товары.Загрузить(ПолучитьИзВременногоХранилища(АдресТоваровДокумента)); … КонецПроцедуры
Закриття форми підбору має призводити не більш ніж до двох звернень на сервер. Під час закриття форма підбору поміщає список вибраних товарів у тимчасове сховище (перший виклик):
&НаКлиенте Процедура ОКВыполнить() ЗаписатьПодборВХранилище(); ВладелецФормы.ОбработатьПодбор(); Закрыть(); КонецПроцедуры &НаСервере Процедура ЗаписатьПодборВХранилище() ПоместитьВоВременноеХранилище(Товары.Выгрузить(), АдресТоваровДокумента); КонецПроцедуры Потім форма документа відновлює список товарів із тимчасового сховища (другий виклик на сервер): &НаКлиенте Процедура ОбработатьПодбор() Экспорт ПолучитьТоварыИзХранилища(АдресТоваровВХранилище); КонецПроцедуры &НаСервере Процедура ПолучитьТоварыИзХранилища(АдресТоваровВХранилище) Объект.Товары.Загрузить(ПолучитьИзВременногоХранилища(АдресТоваровВХранилище)); КонецПроцедуры
Див. також
- Використання значень, що впливають на поведінку клієнтського застосунку
- Використання об’єкта ДанныеФормыКоллекция
- Оптимізація клієнт-серверної взаємодії прикладних рішень (ІТС)