Часто при разработке на управляемых формах 1С мы сталкиваемся с тем, что простой, казалось бы, серверный вызов начинает занимать критически много времени — 3, 4 и более секунд. В этой статье мы разберем, почему это происходит, как обнаружить причину и какие методы оптимизации помогут вернуть приложению высокую скорость отклика.
Когда вы вызываете процедуру &НаСервере без указания &НаСервереБезКонтекста, платформа 1С выполняет механизм синхронизации контекста формы. Это значит, что для обеспечения работы серверного кода платформа берет все текущие реквизиты формы, сериализует их и отправляет с клиента на сервер. После завершения серверной процедуры обновленное состояние формы отправляется обратно.
Если на форме накоплены «тяжелые» данные (большие таблицы значений, коллекции, деревья или сложные структуры), этот процесс сериализации и передачи по сети становится «узким местом». Даже если серверный код выполняется мгновенно, общее время отклика складывается из времени «путешествия» данных туда и обратно.
Первым делом проанализируем инструменты диагностики. Используйте Замер производительности в конфигураторе. Обратите внимание на разницу между общим временем вызова и временем выполнения самого серверного кода. Если общая задержка составляет несколько секунд, а серверная процедура занимает доли секунды — проблема именно в передаче контекста.
Также стоит проверить содержимое реквизитов формы. Если у вас в качестве реквизита формы используется объект типа Соответствие или ТаблицаЗначений, который постоянно наполняется данными (например, кэш для формирования табличного документа), именно он может быть виновником раздувания объема передаваемых данных.
Наиболее эффективным способом исключить «тяжелые» данные из контекстного вызова является использование ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища. Суть метода заключается в том, что вместо передачи огромного объема данных мы передаем лишь строку-адрес, которая ссылается на данные во временном хранилище сервера.
Разберем процесс по шагам:
АдресВХранилище).Рассмотрим пример реализации работы с таким кэшем:
// Пример сохранения данных во временное хранилище
ДанныеДляКэша = ПолучитьДанные(); // Наша тяжелая структура или соответствие
АдресВХранилище = ПоместитьВоВременноеХранилище(ДанныеДляКэша, УникальныйИдентификатор);
// В серверной процедуре:
&НаСервере
Процедура СформироватьДокументНаСервере(АдресВХранилище)
Кеш = ПолучитьИзВременногоХранилища(АдресВХранилище);
// ... работаем с данными ...
// Если данные изменились, сохраняем их обратно:
АдресВХранилище = ПоместитьВоВременноеХранилище(Кеш, УникальныйИдентификатор);
КонецПроцедуры
Помимо временного хранилища, проанализируем другие аспекты архитектуры формы:
Ссылка или УникальныйИдентификатор), а не всю форму в сборе.Помните, что каждый случай уникален, и в разработке 1С важно всегда держать баланс между удобством архитектуры формы и производительностью системы. Применяя описанные подходы, вы сможете добиться значительного ускорения формы даже с самой сложной структурой данных.