Оптимизация процедуры при открытии формы элемента

1. petrushkomaks 26.02.24 14:23 Сейчас в теме
Добрый день.

Есть у нас в организации КА 1.1. В ней было сделано кучу доработок для удобства работы. База росла, кол-во доработок для "удобств" тоже. В какой-то момент поняли, что открытие карточки контрагента происходил очень долго (относительно типовой). Пытаюсь оптимизировать полученное "наследство". На форму добавлено куча различных элементов (флажок, надпись, поле ввода и т.д) и сгруппировано по сервисам. Для отдельных элементов, написаны процедуры такого вида:

Если Сервис_СопровождаетКонкурент = Истина Тогда
ЭлементыФормы.сервис_Конкурент.Видимость = истина;
иначе
ЭлементыФормы.РамкаГруппы.ЦветРамки = ЦветаСтиля.ТекстИнформационнойНадписи
Конецесли;
(Ну это примерно, сильно, пожалуйста, не пинайте :) )

Которые при выполнении условия (значении истина) скрывают ненужные элементы и отображают скрытые на форме. Все бы ничего, работает, все ок. Но все эти процедуры вызываются при открытии формы ( Процедура ПриОткрытии() ) дабы было красиво и удобно. Получается жирно. Если выключить этот запрос, открытие происходит в два раза быстрее. 2 секунды вместо 4х. Подскажите, как это можно оптимизировать, может можно это реализовать как-то иначе? База в формате клиент-сервер
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 33 26.02.24 15:14 Сейчас в теме
(1)
Если выключить этот запрос, открытие происходит в два раза быстрее. 2 секунды вместо 4х. Подскажите, как это можно оптимизировать, может можно это реализовать как-то иначе? База в формате клиент-сервер

Какой запрос?
Ну там текст запроса приведете может?
Сделайте замер производительности - что он показывает?
Что занимает основное время?
8. user856012 14 26.02.24 16:33 Сейчас в теме
(2)
Ну там текст запроса приведете может?
Сделайте замер производительности - что он показывает?
Что занимает основное время?
Ваши вопросы нарушают правила кастинга на "Битву экстрасенсов 1С", который проводит автор! :-)
muskul; unknown181538; Raskad; Sashares; +4 Ответить
4. glek 119 26.02.24 15:28 Сейчас в теме
(1) Если используется серверный механизм управления отображения, то вызывать при открытии неправильно: при перерисовке формы контекст формы полностью передается на сервер и потом полностью обратно на клиент.
Рекомендуется для начала перенести вызов на сервер при чтении создании на сервере.
Если же выполняется вызов и оттуда и оттуда (и с клиента и с сервера), то изменение видимости необходимо оформить в процедуре на клиенте на сервере без контекста.
5. glek 119 26.02.24 15:29 Сейчас в теме
(1) Подождите, а КА 1.1 это же обычные формы? если так, то мой совет предыдущего комментарий "фтопку".
user1880116; +1 Ответить
6. user1880116 26.02.24 16:10 Сейчас в теме
(1) Для начала перенеси это все в ПриСозданииНаСервере. Уйдут неявные серверные вызовы при изменении разных видимостей/доступностей.
7. user1880116 26.02.24 16:11 Сейчас в теме
(6) Отменяется. Это ж ОФ.
Ну, тогда запрос показывай.
3. YozZzhik 26.02.24 15:16 Сейчас в теме
Ну вот эти 5 строчек точно сильно замедлять работу не должны. И куча таких аналогичных строк тоже. Если у вас конечно нет там условий получаемые запросами через точку/две и т.д. к таблицам БД.
Тут вам поможет замер производительности.
А вообще, ненормально, что у вас даже типовая функциональность открывается 2 секунды. Может с железом все плохо еще?
9. petrushkomaks 27.02.24 06:22 Сейчас в теме
Доброе утро.

С железом все ок:
Xeon X5680
48 Gb DDR3
под систему и базу используется SSD

Кусок который вызывает процедуры из "приОткрытии


Скрывает элементы при изменении - раз


Скрывает элементы при изменении - два


И все это дело примерно для 40 сервисов. Т.е выполняются 40 раз однотипные процедуры при открытии. Именно замер производительности мне и помог понять что тормозит открытие карточки.
Прикрепленные файлы:
14. Sashares 33 27.02.24 09:46 Сейчас в теме
(9)Очевидное решение - получать нужные данные одним запросом, а не выполнять процедуру/функцию по каждой строке таблицы. И в зависимости от результата запроса - скрывать не нужные элементы.
И как уже сказали - скрывать панели/страницы с группами элементов.
unknown181538; +1 Ответить
15. unknown181538 160 27.02.24 22:41 Сейчас в теме
(9) А у вас все эти 40 сервисов используются? Если нет - оптимизировать код, чтобы это не вызывалось, и отключить видимость элементов галочками.
10. starjevschik 27.02.24 07:56 Сейчас в теме
Можно элементы формы разложить по панелям и скрывать/показывать всю панель сразу, а не каждый элемент по отдельности.
Или вариант 2 - обдумать, действительно ли пользователю так нужно видеть эти десятки каких-то рамок и галок. Может, оставить несколько реально нужных, а остальные перенести на закладку "дополнительно", куда кто-то будет заглядывать раз в неделю.
11. petrushkomaks 27.02.24 08:07 Сейчас в теме
(10) У нас как это обычно бывает, всё нужное... :( Я вот думаю, а можно как-то "зафиксировать" результат выполнения процедуры? Чтоб потом его можно было вытащить, а не заново её выполнять. Хотя с объектами формы, это наверное невозможно
12. starjevschik 27.02.24 08:14 Сейчас в теме
(11)
У нас как это обычно бывает, всё нужное

если поспрашивать манагеров, на что они смотрят, окажется, что все это не нужно никому уже не один год.
unknown181538; +1 Ответить
13. nomad_irk 81 27.02.24 08:17 Сейчас в теме
(11)
Я вот думаю, а можно как-то "зафиксировать" результат выполнения процедуры? Чтоб потом его можно было вытащить, а не заново её выполнять

Как-то так:
Результат = Неопределено;//может быть реквизитом формы, например.
МояПроцедура(Результат);
16. unknown181538 160 29.02.24 00:03 Сейчас в теме
(13) мне кажется, у вас там не одна процедура, а 40 разных. Там же вызов в методе Выполнить( спрятан
17. SlavaKron 29.02.24 01:00 Сейчас в теме
(9) Покажите замер производительности с отключенной галочкой "Для вызова процедур и функций включать время выполнения" (слева внизу).
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот