Загадка природы. Разминка для ума. Видео-ответ.

Предлагаю обсудить интересное поведение платформы.

В модуле формы  разместите серверный метод. Положим в нем будет одна строка “Тест = 100”.

Вызовите этот метод (например, из процедуры обработчика команды формы).

Теперь откроем приложение в пользовательском режиме. Обеспечим исполнение программного кода. Сколько вызовов сервера получилось (в окне показатели производительности)? Разумеется один, разве бывает иначе!?

Бывает!

Давайте в серверный метод добавим строку “Сообщить(Тест);”. Сколько сейчас получилось вызовов сервера?

А если добавить еще одно сообщение?

В комментариях можно написать гипотезы такого поведения платформы :)

ps. Мы сейчас на семинаре и практически нет возможности отвечать на почту и комментарии..

update. Также можно сообщить разместить в Обработке проведения. Тогда должно быть 3 серверных вызова.

Наш видео-ответ доступен по ссылке.

комментариев 40 на “Загадка природы. Разминка для ума. Видео-ответ.”

  1. При открытии внешней обработки или отчета, без каких либо процедур, в случае отчета – 3 вызова, обработки – 2 вызова. Если они в составе конфигурации, то в обоих случаях 1 вызов. Почему так?

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

      • В клиент-серверном тоже самое. СУБД db2

      • Илья Чернов 08.10.2010 в 14:57

        По тех. журналу и по моим заключениям, в случае с обработкой
        1 вызов – это установка “контакта” обработке с сервером, через некие параметры.
        2 вызов – это получение настроек формы и окна.
        С отчетом:
        1 вызов – так же установка контакта.
        2 вывоз -получение настроек пользователя, окна, варианта отчета, пользовательские настройки варианта отчета.
        3 вызов – по моим предположениям, как раз для получения всяких ссылочных данных которые могли бы быть на форме. В пустом отчете ничего не возвращается (как в нашем случае, но запрос есть), в нормальном отчете было лень проверять, но думаю вернет как раз ссылки с нашей последней и/или сохраненной настройке.

        • Отлично, Илья.
          2 вызов в целом это и есть создание формы.
          3-ий вызов для отчета также может быть связан со схемой компоновки, получение настроек компоновки данных…

  2. Сергей 04.10.2010 в 17:02

    Без сообщить при проведении получается 2 вызова. Соответсвенно с сообщить – 3.
    Причем 3 вызова будет независимо от того где разместить Сообщить (При/перед записью, обработка проведения…)

    • Сергей 04.10.2010 в 17:04

      Вопрос только в том почему при проведении/записи 2 вызова…

    • Завтра вернусь с семинара и расскажу :)

      • Сергей 04.10.2010 в 18:57

        Судя по всему, все дело в транзакции…

  3. Версия 1С:Предприятие 8.2 (8.2.11.236)
    Файловая база.
    Вызов всего один.

    • НЕ ТАМ СМОТРЕЛ!

      В “Замер производительности”  – 1 раз
      В “Показатель производительности” – 2 раза

  4. Сергей 03.10.2010 в 16:41

    Без сообщиь – 1 вызов, если добавлять сообщить – 2 вызова (не зависимо от количества).  Наблюдается как в файловом, так и клиент-сверверном вариантах работы, что не удивительно, поскольку для файлового используется эмуляция сервера.
    Как я думаю, такое поведение происходит по той причине, что при выполнении на сервере нет возможности передать клиенту сообщение (поскольку из серверных процедур нельзя вызывать клиентские). Потому все сообщения накаливаются и их отображане происходит уже после возврата на клиент. И судя по поведению список сообщений запрашивается отдельным запросом.

  5. Илья Чернов 03.10.2010 в 15:50

    Теория такая:
    Первое обращение, выполняет код на сервере. При этом устанавливаются куки, в которые он пишет, что надо бы обновить такое то окно (в нашем случае окно сообщений) так как после исполнения кода появились сообщения.
    По второму запросу, если куки не пустые (по идентификатору окна видимо ищет) запрашивает с сервера те сообщения которые есть для этого окна (окна сообщений)

    • Верно, Илья.
      Добавил еще одно условие.

      • Илья Чернов 04.10.2010 в 18:01

        Посмотрел что происходит, на самом деле если есть “сообщить()” в коде, то делается все так же как я и описывал, то есть два вызова с куками =), а вот третий вызов, это обновление динамического списка – списка документов, который висит на заднем фоне. если его закрыть (выбрав другой документ, или справочник), то будет так же два вызова!
         

  6. При использовании Сообщить(тест)  в серверном модуле два вызыва. И если просто оставить окно приложения открытым на длительное время, то количество серверных вызывов постепенно увеличивается (видимо обновление формы происходит). Может интерактивные действия на сервере выводятся на клиент отдельно?

  7. Александр Горлов 03.10.2010 в 13:55

    Предположим, что нужно смотреть в окне “Показатели производительности” в Предприятии. Тогда замечено следующее:
    1. Без вывода сообщения – количество вызовов сервера = 1.

    2. С выводом 1 сообщения – количество вызовов сервера = 2.
    3. С выводом более 1 сообщения – количество вызовов сервера = 2. При этом также отмечен интересный факт: в окне “Замер произодительности” в отладке в Конфигураторе первый вызов Сообщить() происходит существенно (в 2,5-4 раза) дольше остальных. При этом не имеет значения, открыто ли перед выполнением кода окно сообщений или нет!

    • По поводу долгой отработки первого вызова Сообщить() интересная статистика.
      А в клиент-серверном варианте?

  8. Александр Горлов 03.10.2010 в 13:49

    Судя по комментариям в ветке – возникло непонимание того, что же вообще должно произойти при воспроизведении предложенного Евгением примера. Прошу пояснений по таким вопросам:
    1. Где нужно смотреть количество вызовов сервера – в окне “Показатели производительности” в режиме Предприятие или “Замер производительности” в отладке в режиме Конфигуратор?
    2. Где смотреть требуемый показатель? Если это все-таки окно в Предприятии – там все ясно, сразу дается нужное число. А в окне “Замер производительности”? Часть строк кода должны выполняться более 1 раза?

    • В показателях производительности.
      Код дважды не исполняется. Но часть кода исполняется на клиенте, часть на сервере.
      Могут происходить неявные серверные вызовы. Что мы и наблюдаем.

  9. Если не выводить сообщение – количество вызовов 1. Если выводить сообщение, то независимо от количество сообщений количество вызовов – 2.
    1С – 8.2.12.87

  10. Александр Горлов 02.10.2010 в 23:03

    Может быть, я что-то неправильно делаю, но у меня в окне “Замер производительности” (это ведь имелось в виду под “показатели производительности”?) вызов серверного метода всего 1 раз. И вообще вызов каждой строки кода – по 1 разу. Даже если добавить несколько вызовов Сообщить()…
    В чем же был вопрос задачи? На всякий случай – платформа 8.2.11.236

    • Интересно.
      Вариант работы файловый? Под рукой только релиз 8.2.12 на 11 проверить не могу..
      Будем изучать явление на разных релизах )

      • 8.2.12.75 Проблема воспроизводится

      • Александр Горлов 03.10.2010 в 00:39

        Да, вариант работы – файловый.

      • progr-2008 03.10.2010 в 10:17

        Файловый, 1С:Предприятие 8.2 (8.2.11.236) – проблема воспроизводится.

    • Нужно смотреть не замер производительности, а показатели производительности в пользовательском режиме в левом нижнем углу экрана. 

  11. progr-2008 02.10.2010 в 22:01

    Вызов окна сообщений на клиенте и возврат на сервер для завершения процедуры?

  12. progr-2008 02.10.2010 в 21:58

    Удвоение вызовов вызывает именно Сообщить.

  13. Кудрявцев Олег 02.10.2010 в 21:42

    Есть такое предположение, что дело в следующем:
    Команда Сообщить(Тест) выводит текст сообщения в окно сообщений. Если в момент вызова окно сообщений отсутствует, то будет открыто новое окно сообщений.
    Если же окно сообщений уже открыто, то новый вызов сервера уже не нужен.

  14. progr-2008 02.10.2010 в 21:41

    У меня количество вызовов стало равным двум от каждого нажатия кнопки.
    По отладке в серверный вызов попадаю один раз.

  15. Эмм..  у меня все равно один вызов сервера

    • Релиз и вариант работы платформы?

      • Релиз 8.2.11.235, файловый

      • Сейчас на релизе 8.2.12.78 тот же самый код запустила. Вызов сервера также только 1 раз происходит :)
        Можт я что-то не так делаю))…

        • Ситуация интересная, приложите скрин-шот сюда..

          • Все, теперь понятно!)) 
            А я в замере производительности смотрела…
            В показателях производительности, действительно, сервер вызывается 2 раза, если выводятся сообщения.
            От релиза не зависит :)