Имя: Пароль:
1C
1С v8
Медленно работает динамический список в УФ. Что делаю не так?
,
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) Попробуй вместо динамических списков список значений или дерево значений. Их содержимое можно получать за один вызов сервера. Но тоже не всегда помогает.