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


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

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

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

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

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

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

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

10 Comments

  1. botokash

    Стал переводить разработку на 8.3.3 со всеми прелестями пересмотра кода на клиент-серверный вариант, и даже как-то втянулся) Все таки есть что-то в этом, писать код считая сколько ты можешь потерять каждый раз вызывая сервер, и соответственно оптимизировать алгоритмы и структуру программы.

    Reply
  2. mikhailovaew

    Жаль, что мало в информации в самой статье. Лучше бы примеры из приложенной обработки (код) перетянуть в саму статью, и расписать подробно, почему это делается так, а это — по-другому.

    Reply
  3. Fragster

    (2) mikhailovaew, там всей обработки 97 строк, включая пустые

    Reply
  4. Fragster

    А кто-нибудь знает, как избавиться от процедуры «УходимНаСервер» при «автоматическом» выборе места выполнения?

    Reply
  5. AlexO
    пример, который показывает, как выполнить одну и ту же функцию на клиенте или на сервере

    Ага, особенно и там и там можно выполнить самые ресурсоемкие операции — запросы к базе.

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

    В толстом вообще нельзя «физически» разделить, где что исполняется. А если файловая база — так и вообще вся база тянется клиенту на комп.

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

    было бы описание объектов «там и там» и разбор в статье — было бы что обсуждать. А так — получается, кто что увидит, или хочет увидеть — то и увидит.

    Те присловутые «запросы в цикле», если их «условно невозможно» было перенести в один запрос — то ускорялись на пару ~0,1 секунды на итерацию, если перенести место выполнения целиком на сервер.

    это проблема УФ, а не клиент-серверной архитектуры, которой, считаю, у 1С нет, не было, и уже не будет.

    «Ускорение» в 0,1 сек — это те же потери на «переговоры» 1с-клиента и 1с-сервера («…Ведь каждый переход на сервер — это дополнительные расходы, для версии 8.2 это примерно от 0,02 секунды для вызова без контекста и от 0,08, причем сильно зависит от размера того самого контекста.»)

    А не «перенос» функционала с клиента на сервер и обратно. Т.к. в одном случае запрос начинается на «клиенте» (типа клиент, потому и в скобках), и непосредственно выполняется на сервере, а во втором — непосредственно начинается на сервере, и выполняется на сервере. И где тут «разделение на клиента и сервер»?

    Reply
  6. Fragster
    Reply
  7. AlexO

    (6)

    что место выполнения кода прекрасно контролируется директивами &НаСервере и т.п.

    Нет, вы мне покажите, как выполнить код НаКлиенте, если в 1С заложено — только НаСервере. И наоборот.

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

    Так как роли они практически никакой не играют.

    Какие объекты доступны в каком режиме — прекрасно описано

    Ну так а ваша заслуга, как программиста, какая в этом процессе «разделения»?

    Reply
  8. Fragster

    (7) AlexO, в платформе заложено, что какие-либо методы доступны: в толстом клиенте, в тонком клиенте или на сервере (условно). Если выбор есть — выбирайте, что вам больше нравится (например арифметические операции для тонкого клиента). Если выбора нет (тонкий клиент и нужно получить данные из базы) — контролируйте количество (серверные вызовы в цикле против цикла в одном серверном вызове) и моменты переходов (переход на сервере, например, в обработке ожидания (при необходимости с использованием фонового задания) при необходимости получения данных например в момент прокрутки списка).

    Reply
  9. AlexO

    (8)

    Если выбор есть — выбирайте

    Выбора нет в практически во всех случаях, а выбор «сложить на клиенте или на сервере» — надеюсь, понятно, что это вообще не тема.

    И уж тем более — не для клиент-сервера. Это который настоящий.

    контролируйте количество (серверные вызовы в цикле против цикла в одном серверном вызове)

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

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

    Прокрутка списка или визуализация чего-либо — слабое место 1С от начала, без привязки к УФ или ОФ. И думать об этом приходится хоть в клиенте, хоть файловой базе.

    Reply
  10. kiruha

    Этот инструмент не несет ничего гибкого.

    Никакого практического ускорения я не замечал на проектах.

    Кучу ненужного кода замечаю очень хорошо.

    Автор статьи неявно предполагает «тупизну» 1С ников, пишущих запросы в цикле и тупизну разработчиков платформы, не в состоянии оптимизировать автоматически клиент серверные вызовы и использования кэша.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *