Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C
Разработка - Практика программирования
Начиная с платформы 8.2 (далее управляемое приложение), разработчикам стала доступна возможность самим определять, где будет выполняться код, на севере или на клиенте. Такая необходимость возникла в связи с появлением "тонкого клиента" и "веб-клиента", которые могут работать через интернет, что несомненно накладывает определенные ограничения на передачу данных.
В предыдущих версиях платформы 8.0 и 8.1 (далее обычное приложение) не было нужды задумываться над указанием директив выполнения функций, так как на клиенте был доступен тот же функционал, что и на сервере, т.е. на форме можно было напрямую обратиться к объекту справочника или документа или выполнить запрос к базе данных, но теперь для этого необходимо явно указать директиву компиляции.
Прежде чем переходить к основной части, сделаем предположение, что Вы уже знакомы с клиент-серверной архитектурой в 1С, если же нет, то советую предварительно с ней ознакомиться.
Директивы компиляции
Директивы компиляции, что же это такое? Давайте сначала обозначим, что форма - это объект, который создается в процессе работы прикладного решения и состоит из двух частей, которые выполняются в двух контекстах, на клиенте и на сервере. Взаимодействие между частями осуществляется с помощью серверного вызова.
Так вот, директивы компиляции - это специальные ключевые слова, позволяющие указать платформе, в каком контексте необходимо выполнить процедуру или функцию.
Указывать директивы для процедур и функций можно не только в модулях форм, но и в модулях команд, а также общих модулях, однако использовать их рекомендуется только в модулях управляемых форм и в модулях команд.
Существует пять различных директив:
&НаКлиенте
&НаСервере
&НаСервереБезКонтекста
&НаКлиентеНаСервереБезКонтекста
&НаКлиентеНаСервере
Рассмотрим их подробнее:
Директива &НаКлиенте указывает на то, что код функций/процедур будет выполняться в контексте клиентского приложения, где будут доступны только элементы, параметры и реквизиты формы.
Доступны вызовы любых процедур модуля формы.
При указании директивы &НаСервере, для процедур/функций будут доступны не только данные формы, но и возможность обращаться к данным базы. Выполнение кода будет происходить на сервере.
Обращение к процедурам на клиенте уже не доступно. Т.е., находясь на сервере, нельзя инициировать вызов клиентских процедур и функций.
Начиная с платформы 8.3.10 стала доступна возможность получать данные с клиента на сервере, используя систему взаимодействия.
Если указана директива &НаСервереБезКонтекста, это означает, что код будет выполняться на сервере, но доступа к контексту формы (реквизиты, параметры, элементы) уже не будет.
Доступны вызовы только внеконтекстных процедур и функций.
Директива &НаКлиентеНаСервереБезКонтекста необходима, если требуется выполнение процедуры/функции и на сервере и на клиенте. Данная директива используется редко, но является полезной и позволяет вместо двух процедур, для выполнения в разных контекстах, указать всего одну.
Последняя директива &НаКлиентеНаСервере по сути аналогична &НаКлиентеНаСервереБезКонтекста, но доступна она только в модуле команд.
Если по ошибке не указать директиву, то платформа сама ее поставит. По умолчанию это директива &НаСервере.
Помимо директив, существуют еще и инструкции препроцессора, которые обозначаются символом #. Они действуют на исходный текст модулей и выполняются перед компиляцией кода. В результате применения директив и инструкций, в скомпилированном модуле остается только то, что должно присутствовать в том или ином контексте.
Контекстные и внеконтекстные вызовы
Разобравшись с тем, что такое директивы, разберем понятие контекста.
"Контекст" - это так называемое окружение, в котором доступны определенные свойства, методы, набор объектов встроенного языка, а также процедуры и функции.
Контекст может быть глобальным и локальным (контекст конкретного модуля). Глобальный контекст доступен в любой точке конфигурации, локальный же в пределах одного модуля. В свою очередь, в пределах одного модуля, контекст также можно разделить на клиентский и серверный, т.е. процедуры и функции одного модуля могут быть выполнены в разных контекстах.
Контекстный вызов формы является довольно затратным процессом, понять это можно при рассмотрении процесса взаимодействия клиентской и серверной части формы.
Если для процедуры/функции указать директиву &НаСервере, то при ее вызове будет происходить передача всей формы на сервер, т.е. все реквизиты, параметры и элементы формы будут специальным образом упакованы и переданы на сервер. На сервере полученный "контейнер" распаковывается и дальше происходит инициализация модуля формы.
После выполнения кода на сервере выполняется обратный процесс, происходит упаковка и передача на клиент контекста формы. На клиенте происходит распаковка и синхронизация данных формы. Контекст формы на сервере при этом уничтожается.
Для уменьшения объема передаваемых данных на сервер как раз и используется внеконтекстный вызов, процедуры/функции при этом должны быть помечены директивой &НаСервереБезКонтекста.
Для более детального изучения вопроса о клиент-серверных вызовах, рекомендую к прочтению статью, где все отлично описано и показано.
Выбор контекста для общих модулей
Выше мы рассмотрели использование директив компиляции в модулях форм, но помимо модулей форм существуют и другие виды модулей:
- Модуль управляемого приложения
- Модуль обычного приложения
- Модуль сеанса
- Модуль внешнего соединения
- Общие модули
- Модули команд
- Модули менеджера
- Модуль объекта
В рамках данной статьи не будем разбирать, какие функции возложены на каждый из модулей. Нас интересует только общий модуль, так как именно для него имеется возможность указать, в каком контексте будет скомпилирован его экземпляр.
Общие модули существуют отдельно, как объекты конфигурации и предназначены для процедур и функций, объединенных по сходным функциональным назначениям.
Для них определен следующий набор свойств: Клиент (Управляемое приложение), Клиент (Обычное приложение) Сервер, Внешнее соединение, Вызов сервера, Привилегированный, Глобальный.
Если установить флаг Клиент (Управляемое приложение), то все процедуры и функции будут выполняться в контекстах "тонкого клиента", веб-клиента и "толстого клиента" в режиме управляемого приложения, при этом явно указывать директиву компиляции &НаКлиенте не требуется.
Установка флага Клиент (Обычное приложение) означает использование кода в "толстом клиенте" в режиме обычного приложения.
Установка флага Сервер позволяет выполнять код в контексте сервера и указание директивы &НаС
ервере также не требуется.Не рекомендуется создавать клент-серверные общие модули из соображений повышения модульности прикладного решения и снижения риска возникновения ошибок в таких модулях.
Свойство Внешнее соединение используется для выполнения процедур и функций при подключении внешним источником, например COM.
Следующим важным свойством является Вызов сервера. Оно доступно только в модулях, с установленным признаком Сервер и позволяет на клиенте вызывать экспортные процедуры и функции этого серверного модуля.
Свойство Вызов сервера следует устанавливать только, если действительно есть необходимость вызова из клиентского кода. Установка данного свойства не безопасна, так как клиентское приложение в режиме "тонкого клиента" и веб-клиента обращается к серверу по средствам открытого протокола http и злоумышленник может получить доступ к пользовательским данным путем обращения к серверу с помощью сторонних программ.
Выполнение в Привилегированном режиме (при установке свойства Привилегированный) означает, что разрешены любые операции и проверка доступа на уровне записей, а также то, что контроль прав производится не будут.
Следует также уделять особое внимание серверным процедурам и функциям, которые используют привилегированный режим.
Оптимизация клиент-серверного взаимодействия в управляемых формах
Разобравшись с терминами и определениями перейдем теперь к вопросам оптимизации.
Почему главный упор сделан именно на модули форм? Потому что именно они могут существовать в четырех экземплярах и в процессе работы, управление между экземплярами может передаваться. Стоит сразу оговориться, что несколько экземпляров могут иметь модули команд и общие модули, однако они не могут иметь контекстных экземпляров, как формы.
Ранее мы разбирали, что такое контекстный вызов формы и каким образом он влияет на производительность системы. Учитывая тот факт, что интерфейс 1С в режиме управляемого приложения ориентирован на возможность работы через интернет и по низкоскоростным каналам, можно определить некоторые рекомендации по оптимизации:
- Стараться уменьшать число серверных вызовов. По-хорошему, открытие формы, да и в целом, каждое действие пользователя должно происходить за один серверный вызов, однако обязательным данное требование не является.
- Необходимо пытаться уменьшать объем передаваемых данных между клиентом и сервером , например используя бесконтекстные вызовы.
- По возможности реализовывать алгоритмы с минимальным включением кода на клиенте, но и не забывать при этом уменьшать количество обращений на сервер.
В рамках статьи приведем несколько примеров оптимизации.
1) Объединение нескольких вызовов сервера в один.
Имеется задача, в которой нам требуется вывести артикул, единицу измерения и цену в строке при выборе товара.
Сразу определимся, что на клиенте данные по ссылке мы получить не сможем и нам придется "сходить" за ними на сервер.
Итак, рассмотрим несколько вариантов решения:
Первый: Создадим общий модуль "РаботаСТЧ" и установим у него галочки Сервер и Вызов сервера. В него добавим экспортную функцию, возвращающую данные по передаваемой в нее ссылке.
Функция ПолучитьДанные(Ссылка, ИмяРеквизита) Экспорт
Возврат Ссылка[ИмяРеквизита];
КонецФункции
В модуле формы, в обработчике события ПриИзменении() для поля Номенклатура добавим код, в котором и будем вызывать экспортную процедуру из общего модуля.
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ДанныеТекСтроки = Элементы.Товары.ТекущиеДанные;
Номенклатура = ДанныеТекСтроки.Номенклатура;
ДанныеТекСтроки.Артикул = РаботаСТЧ.ПолучитьДанные(Номенклатура,"Артикул");
ДанныеТекСтроки.ЕдиницаИзмерения = РаботаСТЧ.ПолучитьДанные(Номенклатура,"ЕдиницаИзмерения");
ДанныеТекСтроки.Цена = РаботаСТЧ.ПолучитьДанные(Номенклатура,"Цена");
КонецПроцедуры
Второй: В процедуре ПриИзменении() сделаем теперь вызов функции, которая вернет структуру со всеми нужными реквизитами.
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ДанныеТекСтроки = Элементы.Товары.ТекущиеДанные;
РеквизитыТовара = РаботаСТЧ.ПолучитьДанные(ДанныеТекСтроки.Номенклатура);
ДанныеТекСтроки.Артикул = РеквизитыТовара.Артикул;
ДанныеТекСтроки.ЕдиницаИзмерения = РеквизитыТовара.ЕдиницаИзмерения;
ДанныеТекСтроки.Цена = РеквизитыТовара.Цена;
КонецПроцедуры
В экспортную функцию так же внесем поправки.
Функция ПолучитьДанные(Ссылка) Экспорт
ДанныеРеквизитов = Новый Структура;
ДанныеРеквизитов.Вставить("Артикул",Ссылка.Артикул);
ДанныеРеквизитов.Вставить("ЕдиницаИзмерения",Ссылка.ЕдиницаИзмерения);
ДанныеРеквизитов.Вставить("Цена",Ссылка.Цена);
Возврат ДанныеРеквизитов;
КонецФункции
При анализе работы обоих вариантов видно, что более производительным является второй, так как вызов сервера происходит всего один раз, вместо трех.
Стоит так же отметить, что в экспортной функции мы получали реквизиты по ссылке. Данная возможность является удобной, но не всегда эффективной, так как происходит загрузка всего объекта в память и при большом количестве реквизитов это может сказаться на производительности. Поэтому, рекомендуется вместо обращения по ссылке использовать запросы.
2) Использование внеконтекстных процедур или функций.
Предположим, что у нас есть периодический регистр с ценами. При выборе номенклатуры в табличной части документа необходимо, чтобы цена автоматически проставлялась из этого регистра, на дату документа.
Рассмотрим примеры:
Первый: Так как нам необходим доступ к базе, то получать данные мы будем с сервера, а значит можно сразу, все что нужно, сделать на сервере. В модуле формы, в обработчике события ПриИзменении() обратимся к серверной процедуре в этом же модуле.
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ЗаполнитьЦенуНаСервере()
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьЦенуНаСервере()
ТекущаяСтрока = Элементы.Товары.ТекущаяСтрока;
ДанныеТекСтроки = Объект.Товары.НайтиПоИдентификатору(ТекущаяСтрока);
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", ДанныеТекСтроки.Номенклатура);
ТекЦена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(Объект.Дата, Отбор);
ДанныеТекСтроки.Цена = ТекЦена.Цена;
КонецПроцедуры
Обратите внимание на то, что на сервере имеется доступ к элементам формы Элементы.Товары.ТекущаяСтрока. Благодаря использованию директивы &НаСервере в процедуру передается весь контекст формы и мы можем обратиться к элементам формы.
Второй: В данном варианте мы изменим процедуру ПриИзменении(). Теперь будем подставлять цену не на сервере, а на клиенте. Функцию получения цены выполним, используя директиву &НаСервереБезКонтекста. Таким образом, на сервер будут переданы всего два значения, а не весь контекст формы.
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ДанныеТекСтроки = Элементы.Товары.ТекущиеДанные;
ДанныеТекСтроки.Цена = ЗаполнитьЦенуНаСервере(ДанныеТекСтроки.Номенклатура, Объект.Дата)
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьЦенуНаСервере(Номенклатура, ДатаДокумента)
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Номенклатура);
ТекЦена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ДатаДокумента, Отбор);
Возврат ТекЦена.Цена;
КонецФункции
Во втором варианте видно, что уменьшился объем передаваемых данных и сократилось время выполнения процедур.
Вместо передачи двух параметров в функцию, можно было упаковать их в структуру и передать в функцию, однако такая оптимизация может оказаться излишней и в итоге мы можем получить увеличение объема передаваемых данных.
Заключение
Не стоит бездумно гнаться за оптимизацией и слепо следовать рекомендациям, ведь в такой погоне программный код может стать нечитаемым, что существенно усложнит поддержку данного кода. Необходимо стремится к поиску золотой середины между оптимизацией и хорошо читаемым структурированным кодом. Помимо всего прочего, оптимизация модулей форм не является наиглавнейшей задачей для улучшения производительности системы, "узкие участки" могут скрываться и в других местах, к примеру, это могут быть неоптимально написанные запросы.
Для более подробного изучения вопросов оптимизации рекомендую к прочтению книгу "Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8".
Спасибо за внимание, надеюсь данный материал оказался для Вас полезным!
Специальные предложения
См. также
Таблица значений. Нюансы 216
01.10.2019 13487 Yashazz 36
Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.12.х и УТ 11.4.11.х! Промо
Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!
29700 руб.
[Шпаргалка] Программное создание элементов формы 338
06.09.2019 16751 rpgshnik 43
Агрегатные функции СКД, о которых мало кто знает 387
05.09.2019 19862 ids79 45
С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо
Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.
Отслеживание выполнения фонового задания 153
17.08.2019 15698 ids79 16
Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 285
08.08.2019 24717 ids79 34
Программы для исполнения 54-ФЗ Промо
С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.
Фоновое выполнение кода в 1С - это просто 148
02.08.2019 15694 avalakh 21
СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 151
26.07.2019 21287 ids79 8
Новый раздел на Инфостарте - Electronic Software Distribution Промо
Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.
- Низкие цены, без скрытых платежей и наценок
- Оперативная отгрузка
- Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
- Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)
Обработчики событий при записи объектов. Зачем и что за чем? 247
25.07.2019 19022 4 AlbinaAAA 24
Управление качеством кода 144
22.07.2019 10501 Stepa86 33
1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо
Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.
6500 рублей
СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 160
17.07.2019 16443 ids79 27
Регистры сведений. За кулисами 133
09.07.2019 12914 YPermitin 12
Онлайн-курс «Практические аспекты внедрения регламентированного учета и расчета себестоимости в 1С:ERP на крупных промышленных предприятиях» с 17 февраля по 13 марта 2020 года. Промо
Курс рассчитан для подготовки экспертов по регламентированному учету и учету затрат для внедрения на крупных промышленных предприятиях с «исторически сложившимся» учетом
9000 рублей
"Меньше копипаста!", или как Вася универсальную процедуру писал 184
04.07.2019 11228 SeiOkami 49
Создание отчетов с помощью СКД - основные понятия и элементы 225
25.06.2019 27746 ids79 17
Подборка решений для взаимодействия со ФГИС «Меркурий» Промо
С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.
Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 180
11.06.2019 15342 dmurk 144
Регистры накопления. Структура хранения в базе данных 180
16.05.2019 24205 YPermitin 27
Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.11.х Промо
Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.
29700 руб.
Выполнение внешней обработки в фоновом задании 151
11.05.2019 15407 Eret1k 23
Выгрузка документа по условию 5
25.04.2019 8615 m-rv 2
Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.130.х, КА 2.4.11.х и ERP 2.4.11.х! Промо
Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.
29700 руб.
Как прикрутить ГУИД к регистру сведений 23
16.04.2019 11511 m-rv 16
О расширениях замолвите слово... 199
07.04.2019 20877 ellavs 125
Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.130.х! Промо
Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.
24700 руб.
Git-репозитории для 1С-кода (опыт использования при небольших проектах) 205
28.03.2019 17000 ellavs 83
Трюки с внешними источниками данных 169
14.03.2019 18494 YPermitin 53
Подборка программ для взаимодействия с ЕГАИС Промо
ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.
Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 178
03.02.2019 21841 ids79 9
Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария 236
09.01.2019 32091 Vladimir Litvinenko 69
Базовый курс для начинающих 1С-программистов. Пятый поток. Онлайн-курс с 12 февраля по 15 апреля 2020 г. Промо
Данный онлайн-курс является начальной ступенью по изучению базовых принципов программирования в системе “1С:Предприятие” и предназначен для обучения 1С-программированию “с нуля”.
4500/9500 рублей
EnterpriseData – часть 2. Процесс выгрузки данных 130
26.12.2018 16816 ids79 27
Новый подход к обмену данными EnterpriseData 216
14.12.2018 27051 ids79 72