Имя: Пароль:
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) Попробуй вместо динамических списков список значений или дерево значений. Их содержимое можно получать за один вызов сервера. Но тоже не всегда помогает.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн