В практике разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда программное открытие формы с помощью метода ОткрытьФорму() субъективно или по замерам работает медленнее, чем обычное интерактивное открытие (например, двойным кликом в списке). Разберем по шагам, почему это происходит, как правильно интерпретировать результаты замеров и какие технические нюансы влияют на скорость визуализации интерфейса.
Прежде чем приступать к глубокой оптимизации кода, проанализируем саму методику измерения скорости. Часто «тормоза» метода ОткрытьФорму() оказываются ложными. Рассмотрим основной постулат: сам инструмент «Замер производительности» в конфигураторе 1С вносит существенные коррективы в работу системы. Каждый переход между строками кода, каждый вызов функции при включенном замере фиксируется платформой, что создает дополнительную нагрузку на процессор.
Выясним причину: когда мы открываем форму интерактивно, платформа использует оптимизированные внутренние механизмы отрисовки. Когда же мы запускаем замер и вызываем ОткрытьФорму(), отладчик вынужден прерывать выполнение на каждой строчке обработчиков инициализации (ПриСозданииНаСервере, ПриОткрытии и т.д.). В результате время выполнения может увеличиться в 5–10 раз. Поэтому первый совет: всегда проверяйте скорость работы «на глаз» или с помощью замера времени через функцию ТекущаяУниверсальнаяДатаВМиллисекундах() без включенного отладчика.
НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Справочник.Номенклатура.ФормаОбъекта", ПараметрыФормы);
КонецЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Время открытия: " + (КонецЗамера - НачалоЗамера) + " мс");
Рассмотрим техническую сторону вопроса. Метод ОткрытьФорму() подразумевает передачу структуры параметров с клиента на сервер. Если вы передаете в параметрах сложные объекты, массивы или большие структуры, платформа тратит время на сериализацию этих данных (преобразование в XML/JSON-подобный формат для передачи по HTTP/HTTPS) и последующую десериализацию на сервере.
Проанализируем ситуацию: при интерактивном открытии из списка система часто уже имеет контекст объекта в памяти. При программном вызове ОткрытьФорму() с параметром Отбор или Ключ системе приходится выполнять полноценный вызов сервера для инициализации данных. Чтобы ускорить этот процесс, старайтесь передавать в параметрах только примитивные типы (ссылки, строки, числа) и избегайте передачи тяжелых таблиц значений или структур.
Посмотрим, какие этапы проходит форма при вызове метода ОткрытьФорму(). Программное открытие инициирует жесткую последовательность событий, в каждом из которых может крыться «узкое место»:
Важно понимать, что при программном открытии с передачей специфических параметров (например, сложных отборов) платформа может заново перестраивать схему компоновки данных для динамических списков, что приводит к перегенерации SQL-запроса к базе данных. Рассмотрим пример оптимизации: если вам нужно просто показать данные, используйте фиксированные отборы в динамических списках, так как они кэшируются СУБД эффективнее.
Выясним еще одну причину задержек — использование расширений. В современной разработке на 1С часто применяется множество расширений. При вызове ОткрытьФорму() платформа обязана проверить наличие обработчиков &Перед, &Вместо или &После для каждого события формы во всех активных расширениях. Чем больше расширений затрагивают форму, тем длиннее «цепочка» вызовов, и тем медленнее визуально открывается окно. Проанализируйте состав ваших расширений и постарайтесь минимизировать количество перехватов событий инициализации формы.
Существует значительная разница между первым и повторным открытием формы. При первом вызове ОткрытьФорму() система выполняет:
При повторных вызовах эти данные берутся из локального кэша. Если вы тестируете скорость, обязательно делайте это на «разогретой» базе, выполнив открытие формы 2–3 раза. Если «тормозит» только первый раз — проблема в объеме компилируемого кода или сложности интерфейса.
Для того чтобы сделать открытие форм максимально быстрым, рекомендуем придерживаться следующих правил:
1. Оптимизируйте серверные вызовы. Убедитесь, что в процедуре ПриСозданииНаСервере нет лишних обращений к базе данных в цикле. Все данные должны выбираться одним запросом.
2. Используйте отложенное заполнение. Если на форме есть тяжелые отчеты или дополнительные данные, которые не нужны пользователю в первую секунду, выносите их заполнение в обработчик ожидания. Форма откроется мгновенно, а данные «подтянутся» чуть позже.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("Подключаемый_ДозаполнитьДанные", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ДозаполнитьДанные()
// Здесь вызываем серверный метод для получения тяжелых данных
ДозаполнитьДанныеНаСервере();
КонецПроцедуры
3. Минимизируйте объем передаваемых параметров. Вместо передачи всей структуры настроек, передайте только идентификатор, по которому форма сама сможет быстро считать настройки из кэша или базы данных на сервере.
4. Проверьте контекстные вызовы. Если перед вызовом ОткрытьФорму() в коде стоит другой серверный вызов, время их выполнения суммируется в восприятии пользователя. Старайтесь объединять логику так, чтобы количество переходов между клиентом и сервером было минимальным.
Таким образом, мы выяснили, что метод ОткрытьФорму() сам по себе не является медленным. Задержки обычно вызваны либо побочными эффектами инструментов отладки, либо избыточной логикой в обработчиках событий, либо неоптимальной передачей данных между контекстами. Следуя приведенным рекомендациям, вы сможете добиться мгновенного отклика интерфейса в ваших решениях на базе 1С.