|
Медленно работает динамический список в УФ. Что делаю не так? | ☑ | ||
---|---|---|---|---|
0
SerGa
29.11.12
✎
14:34
|
Есть на форме два динамических списка.
Цель: При активизации какой либо строки первого списка выводить связанные с ней строки второго списка. Делаю для первого списка: &НаКлиенте Процедура СписокСтатьиБюджетаПриАктивизацииСтроки(Элемент) УсловиеОтбора = СписокСоответствиеСтатейБюджетаИСтатейДДСУУ.Отбор.Элементы.Получить(0); сзСтатьи = Новый СписокЗначений; сзСтатьи.Добавить(ТекСтатьяБюджета); сзСтатьи.Добавить(ПустаяСтатьяБюджета); УсловиеОтбора.ПравоеЗначение = сзСтатьи; КонецПроцедуры Второй динамический список "СписокСоответствиеСтатейБюджетаИСтатейДДСУУ" имеет тип произвольный запрос ВЫБРАТЬ РегистрСведенийСоответствиеСтатейБюджетаИСтатейДДСУУ.СтатьяБюджета, РегистрСведенийСоответствиеСтатейБюджетаИСтатейДДСУУ.СтатьяДДСУУ ИЗ РегистрСведений.СоответствиеСтатейБюджетаИСтатейДДСУУ КАК РегистрСведенийСоответствиеСтатейБюджетаИСтатейДДСУУ Установлена галка Динамическое считывание данных. Проблема в следующем: 1. Работает заметно медленнее чем в обычном режиме. 2. Сервер вызывается почему-то 2 раза при каждом перемещении курсора в первом списке.. что делаю не так? |
|||
1
Mort
29.11.12
✎
14:36
|
Храни ссылку на текущую строку и в приАктивизации сравнивай текущее значение с сохраненным.
|
|||
2
SerGa
29.11.12
✎
14:41
|
что это даст не очень пойму??
|
|||
3
SerGa
29.11.12
✎
14:42
|
не много не правильно в (0)скопировал первую процедуру
так правильно &НаКлиенте Процедура СписокСтатьиБюджетаПриАктивизацииСтроки(Элемент) ТекСтатьяБюджета = Элемент.ТекущаяСтрока; УсловиеОтбора = СписокСоответствиеСтатейБюджетаИСтатейДДСУУ.Отбор.Элементы.Получить(0); сзСтатьи = Новый СписокЗначений; сзСтатьи.Добавить(ТекСтатьяБюджета); сзСтатьи.Добавить(ПустаяСтатьяБюджета); УсловиеОтбора.ПравоеЗначение = сзСтатьи; КонецПроцедуры |
|||
4
Mort
29.11.12
✎
14:42
|
(2) Когда ты ставишь отбор ПриАктивизацииСтроки вызывается снова. Кстати ХЗ как на нынешних платформах, но в 8.2.13 это вводило код из (0) в бесконечный штопор.
|
|||
5
Mort
29.11.12
✎
14:45
|
Вот, например, у меня под списком несколько списков на закладках. Для оптимизации введены флаги по обновлению:
&НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) Если Элемент.ТекущаяСтрока <> ТекущийЭлементСписка Тогда ТекущийЭлементСписка = Элемент.ТекущаяСтрока; СписокЗадачОбновлен = Ложь; Если Элементы.СтраницыПанелиТекущегоЭлемента.ТекущаяСтраница = Элементы.СтраницаЗадачи Тогда ДинамическиеСпискиКлиентСервер.УстановитьОтборСписка(СписокЗадач.Отбор, "ЭлементМоделиСистемы", ТекущийЭлементСписка); СписокЗадачОбновлен = Истина; КонецЕсли; СписокТестовОбновлен = Ложь; Если Элементы.СтраницыПанелиТекущегоЭлемента.ТекущаяСтраница = Элементы.СтраницаТесты Тогда ДинамическиеСпискиКлиентСервер.УстановитьОтборСписка(СписокТестов.Отбор, "ЭлементМоделиСистемы", ТекущийЭлементСписка); СписокТестовОбновлен = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры ..... &НаКлиенте Процедура СтраницыПанелиТекущегоЭлементаПриСменеСтраницы(Элемент, ТекущаяСтраница) Если Элементы.СтраницыПанелиТекущегоЭлемента.ТекущаяСтраница = Элементы.СтраницаЗадачи И Не СписокЗадачОбновлен Тогда ДинамическиеСпискиКлиентСервер.УстановитьОтборСписка(СписокЗадач.Отбор, "ЭлементМоделиСистемы", ТекущийЭлементСписка); СписокЗадачОбновлен = Истина; КонецЕсли; Если Элементы.СтраницыПанелиТекущегоЭлемента.ТекущаяСтраница = Элементы.СтраницаТесты И Не СписокТестовОбновлен Тогда ДинамическиеСпискиКлиентСервер.УстановитьОтборСписка(СписокТестов.Отбор, "ЭлементМоделиСистемы", ТекущийЭлементСписка); СписокТестовОбновлен = Истина; КонецЕсли; КонецПроцедуры |
|||
6
Юрий Лазаренко
29.11.12
✎
14:47
|
(0) "Установлена галка Динамическое считывание данных" - убери, значительно снизится трафик
|
|||
7
Юрий Лазаренко
29.11.12
✎
14:48
|
(0) " Сервер вызывается почему-то 2 раза" - скорее всего из-за галки "дин считывание"
|
|||
8
Юрий Лазаренко
29.11.12
✎
14:51
|
(0) Поставить обоим спискам произвольный запрос, выбирать в нем только необходимые данные, отказаться от отбора и нужные данные получать через параметры запроса - в некоторых случаях очень помогает. Недавно подобную задачу решал, в итоге вместо 2-х вызовов сервера, 0,8 сек и 65000 кб входящих данных получил 1 вызов, 0,2 сек и 17000 кб.
|
|||
9
acsent
29.11.12
✎
14:51
|
(8) это ничем не поможет
|
|||
10
acsent
29.11.12
✎
14:51
|
Правильно нужно Обработчик ожидания + запоминание строки
|
|||
11
acsent
29.11.12
✎
14:52
|
Это кстати офф ответ от 1с
|
|||
12
Юрий Лазаренко
29.11.12
✎
14:53
|
(9) Обработчик ожидания я тоже прикрутил, помогает, ага, но и (8) тоже дает экономию трафика, проверено.
|
|||
13
acsent
29.11.12
✎
14:54
|
(12) параметры вместо отборов никак не могут помочь. или у тебя изначально запрос был просто кривой
|
|||
14
SerGa
29.11.12
✎
14:55
|
(8) снятие галки динамический список не помогло... даже медленнее стало... попробую щас через параметры запроса и через обработку ожидания
|
|||
15
Юрий Лазаренко
29.11.12
✎
14:57
|
(13) У меня изначально вообще там запроса не было.
|
|||
16
SerGa
29.11.12
✎
14:58
|
если из списка для сравнения в отборе убрать второй элемент списка ПустаяСтатьяБюджета (который у меня хранит пустое значение справочника) , т.е. оставить в списке только 1 элемент то вызовов сервера становится 1 и работает в 2 раза быстрее... загадка блин...
|
|||
17
Юрий Лазаренко
29.11.12
✎
15:03
|
(16) Ну вот перепиши на произвольный запрос и сразу условие отбора в нем задавай, будет тебе счастье.
|
|||
18
SerGa
29.11.12
✎
15:09
|
(5) с запоминанием строки не поял.. зачем её запоминать? если я скролю по первому списку вниз, то каждый раз при изменении строки вызывается ПриАктивизацииСтроки для этого списка, в котором устанавливается отбор для второго списка... это вроде логично и правильно... я вот только не понял почему после установки отбора опять должна вызываться ПриАктивизацииСтроки ???
|
|||
19
Юрий Лазаренко
29.11.12
✎
15:13
|
(18) "почему после установки отбора опять должна вызываться ПриАктивизацииСтроки" - платформа так работает, ты отбор поставил и теперь той строки, на которой был установлен курсор, вообще в списке нет, а значит была активирована другая строка.
|
|||
20
SerGa
29.11.12
✎
15:18
|
(19) У меня платформа 8.2.16 сижу в отладчике. поставил точку останова в начале процедуры ПриАктивацииСтроки.... запустил... при скроле вызывается всегда только один раз.. то что я внутри процедуры ПриАктивацииСтроки первого списка ставлю отбор во втором дин списке не инициализирует повторный вызов ПриАктивацииСтроки в первом списке
|
|||
21
Юрий Лазаренко
29.11.12
✎
15:24
|
(20) Если ставишь отбор во втором, то в первом точно ничего не будет вызываться.
|
|||
22
SerGa
29.11.12
✎
15:46
|
Переделал на использование Параметров произвольного запроса
ВЫБРАТЬ РегистрСведенийСоответствиеСтатейБюджетаИСтатейДДСУУ.СтатьяБюджета, РегистрСведенийСоответствиеСтатейБюджетаИСтатейДДСУУ.СтатьяДДСУУ ИЗ РегистрСведений.СоответствиеСтатейБюджетаИСтатейДДСУУ КАК РегистрСведенийСоответствиеСтатейБюджетаИСтатейДДСУУ ГДЕ РегистрСведенийСоответствиеСтатейБюджетаИСтатейДДСУУ.СтатьяБюджета В(&СтатьяБюджета) , передаю туда массив ТекСтатьяБюджета = Элемент.ТекущаяСтрока; Если Не ЗначениеЗаполнено(ТекСтатьяБюджета) Тогда Возврат; КонецЕсли; масСтатьи = Новый Массив; масСтатьи.Добавить(ТекСтатьяБюджета); масСтатьи.Добавить(ПустаяСтатьяБюджета); СписокСоответствиеСтатейБюджетаИСтатейДДСУУ.Параметры.УстановитьЗначениеПараметра("СтатьяБюджета", масСтатьи); работает также медленно как и через использование отбора и 2 вызова сервера |
|||
23
acsent
29.11.12
✎
15:47
|
(22) Читай (10) до простветления
|
|||
24
acsent
29.11.12
✎
15:50
|
||||
25
acsent
29.11.12
✎
15:52
|
кстати ты во второй таблице в индекс попадаешь?
|
|||
26
MSII
29.11.12
✎
15:53
|
Хорошо, что всего 2 вызова. Заботливая все же платформа.
|
|||
27
SerGa
29.11.12
✎
16:09
|
(25) что значит " в индекс попадаешь" ?
|
|||
28
SerGa
29.11.12
✎
16:10
|
(24) партнерский форум не доступен у меня ((
|
|||
29
SerGa
29.11.12
✎
16:30
|
Сделал через обработку + проверку строки
&НаКлиенте Процедура СписокСтатьиБюджетаПриАктивизацииСтроки(Элемент) ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.1, Истина); КонецПроцедуры &НаКлиенте Процедура ОбработкаОжидания() ТекСтрока = Элементы.СписокСтатьиБюджета.ТекущаяСтрока; Если СписокСтатьиБюджетаТекущаяСтрока <> ТекСтрока Тогда СписокСтатьиБюджетаТекущаяСтрока = ТекСтрока; масСтатьи = Новый Массив; масСтатьи.Добавить(ТекСтрока); масСтатьи.Добавить(ПустаяСтатьяБюджета); СписокСоответствиеСтатейБюджетаИСтатейДДСУУ.Параметры.УстановитьЗначениеПараметра("СтатьяБюджета", масСтатьи); КонецЕсли; КонецПроцедуры сервер вызывается 1 раз ..... шаманство какое-то... единственое с задержкой отображаются данные второго списка... непонятно что принципиально изменилось и что дергало сервер второй раз... (25) может что на партнерском форуме писали про это?? |
|||
30
SerGa
30.11.12
✎
14:49
|
А как быть (оптимизировать) если не одна а несколько связанных с основным динамических списков.
Если их например 4 и для каждого в оброботке ожидания вызывать .Параметры.УстановитьЗначениеПараметра( то получается при смене строки не 1 а 4! вызова сервера и работает очень медленно. Как быть? |
|||
31
Юрий Лазаренко
30.11.12
✎
16:23
|
(30) Попробуй вместо динамических списков список значений или дерево значений. Их содержимое можно получать за один вызов сервера. Но тоже не всегда помогает.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |