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