Советы были выведены опытным путем на одном из наших проектов 1С:CRM. После доработки типовой формы документа Интерес время открытия данной формы увеличилось до 18 секунд при первом открытии и до 9 секунд при последующих, что негативно сказывалось на работе пользователей. После применения описанных рекомендаций удалось уменьшить время открытия до 8 секунд при первом открытии и до 4 секунд при последующих, и, тем не менее, остался потенциал для еще большего ускорения.
Оптимизация кода
Перед тем, как переходить к следующим пунктам статьи, важно понять, что на самом деле увеличивает время открытия формы. Для этого необходимо провести замер открытия данной формы, это позволит нам точно определить, вызовы каких процедур занимают наибольшее количество времени. Если есть строки кода, которые при открытии формы выполняются заметно дольше, чем все остальные, то следует понять причину и, по необходимости, провести рефакторинг. Чаще всего причиной долгого открытия формы являются сложные, неправильно построенные запросы, которые требуют оптимизации.
Подробнее ознакомиться со способами улучшения таких запросов можно в статье на портале 1С:ИТС по ссылке. При этом хотим отметить, что даже эти общеизвестные способы могут не дать особого эффекта, или даже ухудшить текущий результат. Поэтому необходимо пробовать разные методы, делать замеры под разными пользователями с ограниченными правами и выбирать тот вариант, который покажет самое меньшее время.
Использование модулей с повторным использованием возвращаемых значений
Платформа 1С:Предприятие позволяет нам кэшировать значения функций. Это значит, что при повторной передаче такого же значения в функцию, результат не будет вычисляться снова, а будет извлекаться из кэша.
Кэширование можно использовать в функциях, которые описаны в общих модулях со свойством “Повторное использование возвращаемых значений”. Подробнее о плюсах и минусах, ограничениях таких модулей можно прочитать на портале 1С:ИТС по ссылке.
Отложенный вывод информации
Если замер открытия формы не показал каких-либо критичных значений, то есть вероятность, что причиной долгого открытие формы является большое количество элементов - в этом случае время уходит на создание формы и вывод элементов. Особенно много времени может уходить на вывод таблиц динамических списков. В такой ситуации можно использовать отложенный вывод информации, реализовать его можно несколькими способами:
1. Вывод элементов программно на нескольких вкладках, при этом при создании формы элементы добавляются только на текущую вкладку через подключаемый обработчик ожидания, а на остальные - в момент перехода.
Пример:
В обработчике события ПриСменеСтраницы запускаем обновление таблиц:
Код из примера текстом:
&НаКлиенте Процедура sc_АКАМ_СтраницыДанныеДокументаПриСменеСтраницы(Элемент, ТекущаяСтраница) Если ТекущаяСтраница = Элементы.ГруппаРетро Тогда sc_АКАМ_ЗапуститьЗаполнениеТаблицыРетро(); ИначеЕсли ТекущаяСтраница = Элементы.ГруппаСкидки Тогда sc_АКАМ_ЗапуститьЗаполнениеТаблицыСкидки(); ИначеЕсли ТекущаяСтраница = Элементы.sc_АКАМ_ГруппаЗаказы Тогда sc_АКАМ_ЗапуститьЗаполнениеТаблицыЗаказы(); ИначеЕсли ТекущаяСтраница = Элементы.РасчетПоВариантам Тогда sc_АКАМ_ЗапуститьЗаполнениеДеревьевУслугПоВариантам(); ИначеЕсли ТекущаяСтраница = Элементы.sc_Работы Тогда sc_АКАМ_ЗапуститьЗаполнениеТаблицыРабота(); ИначеЕсли ТекущаяСтраница = Элементы.ГруппаДоговоры Тогда sc_АКАМ_ЗапуститьЗаполнениеТаблицДоговоры(); КонецПроцедуры &НаКлиенте Процедура sc_АКАМ_ЗапуститьЗаполнениеТаблицыРетро() ОбновитьТаблицуРетро(); КонецПроцедуры &НаСервере Процедура ОбновитьТаблицуРетро() Если НЕ sc_АКАМ_ВыведенаТаблицаРетро Тогда sc_АКАМ_ВывестиТаблицуЗначенийРетро(); sc_АКАМ_ВыведенаТаблицаРетро = Истина; Иначе ЭтотОбъект["sc_АКАМ_Ретро"].Очистить(); КонецЕсли; … КонецПроцедуры Процедура sc_АКАМ_ВывестиТаблицуЗначенийРетро() Элементы.ДекорацияРетро.Видимость = Ложь; НовыйЭлемент = Элементы.Вставить("sc_АКАМ_Ретро", Тип("ТаблицаФормы"), Элементы.ГруппаРетро, Неопределено); НовыйЭлемент.ПутьКДанным = "sc_АКАМ_Ретро"; НовыйЭлемент.Высота = 10; НовыйЭлемент.ИзменятьПорядокСтрок = Ложь; НовыйЭлемент.ИзменятьСоставСтрок = Ложь; НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; НовыйЭлемент.РастягиватьПоВертикали = Истина; НовыйЭлемент.РастягиватьПоГоризонтали = Истина; НовыйЭлемент.РежимВыделения = РежимВыделенияТаблицы.Множественный; НовыйЭлемент.ТолькоПросмотр = Истина; // ****** Поле формы "БизнесПроцесс" *********** НовыйЭлемент = Элементы.Вставить("sc_АКАМ_РетроБизнесПроцесс", Тип("ПолеФормы"), Элементы.sc_АКАМ_Ретро, Неопределено); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = "sc_АКАМ_Ретро.БизнесПроцесс"; // ****** Поле формы "Услуга" *********** НовыйЭлемент = Элементы.Вставить("sc_АКАМ_РетроУслуга", Тип("ПолеФормы"), Элементы.sc_АКАМ_Ретро, Неопределено); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = "sc_АКАМ_Ретро.Услуга"; НовыйЭлемент = Элементы.Вставить("sc_АКАМ_РетроСтатус", Тип("ПолеФормы"), Элементы.sc_АКАМ_Ретро, Неопределено); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = "sc_АКАМ_Ретро.Статус"; НовыйЭлемент = Элементы.Вставить("sc_АКАМ_РетроНаименование", Тип("ПолеФормы"), Элементы.sc_АКАМ_Ретро, Неопределено); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = "sc_АКАМ_Ретро.Наименование"; КонецПроцедуры
3. Вывод элементов программно при открытии формы с помощью подключения обработчика ожидания.
Первые два способа очень похожи между собой, можно выбрать тот, который больше подходит с точки зрения визуала. О последнем способе можно прочитать подробнее в ранее опубликованной статье
Установка свойств “Получение представлений для невидимых полей”, “Динамическое считывание данных” для динамических списков
Еще одна рекомендация для форм с несколькими динамическими списками - убедиться, что выбраны подходящие значения свойств “Получение представлений для невидимых полей” и “Динамическое считывание данных”.
Свойство динамического списка “Получение представлений для невидимых полей” влияет на получение представлений для полей, которые не отображаются на форме или связаны с фактически невидимыми элементами формы. Поэтому, если не предполагается вынесение невидимых полей на форму, то в свойстве можем установить значение Ложь для ускорения получения данных динамическим списком. Ссылка на описание свойства на портале ИТС.
Свойство динамического списка “Динамическое считывание данных” (доступно, если свойство “Произвольный запрос” равно Истина и выбрана основная таблица) влияет на то, какими по размеру порциями будут считываться данные из БД. Если установлено значение Истина, то запрос будет забирать маленькие порции данных, при этом прокрутка списка может подвисать. Если установлено значение Ложь, то порции будут больше, запрос будет выполняться дольше, но прокрутка списка будет работать быстрее.
При установке свойства "Динамическое считывание данных" в динамическом списке необходимо учитывать несколько общих рекомендаций:
● если запрос выполняется быстро и в выборке, с учетом отборов, обычно содержится большое количество строк, то рекомендуется установить значение свойства Ложь;
● если запрос считается тяжелым, а выборка обычно содержит не много записей или пользователи редко используют прокрутку списка, то лучше установить значение свойства Истина.
Все эти советы помогут ускорить открытие форм и сделать рабочий процесс более приятным и эффективным для пользователей.