Оптимизация процедуры при открытии формы элемента
Добрый день.
Есть у нас в организации КА 1.1. В ней было сделано кучу доработок для удобства работы. База росла, кол-во доработок для "удобств" тоже. В какой-то момент поняли, что открытие карточки контрагента происходил очень долго (относительно типовой). Пытаюсь оптимизировать полученное "наследство". На форму добавлено куча различных элементов (флажок, надпись, поле ввода и т.д) и сгруппировано по сервисам. Для отдельных элементов, написаны процедуры такого вида:
Если Сервис_СопровождаетКонкурент = Истина Тогда
ЭлементыФормы.сервис_Конкурент.Видимость = истина;
иначе
ЭлементыФормы.РамкаГруппы.ЦветРамки = ЦветаСтиля.ТекстИнформационнойНадписи
Конецесли;
(Ну это примерно, сильно, пожалуйста, не пинайте :) )
Которые при выполнении условия (значении истина) скрывают ненужные элементы и отображают скрытые на форме. Все бы ничего, работает, все ок. Но все эти процедуры вызываются при открытии формы ( Процедура ПриОткрытии() ) дабы было красиво и удобно. Получается жирно. Если выключить этот запрос, открытие происходит в два раза быстрее. 2 секунды вместо 4х. Подскажите, как это можно оптимизировать, может можно это реализовать как-то иначе? База в формате клиент-сервер
Есть у нас в организации КА 1.1. В ней было сделано кучу доработок для удобства работы. База росла, кол-во доработок для "удобств" тоже. В какой-то момент поняли, что открытие карточки контрагента происходил очень долго (относительно типовой). Пытаюсь оптимизировать полученное "наследство". На форму добавлено куча различных элементов (флажок, надпись, поле ввода и т.д) и сгруппировано по сервисам. Для отдельных элементов, написаны процедуры такого вида:
Если Сервис_СопровождаетКонкурент = Истина Тогда
ЭлементыФормы.сервис_Конкурент.Видимость = истина;
иначе
ЭлементыФормы.РамкаГруппы.ЦветРамки = ЦветаСтиля.ТекстИнформационнойНадписи
Конецесли;
(Ну это примерно, сильно, пожалуйста, не пинайте :) )
Которые при выполнении условия (значении истина) скрывают ненужные элементы и отображают скрытые на форме. Все бы ничего, работает, все ок. Но все эти процедуры вызываются при открытии формы ( Процедура ПриОткрытии() ) дабы было красиво и удобно. Получается жирно. Если выключить этот запрос, открытие происходит в два раза быстрее. 2 секунды вместо 4х. Подскажите, как это можно оптимизировать, может можно это реализовать как-то иначе? База в формате клиент-сервер
По теме из базы знаний
- Под капотом управляемых форм
- Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C
- Пометка тестовой копии рабочей базы через механизм оповещений и раскрашивание форм (Управляемое приложение)
- Отчеты с общей формой отчета. Типовые сценарии
- Методика разработки внешних печатных форм с возможностью отладки интерактивных команд печати
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Какой запрос?
Ну там текст запроса приведете может?
Сделайте замер производительности - что он показывает?
Что занимает основное время?
Если выключить этот запрос, открытие происходит в два раза быстрее. 2 секунды вместо 4х. Подскажите, как это можно оптимизировать, может можно это реализовать как-то иначе? База в формате клиент-сервер
Какой запрос?
Ну там текст запроса приведете может?
Сделайте замер производительности - что он показывает?
Что занимает основное время?
(2)
Ну там текст запроса приведете может?
Сделайте замер производительности - что он показывает?
Что занимает основное время?
Ваши вопросы нарушают правила кастинга на "Битву экстрасенсов 1С", который проводит автор! :-)
Сделайте замер производительности - что он показывает?
Что занимает основное время?
(1) Если используется серверный механизм управления отображения, то вызывать при открытии неправильно: при перерисовке формы контекст формы полностью передается на сервер и потом полностью обратно на клиент.
Рекомендуется для начала перенести вызов на сервер при чтении создании на сервере.
Если же выполняется вызов и оттуда и оттуда (и с клиента и с сервера), то изменение видимости необходимо оформить в процедуре на клиенте на сервере без контекста.
Рекомендуется для начала перенести вызов на сервер при чтении создании на сервере.
Если же выполняется вызов и оттуда и оттуда (и с клиента и с сервера), то изменение видимости необходимо оформить в процедуре на клиенте на сервере без контекста.
Ну вот эти 5 строчек точно сильно замедлять работу не должны. И куча таких аналогичных строк тоже. Если у вас конечно нет там условий получаемые запросами через точку/две и т.д. к таблицам БД.
Тут вам поможет замер производительности.
А вообще, ненормально, что у вас даже типовая функциональность открывается 2 секунды. Может с железом все плохо еще?
Тут вам поможет замер производительности.
А вообще, ненормально, что у вас даже типовая функциональность открывается 2 секунды. Может с железом все плохо еще?
Доброе утро.
С железом все ок:
Xeon X5680
48 Gb DDR3
под систему и базу используется SSD
И все это дело примерно для 40 сервисов. Т.е выполняются 40 раз однотипные процедуры при открытии. Именно замер производительности мне и помог понять что тормозит открытие карточки.
С железом все ок:
Xeon X5680
48 Gb DDR3
под систему и базу используется SSD
Кусок который вызывает процедуры из "приОткрытии |
---|
ЗаполнитьТаблицуСервисов();
Для Каждого Сервис Из тз_Сервисы Цикл Попытка ОтключенПриИзменении(ЭтотОбъект[Сервис.Значение+"Отключен"], Сервис.Значение); Исключение; КонецПопытки; // У сервисов "Антивирус Касперского" и "СПС Консультант Плюс" реквизит размещён в табличных частях Если НЕ (Сервис.Значение = "АК_" ИЛИ Сервис.Значение = "КПлюс_" ИЛИ Сервис.Значение = "Диадок_" ИЛИ Сервис.Значение = "Бухфон_") Тогда Попытка Выполнить(Сервис.Значение + "УслугаПредоставленаПриИзменении(Неопределено)"); Исключение; КонецПопытки; КонецЕсли; // У сервисов "ПФотч", "Бухфон", "СопровождениеWebСервисов" нет реквизита "СопровождаетКонкурент" Если НЕ (Сервис.Значение = "ПФотч" ИЛИ Сервис.Значение = "Бухфон_" ИЛИ Сервис.Значение = "СопровождениеWebСервисов_" ИЛИ Сервис.Значение = "ВиженСофт_") Тогда Попытка Выполнить(Сервис.Значение+"СопровождаетКонкурентПриИзменении(Неопределено)"); Исключение; КонецПопытки; КонецЕсли; |
Скрывает элементы при изменении - раз |
---|
Процедура Диадок2_СопровождаетКонкурентПриИзменении(Элемент)
//доработано //если программу сопровождает конкурент становится видимым поле Конкурент, //а не нужные для заполнения поля исчезают. Если Диадок2_СопровождаетКонкурент = Истина Тогда ЭлементыФормы.РамкаГруппы20.ЦветРамки = ЦветаСтиля.ЦветОсобогоТекста; ЭлементыФормы.РамкаГруппы20.ЦветТекста = ЦветаСтиля.ЦветОсобогоТекста; ЭлементыФормы.НадписьДиадок2_Конкурент.Видимость = истина; ЭлементыФормы.Диадок2_Конкурент.Видимость = истина; ЭлементыФормы.Диадок2_УслугаПредоставлена.Видимость = ложь; ЭлементыФормы.Диадок2_ДатаОконДействСертиф.Видимость = ложь; ЭлементыФормы.НадписьДиадок2_ДатаОконДействСертиф.Видимость = ложь; ЭлементыФормы.Диадок2_Отключен.Видимость = ложь; ЭлементыФормы.Диадок2_ПричинаОтключ.Видимость = ложь; ЭлементыФормы.НадписьДиадок2_ПричинаОтключ.Видимость = ложь; ЭлементыФормы.НадписьДиадок2_ДатаОконПоставки.Видимость = ложь; ЭлементыФормы.Диадок2_ДатаОконПоставки.Видимость = ложь; ЭлементыФормы.Диадок2_ДатаОтключения.Видимость = Ложь; ЭлементыФормы.НадписьДиадок2_ДатаОтключения.Видимость = Ложь; ЭлементыФормы.Диадок2_ДатаПредоставленияУслуги.Видимость = Ложь; ЭлементыФормы.НадписьДиадок2_ДатаПредоставленияУслуги.Видимость = Ложь; Иначе ЭлементыФормы.РамкаГруппы20.ЦветРамки = ЦветаСтиля.ТекстИнформационнойНадписи; ЭлементыФормы.РамкаГруппы20.ЦветТекста = ЦветаСтиля.ТекстИнформационнойНадписи; ЭлементыФормы.Диадок2_Конкурент.Видимость = ложь; ЭлементыФормы.НадписьДиадок2_Конкурент.Видимость = ложь; ЭлементыФормы.Диадок2_УслугаПредоставлена.Видимость = истина; ЭлементыФормы.Диадок2_ДатаОконДействСертиф.Видимость = истина; ЭлементыФормы.НадписьДиадок2_ДатаОконДействСертиф.Видимость = истина; ЭлементыФормы.НадписьДиадок2_ДатаОконПоставки.Видимость = истина; ЭлементыФормы.Диадок2_ДатаОконПоставки.Видимость = истина; ЭлементыФормы.Диадок2_Отключен.Видимость = истина; ЭлементыФормы.Диадок2_ДатаПредоставленияУслуги.Видимость = Истина; ЭлементыФормы.НадписьДиадок2_ДатаПредоставленияУслуги.Видимость = Истина; Если ЭлементыФормы.Диадок2_Отключен.Значение =истина Тогда ЭлементыФормы.Диадок2_ПричинаОтключ.Видимость = истина; ЭлементыФормы.НадписьДиадок2_ПричинаОтключ.Видимость = истина; ЭлементыФормы.Диадок2_ДатаОтключения.Видимость = Истина; ЭлементыФормы.НадписьДиадок2_ДатаОтключения.Видимость = Истина; иначе ЭлементыФормы.Диадок2_ПричинаОтключ.Видимость = ложь; ЭлементыФормы.НадписьДиадок2_ПричинаОтключ.Видимость = ложь; ЭлементыФормы.Диадок2_ДатаОтключения.Видимость = Ложь; ЭлементыФормы.НадписьДиадок2_ДатаОтключения.Видимость = Ложь; ЭлементыФормы.Диадок2_ДатаОтключения.Значение = Дата(1, 1, 1); Конецесли; КонецЕсли; КонецПроцедуры |
Скрывает элементы при изменении - два |
---|
Процедура ОтключенПриИзменении(ЗначениеОтключен, ПриставкаБлока)
НадписьБлока = "Надпись" + ПриставкаБлока; Если ЗначениеОтключен = Истина Тогда ЭлементыФормы[ПриставкаБлока + "ПричинаОтключ"].Видимость = Истина; ЭлементыФормы[НадписьБлока + "ПричинаОтключ"].Видимость = Истина; ЭлементыФормы[ПриставкаБлока + "ДатаОтключения"].Видимость = Истина; ЭлементыФормы[НадписьБлока + "ДатаОтключения"].Видимость = Истина; Иначе ЭлементыФормы[ПриставкаБлока + "ПричинаОтключ"].Видимость = Ложь; ЭлементыФормы[НадписьБлока + "ПричинаОтключ"].Видимость = Ложь; ЭлементыФормы[ПриставкаБлока + "ПричинаОтключ"].Значение = ""; ЭлементыФормы[ПриставкаБлока + "ДатаОтключения"].Видимость = Ложь; ЭлементыФормы[НадписьБлока + "ДатаОтключения"].Видимость = Ложь; ЭлементыФормы[ПриставкаБлока + "ДатаОтключения"].Значение = ДАТА(1,1,1); Конецесли; |
И все это дело примерно для 40 сервисов. Т.е выполняются 40 раз однотипные процедуры при открытии. Именно замер производительности мне и помог понять что тормозит открытие карточки.
Прикрепленные файлы:

(9)Очевидное решение - получать нужные данные одним запросом, а не выполнять процедуру/функцию по каждой строке таблицы. И в зависимости от результата запроса - скрывать не нужные элементы.
И как уже сказали - скрывать панели/страницы с группами элементов.
И как уже сказали - скрывать панели/страницы с группами элементов.
Можно элементы формы разложить по панелям и скрывать/показывать всю панель сразу, а не каждый элемент по отдельности.
Или вариант 2 - обдумать, действительно ли пользователю так нужно видеть эти десятки каких-то рамок и галок. Может, оставить несколько реально нужных, а остальные перенести на закладку "дополнительно", куда кто-то будет заглядывать раз в неделю.
Или вариант 2 - обдумать, действительно ли пользователю так нужно видеть эти десятки каких-то рамок и галок. Может, оставить несколько реально нужных, а остальные перенести на закладку "дополнительно", куда кто-то будет заглядывать раз в неделю.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот