gifts2017

Немного об управлении местом выполнения кода в управляемых формах

Опубликовал Антонио (Fragster) в раздел Администрирование - Оптимизация БД (HighLoad)

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

Лично мне - сначала было неудобно. Но когда немного покрутил-повертел, понял, что этот инструмент, на самом деле, весьма гибкий, и позволяет планировать моменты перехода на сервер более прозрачно, чтоли. Ведь каждый переход на сервер - это дополнительные расходы, для версии 8.2 это примерно от 0,02 секунды для вызова без контекста и от 0,08, причем сильно зависит от размера того самого контекста.

Это как бы заставляет писать более "модульные" и менее зависимые функции

Во вложении - пример, который показывает, как выполнить одну и ту же функцию на клиенте или на сервере. также можно замерить оверхэд на вызов сервера с контекстом или без него. А также демонстрируется подход, который я использовал в многопоточном тесте производительности - когда в тонком клиенте код, который не может выполняться в тонком клиенте - выполняется на сервере, а в толстом - когда доступна модификация данных и куча всяких интересных объектов - этот же код выполняется на клиенте.

Отследить момент перехода на сервер (кстати, верно и для управляемого и для обычного приложения, которое может начать "тупить" при переходе с фалойого варианта на клиент-серверный - одна из (не основных, но все-же) причин ухудшения производительности) можно в замере производительности 1с - это последняя колонка, т.е. если в строке нарисован "клиент" и "стрелочка перехода" - это это и есть переход на сервер, если таких вызовов много - то суммарно может накопиться достаточно ощутимое время задержек. Те присловутые "запросы в цикле", если их "условно невозможно" было перенести в один запрос - то ускорялись на пару ~0,1 секунды на итерацию, если перенести место выполнения целиком на сервер.

Кстати, если внимательно посомтреть на замер производительности, то можно заметить, что строки, которые выполнялись и на клиенте и на сервере - присутствуют в замере дважды :)

Статья не расчитана на "гуру" управляемых форм, так что сильно не пинайте, если для вас ничего нового не нашлось.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ChooseExecutionPlace_002.epf
.epf 7,37Kb
20.08.13
26
.epf 7,37Kb 26 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владислав Кашин (botokash) 20.08.13 19:59
Стал переводить разработку на 8.3.3 со всеми прелестями пересмотра кода на клиент-серверный вариант, и даже как-то втянулся) Все таки есть что-то в этом, писать код считая сколько ты можешь потерять каждый раз вызывая сервер, и соответственно оптимизировать алгоритмы и структуру программы.
2. mikhailovaew (mikhailovaew) 28.08.13 09:48
Жаль, что мало в информации в самой статье. Лучше бы примеры из приложенной обработки (код) перетянуть в саму статью, и расписать подробно, почему это делается так, а это - по-другому.
3. Антонио (Fragster) 28.08.13 20:35
(2) mikhailovaew, там всей обработки 97 строк, включая пустые
4. Антонио (Fragster) 11.10.13 16:27
А кто-нибудь знает, как избавиться от процедуры "УходимНаСервер" при "автоматическом" выборе места выполнения?
5. Алекс Ю (AlexO) 17.06.14 15:47
пример, который показывает, как выполнить одну и ту же функцию на клиенте или на сервере

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

В толстом вообще нельзя "физически" разделить, где что исполняется. А если файловая база - так и вообще вся база тянется клиенту на комп.
Во вложении - пример, который показывает, как выполнить одну и ту же функцию на клиенте или на сервере. также можно замерить оверхэд на вызов сервера с контекстом или без него.
было бы описание объектов "там и там" и разбор в статье - было бы что обсуждать. А так - получается, кто что увидит, или хочет увидеть - то и увидит.
Те присловутые "запросы в цикле", если их "условно невозможно" было перенести в один запрос - то ускорялись на пару ~0,1 секунды на итерацию, если перенести место выполнения целиком на сервер.
это проблема УФ, а не клиент-серверной архитектуры, которой, считаю, у 1С нет, не было, и уже не будет.
"Ускорение" в 0,1 сек - это те же потери на "переговоры" 1с-клиента и 1с-сервера ("...Ведь каждый переход на сервер - это дополнительные расходы, для версии 8.2 это примерно от 0,02 секунды для вызова без контекста и от 0,08, причем сильно зависит от размера того самого контекста.")
А не "перенос" функционала с клиента на сервер и обратно. Т.к. в одном случае запрос начинается на "клиенте" (типа клиент, потому и в скобках), и непосредственно выполняется на сервере, а во втором - непосредственно начинается на сервере, и выполняется на сервере. И где тут "разделение на клиента и сервер"?
6. Антонио (Fragster) 17.06.14 19:17
(5) AlexO, ваш сарказм неуместен.

[IS-QUOTE]пример, который показывает, как выполнить одну и ту же функцию на клиенте или на сервере

Ага, особенно и там и там можно выполнить самые ресурсоемкие операции - запросы к базе.
[/IS-QUOTE]
В тонком клиенте нет запросов и вам это прекрасно известно. Но, например, в тонком нет веб-сервисов, а в толстом - есть.
[IS-QUOTE]а в толстом - когда доступна модификация данных и куча всяких интересных объектов - этот же код выполняется на клиенте.

В толстом вообще нельзя "физически" разделить, где что исполняется. А если файловая база - так и вообще вся база тянется клиенту на комп.
[/IS-QUOTE]
Если вы сделаете замер производительности, то увидите те самые стрелочки перехода на сервер, про которые я говорю.

Если вы запустите эту обработку в толстом клиенте и управляемом приложении и посмотрите на результаты при разном выборе места выполнения - увидите, что место выполнения кода прекрасно контролируется директивами &НаСервере и т.п.

В "неуправляемом" приложении также есть общие модули только с галкой "сервер" для контроля места выполнения (по умолчанию - это клиент, но стрелки перехода в замере и там дают представление о моментах прыжков с клиента на сервер).


[IS-QUOTE]Во вложении - пример, который показывает, как выполнить одну и ту же функцию на клиенте или на сервере. также можно замерить оверхэд на вызов сервера с контекстом или без него.

было бы описание объектов "там и там" и разбор в статье - было бы что обсуждать. А так - получается, кто что увидит, или хочет увидеть - то и увидит.[/IS-QUOTE]
Какие объекты доступны в каком режиме - прекрасно описано в синтакс-помощнике в блоке "доступность".

[IS-QUOTE]Те присловутые "запросы в цикле", если их "условно невозможно" было перенести в один запрос - то ускорялись на пару ~0,1 секунды на итерацию, если перенести место выполнения целиком на сервер.

это проблема УФ, а не клиент-серверной архитектуры, которой, считаю, у 1С нет, не было, и уже не будет.[/IS-QUOTE]
если вы посмотрите на замер "запроса в цикле" в толстом клиенте, то вы увидите проблему - именно что переход с клиента на сервер и обратнго

"Ускорение" в 0,1 сек - это те же потери на "переговоры" 1с-клиента и 1с-сервера ("...Ведь каждый переход на сервер - это дополнительные расходы, для версии 8.2 это примерно от 0,02 секунды для вызова без контекста и от 0,08, причем сильно зависит от размера того самого контекста.") А не "перенос" функционала с клиента на сервер и обратно. Т.к. в одном случае запрос начинается на "клиенте" (типа клиент, потому и в скобках), и непосредственно выполняется на сервере, а во втором - непосредственно начинается на сервере, и выполняется на сервере. И где тут "разделение на клиента и сервер"?

речь идет как раз про потери на диалог. а функционал часто может быть выполнен и на клиенте и на сервере, (например пересчет суммы при изменении количества/цены) но если разработчик не понимает этого, не "управляет" местом выполнения, то это может негативно сказаться на отзывчивости приложения. Например частая ошибка - это контекстные вызовы вместо неконтекстных, или вызов функции на сервере, когда она может выполниться и на клиенте и на сервере без перехода.



Может быть вы знаете, как в данном примере избавиться от функции "УходимНаСервер" для перехода на сервер в случае тонкого клиента при "автоматическом" выборе места выполнения?
7. Алекс Ю (AlexO) 18.06.14 09:49
(6) Fragster,
что место выполнения кода прекрасно контролируется директивами &НаСервере и т.п.

Нет, вы мне покажите, как выполнить код НаКлиенте, если в 1С заложено - только НаСервере. И наоборот.
А то, что описываете - это не разделение Клиент-Сервер, а разнесение выполнения инструкций внутри платформы. Что можно было сделать в "невидимом" режиме полностью автоматически, безо всяких "НаКлиенте" "НаСервере".
Так как роли они практически никакой не играют.
Какие объекты доступны в каком режиме - прекрасно описано

Ну так а ваша заслуга, как программиста, какая в этом процессе "разделения"?
8. Антонио (Fragster) 18.06.14 11:59
(7) AlexO, в платформе заложено, что какие-либо методы доступны: в толстом клиенте, в тонком клиенте или на сервере (условно). Если выбор есть - выбирайте, что вам больше нравится (например арифметические операции для тонкого клиента). Если выбора нет (тонкий клиент и нужно получить данные из базы) - контролируйте количество (серверные вызовы в цикле против цикла в одном серверном вызове) и моменты переходов (переход на сервере, например, в обработке ожидания (при необходимости с использованием фонового задания) при необходимости получения данных например в момент прокрутки списка).
9. Алекс Ю (AlexO) 20.06.14 15:51
(8) Fragster,
Если выбор есть - выбирайте

Выбора нет в практически во всех случаях, а выбор "сложить на клиенте или на сервере" - надеюсь, понятно, что это вообще не тема.
И уж тем более - не для клиент-сервера. Это который настоящий.
контролируйте количество (серверные вызовы в цикле против цикла в одном серверном вызове)

Как я могу тут что-либо контролировать, если это определяеться алгоритмом? Если мне надо цикл на форме - покой он мне нужен на сервере, если в итоге я получу на форме не результат каждой итерации, а конечный итог?
при необходимости получения данных например в момент прокрутки списка

Прокрутка списка или визуализация чего-либо - слабое место 1С от начала, без привязки к УФ или ОФ. И думать об этом приходится хоть в клиенте, хоть файловой базе.
10. kiruha Дронов (kiruha) 10.09.14 18:18
Этот инструмент не несет ничего гибкого.
Никакого практического ускорения я не замечал на проектах.
Кучу ненужного кода замечаю очень хорошо.
Автор статьи неявно предполагает "тупизну" 1С ников, пишущих запросы в цикле и тупизну разработчиков платформы, не в состоянии оптимизировать автоматически клиент серверные вызовы и использования кэша.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа