Как определить, вызывает ли стандартный метод платформы 1С обращение к серверу при вызове с клиента?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке управляемых приложений на платформе 1С:Предприятие 8.3 мы, как разработчики, часто сталкиваемся с вопросом оптимизации производительности. Один из ключевых аспектов такой оптимизации — минимизация количества и объема серверных вызовов, особенно тех, которые могут быть неявными или скрытыми. Мы рассмотрим, как узнать, вызывает ли стандартный метод платформы обращение к серверу при вызове с клиента, и как эффективно управлять этим взаимодействием для повышения общей производительности системы.

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

Определение серверных вызовов: Инструмент "Замер производительности"

Для того чтобы достоверно выяснить, какие именно операции в нашем коде, включая вызовы стандартных методов платформы, приводят к обращениям на сервер, мы будем использовать мощный встроенный инструмент конфигуратора — Замер производительности.

  1. Открытие Замера производительности: Запустите 1С:Предприятие в режиме отладки из конфигуратора. В конфигураторе перейдите в меню "Отладка" и выберите пункт "Замер производительности". Откроется окно замера.
  2. Начало замера: В окне "Замер производительности" нажмите кнопку "Начать замер".
  3. Выполнение действий: Переключитесь в режим 1С:Предприятие и выполните те действия, которые нас интересуют. Например, вызовите нужный стандартный метод или выполните интерактивное действие пользователя, которое потенциально может вызвать такой метод.
  4. Завершение замера и анализ результатов: После выполнения необходимых действий вернитесь в конфигуратор и нажмите кнопку "Закончить замер". В окне "Замер производительности" появится таблица с результатами.
  5. Фильтрация и проверка колонки "Обр. сервером": В таблице результатов замера нас интересует колонка "Обр. сервером". Эта колонка содержит пиктограммы, которые явно указывают на наличие серверных вызовов для соответствующей строки кода или операции. Вы можете отфильтровать результаты по клиенту, чтобы сосредоточиться на вызовах, инициированных клиентским кодом. Если рядом с нашей строкой кода или вызовом стандартного метода присутствует пиктограмма в колонке "Обр. сервером", это означает, что произошло обращение к серверу. Этот инструмент позволяет нам точно идентифицировать даже неявные серверные вызовы, включая те, что возникают при работе стандартных методов платформы.

Мы видим, что Замер производительности является наиболее точным и прямым способом отслеживания серверных вызовов. Этот метод дает нам конкретные данные по каждой строке кода, что неоценимо при оптимизации.

Неявные серверные вызовы и механизмы кэширования: Почему все сложнее, чем кажется?

Мы выяснили, как отслеживать серверные вызовы, но давайте глубже разберемся, почему они возникают и как платформа управляет взаимодействием клиента и сервера. На самом деле, ситуация с серверными вызовами сложнее, чем простое разделение кода на клиентский и серверный.

Даже при работе исключительно на клиенте могут происходить обращения к серверу. Платформа 1С использует многоуровневое кэширование для ускорения работы и минимизации сетевого трафика. Это означает, что данные и результаты некоторых операций могут быть кэшированы как на клиентской, так и на серверной стороне. Например, первый вызов какого-либо значения или метода, требующего серверных данных, может привести к обращению на сервер, но последующие вызовы могут использовать кэшированные данные. Однако, если кэш "протух" или данные изменились на сервере, следующий вызов, даже того же метода, может инициировать новое обращение к серверу для получения актуальной информации.

Типовые сценарии неявных серверных вызовов:

  1. Первое обращение к данным: Если для определения типа значения методом ТипЗнч() требуется получить информацию об объекте, хранящемся в базе данных (например, для ссылки на объект), то платформа может выполнить серверный вызов. При этом, если тип значения может быть определен локально на клиенте (например, для переменной типа "Строка" или "Число"), то серверный вызов не потребуется.
  2. Компиляция общих модулей: При первом обращении к клиентскому общему модулю, если он еще не был скомпилирован, платформа может выполнить неявный серверный вызов для его компиляции.
  3. Интерактивные действия пользователя: Некоторые действия пользователя (например, открытие форм, изменение определенных реквизитов) могут неявно вызывать серверный код, на который разработчик не может напрямую повлиять. Однако мы можем повлиять на вызовы, которые происходят при выполнении программного кода.

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

Цель оптимизации и почему это важно

Основными задачами, которые мы ставим перед собой при оптимизации клиент-серверного взаимодействия, являются:

  1. Уменьшение числа серверных вызовов: Каждый вызов на сервер, независимо от объема передаваемых данных, является затратной операцией. При низкой скорости соединения он может занимать до 1.5 секунд. Чем меньше мы обращаемся к серверу, тем быстрее работает наше приложение.
  2. Уменьшение объема передаваемых данных (трафика): Минимизация данных, передаваемых между клиентом и сервером, снижает нагрузку на сеть и ускоряет отклик системы.

Регулярный контроль этих показателей с помощью замера производительности позволяет нам создавать более отзывчивые и эффективные приложения.

Стратегии оптимизации клиент-серверного взаимодействия

Теперь, когда мы понимаем механизмы и цели, давайте разберем конкретные стратегии для оптимизации взаимодействия между клиентом и сервером в 1С:Предприятии.

1. Разделение кода и директивы компиляции

В управляемом приложении 1С мы можем явно указывать, где будет выполняться наш код — на сервере или на клиенте. Для этого используются директивы компиляции:

Давайте посмотрим на пример использования &НаСервереБезКонтекста:


