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