В процессе разработки и сопровождения систем на базе 1С:Предприятие 8.3 программисты часто сталкиваются с проблемой медленного открытия форм. Особенно это актуально для форм списков, где основным элементом управления является Динамический список. Пользователи жалуются на «подвисание» интерфейса, при этом модуль формы может быть абсолютно пуст, что ставит начинающего разработчика в тупик. Разберем детально, как локализовать проблему и какими инструментами замерить реальную скорость работы интерфейса.
Первый и самый простой способ — это использование встроенных функций языка для получения меток времени в миллисекундах. Рассмотрим ситуацию, когда нам нужно понять, сколько времени тратит платформа на инициализацию объекта формы на сервере и передачу его клиенту. Для этого мы можем использовать внешнюю обработку или вызвать код из другой формы.
Важно различать методы ПолучитьФорму и ОткрытьФорму. Метод ПолучитьФорму только создает объект формы, в то время как ОткрытьФорму инициирует весь цикл отображения, включая отрисовку интерфейса и первичную выборку данных динамическим списком. Проанализируем пример кода для замера:
ОтметкаВремени = ТекущаяУниверсальнаяДатаВМиллисекундах();
// Замеряем только получение объекта формы
Форма = ПолучитьФорму("Справочник.Займы.ФормаСписка");
ВремяСозданияФормы = ТекущаяУниверсальнаяДатаВМиллисекундах() - ОтметкаВремени;
Сообщить("Время создания объекта формы (мс): " + ВремяСозданияФормы);
// Замеряем полное открытие
ОтметкаВремени = ТекущаяУниверсальнаяДатаВМиллисекундах();
ОткрытьФорму("Справочник.Займы.ФормаСписка");
ВремяОткрытияФормы = ТекущаяУниверсальнаяДатаВМиллисекундах() - ОтметкаВремени;
Сообщить("Время вызова команды открытия (мс): " + ВремяОткрытияФормы);
Если результаты замера показывают небольшие значения (например, 160–200 мс), а пользователь все равно видит «крутящееся колесо» в течение 5 секунд, значит, основная задержка происходит на этапе отрисовки или выполнения запроса в динамическом списке, который отрабатывает асинхронно после отображения каркаса формы.
Для более глубокого анализа нам потребуется штатный механизм 1С. Рассмотрим пошагово, как запустить замер производительности, если модуль формы пуст и негде поставить точку останова:
Система сформирует таблицу, в которой будут указаны все вызванные процедуры, включая системные (скрытые) модули. Мы сможем увидеть, сколько времени заняли вызовы сервера и какие процедуры были наиболее длительными. Если даже здесь мы не видим явных «тяжелых» строк кода, значит, проблема кроется в настройках компоновки данных динамического списка.
Часто возникает вопрос: как «поймать» момент открытия, если в модуле формы нет ни одной строки кода? Проанализируем несколько приемов, которые используют профессиональные разработчики:
ПриСозданииНаСервере, нажать на лупу и создать пустую процедуру. Теперь у нас есть место для установки точки останова. После анализа эту процедуру можно удалить.ПриНачалеРаботыСистемы) или в процедуре ОбработкаПолученияФормы модуля менеджера справочника, если она определена.Выясним причину, по которой динамический список может тормозить открытие формы даже при отсутствии кода в модулях. Основными факторами являются:
ЛЕВОЕ СОЕДИНЕНИЕ с тяжелыми таблицами. В консоли запросов такой запрос может работать быстро, но в форме он обрастает дополнительными условиями.Ссылка.Поле.ЕщеОдноПоле в колонках списка заставляет систему делать неявные соединения в SQL-запросе, что драматически снижает производительность на больших объемах данных.Рассмотрим ситуацию, которую обнаружил автор темы: при первом запуске программы форма открывается 3.5 секунды, а в последующие разы — мгновенно. Это классический пример влияния регламентных заданий и кэширования конфигурации.
В момент запуска системы 1С:Предприятие выполняет целый ряд тяжелых операций:
Если ваша база данных расположена на медленном диске или сервер перегружен в момент старта, любые действия в первые минуты после входа будут замедлены. Для оптимизации рекомендуется разносить запуск тяжелых регламентных заданий на ночное время и следить за тем, чтобы настройки пользователей (отборы, группировки в списках) не были избыточными. Помните, что иногда проще «сбросить настройки формы» пользователю, чем пытаться оптимизировать сложный запрос, который тормозит из-за одного некорректного отбора по неиндексированному полю.