// На клиенте
&НаКлиенте
Процедура ПриИзмененииРеквизита_НаКлиенте(Команда)
    ЗначениеРеквизита = Объект.РеквизитФормы;
    Результат = МодульСервераБезКонтекста.ВыполнитьСервернуюОперацию(ЗначениеРеквизита);
    // ... дальнейшая логика на клиенте
КонецПроцедуры

// В общем серверном модуле с признаком "Вызов сервера" и "Сервер"
&НаСервереБезКонтекста
Функция ВыполнитьСервернуюОперацию(Параметр)
    // Здесь мы работаем только с Параметром,
    // контекст формы не передается
    Возврат Параметр + 10;
КонецФункции

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

2. Контекстные и внеконтекстные вызовы

Когда мы вызываем процедуру или функцию, помеченную директивой &НаСервере из формы, происходит так называемая "упаковка" всего контекста формы. Это включает в себя значения всех реквизитов формы, элементы управления и их свойства. Весь этот объем данных отправляется на сервер, затем обрабатывается, и после выполнения серверной логики контекст формы возвращается обратно на клиент. Это может быть очень ресурсозатратно, особенно для сложных форм с большим количеством реквизитов.

В противовес этому, использование директивы &НаСервереБезКонтекста является более эффективным подходом. В этом случае на сервер передаются только те данные, которые мы явно указали в качестве параметров процедуры или функции. Это существенно уменьшает объем передаваемых данных и сокращает время выполнения серверных вызовов. Мы должны по возможности избегать контекстных вызовов, если нам не нужен доступ ко всему контексту формы на сервере.

3. Эффективное кэширование

Платформа 1С использует многоуровневое кэширование для оптимизации работы. Мы можем влиять на некоторые аспекты кэширования для улучшения производительности.

  1. Кэширование на клиенте: Ускоряет загрузку данных, так как клиент может обращаться к локальному кэшу вместо повторного запроса к серверу. Это особенно актуально для тонкого клиента и мобильного клиента. Настройки кэширования на клиенте могут быть выполнены в "Настройках клиента" или "Настройках работы с сетью".
  2. Кэширование на сервере: Повышает общую производительность системы, позволяя кэшировать результаты запросов, данные объектов и сеансы пользователей. Это снижает нагрузку на СУБД и ускоряет обработку повторных запросов.
  3. Сброс кэша: В некоторых случаях временные файлы кэша могут накапливаться и приводить к некорректному поведению системы. Мы можем вручную удалить папки с кэшем (обычно находятся в C:\Users\User\AppData\Local\1C и C:\Users\User\AppData\Roaming\1C) или использовать команду запуска тонкого клиента /ClearCache для автоматического сброса кэша.
  4. Методы с повторным использованием значений: Для функций, которые возвращают значения и могут быть вызваны повторно с одними и теми же входными параметрами, мы рекомендуем размещать их в общих серверных модулях с установленным свойством "Повторное использование возвращаемых значений". Платформа автоматически кэширует такие значения на клиенте после первого вызова, что позволяет избежать повторных серверных обращений при последующих вызовах с теми же параметрами.

4. Особенности метода ТипЗнч()

Как мы уже упоминали, метод ТипЗнч() доступен как на клиенте, так и на сервере. Это означает, что его вызов на клиенте не всегда приводит к серверному вызову. Если тип значения может быть определен локально на клиенте (например, для простых типов данных или объектов, которые уже полностью загружены в клиентский кэш), то серверное обращение не потребуется. Однако, если для определения типа требуется получить дополнительную информацию о ссылке на объект в базе данных, которая не кэширована на клиенте, то может потребоваться серверное взаимодействие. Используя Замер производительности, мы сможем точно узнать, когда именно ТипЗнч() "ходит" на сервер.

5. Работа с общими модулями

Общие модули в 1С:Предприятии могут быть скомпилированы для выполнения как на клиенте, так и на сервере, или иметь оба признака. При вызове процедуры или функции из общего модуля платформа сначала ищет ее на клиенте. Если она не найдена, поиск продолжается на сервере. Чтобы обеспечить четкое разделение логики и избежать неопределенности, мы рекомендуем:

Общие рекомендации для оптимизации

В заключение, мы хотим поделиться общими рекомендациями, которые помогут нам поддерживать высокую производительность наших управляемых приложений:

  1. Постоянный контроль: Всегда ведите разработку, постоянно контролируя количество серверных вызовов и объем трафика с помощью инструментов замера производительности.
  2. Минимизация вызовов на действие пользователя: Мы должны стремиться к тому, чтобы на каждое интерактивное действие пользователя в клиентском коде выполнялось минимальное количество или вовсе отсутствовали дополнительные вызовы на сервер.
  3. Передача только необходимого: Не передавайте с клиента на сервер больше данных, чем это абсолютно необходимо для выполнения конкретной задачи. Если нам нужно только одно значение реквизита, не следует делать контекстный вызов, используйте &НаСервереБезКонтекста с передачей этого значения в качестве параметра.
  4. Возвращение значений функциями: Избегайте передачи значений параметров по ссылке для их изменения на сервере и возврата на клиент. Вместо этого рекомендуется создавать функции, которые возвращают требуемые данные как результат выполнения. Это способствует более чистой и предсказуемой архитектуре кода.

Применяя эти подходы, мы сможем значительно улучшить производительность наших решений на платформе 1С:Предприятие, делая их более быстрыми, отзывчивыми и удобными для пользователей.

← На главную