Почему процедуры 1С работают медленно после обновления и как устранить задержки при вызове сервера

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

Рассмотрим распространенную ситуацию: после обновления конфигурации (например, 1С:Розница с версии 2.1 до 2.2) пользователи замечают ощутимые задержки при выполнении привычных операций в режиме тонкого клиента — открытии рабочего места кассира (РМК), выборе формы оплаты или записи документов. При этом замер производительности показывает странную картину: суммарное время работы всех строк кода внутри процедуры составляет доли миллисекунды, а общее время выполнения серверного вызова достигает сотых или десятых долей секунды.

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

Причины расхождения времени в замере производительности и времени серверного вызова

Посмотрим на пример процедуры, выполняемой при открытии формы наличной оплаты в РМК:


&НаСервере
Функция ПолучитьМаксимальнуюСкидку()
    МаксСкидка = 0;
    Для каждого стрДок из Объект.Товары Цикл
        Если стрДок.ПроцентАвтоматическойСкидки > МаксСкидка Тогда
            МаксСкидка = Окр(стрДок.ПроцентАвтоматическойСкидки);    
        КонецЕсли;
    КонецЦикла;
    Возврат(МаксСкидка);
КонецФункции

При замере производительности чистое время выполнения строк кода внутри цикла может составлять всего 0.000169 с, тогда как зафиксированное общее время работы процедуры оказывается равным 0.28 с. Выясним причину этой разницы.

Основные накладные расходы платформы, не отображаемые в строковых замерщиках кода, складываются из следующих факторов:

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

Влияние расширений конфигурации на скорость работы

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

Проанализируем, почему расширения создают дополнительную нагрузку:

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

Способы решения и правила оптимизации

Разберем практические способы устранения задержек и оптимизации кода.

  1. Перенос простых вычислений на клиентскую сторону.

    Если процедура не делает прямых обращений к базе данных, а только обрабатывает данные, уже присутствующие на форме в коллекции Объект.Товары, серверный вызов не нужен вовсе. Выполнение кода непосредственно на клиенте полностью снимает расходы на сериализацию:

    
    &НаКлиенте
    Функция ПолучитьМаксимальнуюСкидкуНаКлиенте()
        МаксСкидка = 0;
        Для каждого стрДок из Объект.Товары Цикл
            Если стрДок.ПроцентАвтоматическойСкидки > МаксСкидка Тогда
                МаксСкидка = Окр(стрДок.ПроцентАвтоматическойСкидки);    
            КонецЕсли;
        КонецЦикла;
        Возврат МаксСкидка;
    КонецФункции
    
  2. Использование директивы &НаСервереБезКонтекста.

    Если вызов сервера действительно необходим (например, для чтения информации из справочников или регистров), но менять состояние формы не требуется, следует использовать директиву &НаСервереБезКонтекста и передавать только необходимые параметры. Это исключает упаковывание и передачу всей структуры формы.

  3. Оптимизация структуры расширений конфигурации.
    • Удалите из расширений заимствованные объекты, реквизиты и формы, которые не подвергались изменениям.
    • Избегайте заимствования часто вызываемых общих модулей без сугубой необходимости.
    • Старайтесь не разбивать доработки на большое количество мелких расширений: объединение доработок в одно оптимизированное расширение снижает издержки платформы на динамическое связывание.
  4. Обновление платформы и обслуживание базы.

    Установите актуальный релиз платформы 1С:Предприятие, где исправлены ошибки кеширования и работы с расширениями. Также выполните процедуру «Тестирование и исправление» в режиме Конфигуратор (с реиндексацией и сжатием таблиц) и очистите кеш клиентского приложения.

  5. Переход на клиент-серверный вариант работы.

    При активном использовании расширений и работе в многопользовательском режиме файловый вариант базы становится главным узким местом. Перевод базы на клиент-серверный режим существенно снижает задержки межпроцессного обмена.

← На главную