Почему серверный вызов 1С занимает много времени и как это исправить?

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

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

Понимаем природу контекстных вызовов

Когда вы вызываете процедуру &НаСервере без указания &НаСервереБезКонтекста, платформа 1С выполняет механизм синхронизации контекста формы. Это значит, что для обеспечения работы серверного кода платформа берет все текущие реквизиты формы, сериализует их и отправляет с клиента на сервер. После завершения серверной процедуры обновленное состояние формы отправляется обратно.

Если на форме накоплены «тяжелые» данные (большие таблицы значений, коллекции, деревья или сложные структуры), этот процесс сериализации и передачи по сети становится «узким местом». Даже если серверный код выполняется мгновенно, общее время отклика складывается из времени «путешествия» данных туда и обратно.

Как выявить проблему

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

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

Решение проблемы: использование временного хранилища

Наиболее эффективным способом исключить «тяжелые» данные из контекстного вызова является использование ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища. Суть метода заключается в том, что вместо передачи огромного объема данных мы передаем лишь строку-адрес, которая ссылается на данные во временном хранилище сервера.

Разберем процесс по шагам:

  1. Вместо хранения кэша в реквизите формы, который постоянно передается, создайте реквизит формы строкового типа (например, АдресВХранилище).
  2. Перед вызовом серверной процедуры, если данные изменились, сохраните их во временном хранилище.
  3. В серверном коде получите данные по адресу, выполните расчеты и, если нужно, обновите хранилище.

Рассмотрим пример реализации работы с таким кэшем:


// Пример сохранения данных во временное хранилище
ДанныеДляКэша = ПолучитьДанные(); // Наша тяжелая структура или соответствие
АдресВХранилище = ПоместитьВоВременноеХранилище(ДанныеДляКэша, УникальныйИдентификатор);

// В серверной процедуре:
&НаСервере
Процедура СформироватьДокументНаСервере(АдресВХранилище)
    Кеш = ПолучитьИзВременногоХранилища(АдресВХранилище);
    // ... работаем с данными ...
    // Если данные изменились, сохраняем их обратно:
    АдресВХранилище = ПоместитьВоВременноеХранилище(Кеш, УникальныйИдентификатор);
КонецПроцедуры

Дополнительные рекомендации по оптимизации

Помимо временного хранилища, проанализируем другие аспекты архитектуры формы:

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

← На главную