Имя: Пароль:
1C
1С v8
Быстро листаю список - как отработать ПриПолученииДанных по таймеру?
,
0 mikecool
 
17.07.13
12:20
Преамбула - в список выводятся несколько рассчетных колонок в ПриПолученииДанных
если быстро листать список это дело подтормаживает(написано все красиво, тут затыков нет) да и считаю неоптимальным рассчет данных, которые не нужны.
Думаю - прицепить обработку ожидания на событие ПриВыводеДанных с интервалом в секунду, но - не пойму пока как
сбрасывать счетчик обработки ожидания в привыводеданных, но как потом вернуться в привыводеданных?
есть какие мысли на эту тему?
98 Fragster
 
гуру
17.07.13
15:25
(94) у меня отрабатывает все четко (1 раз) (у меня там были еще Сообщить() добавлены - следил по ним)
99 H A D G E H O G s
 
17.07.13
15:25
(94) 2 раза у меня.
100 Fragster
 
гуру
17.07.13
15:26
(99) 2 раза - это скаченная, или именно с кодом (91)? в той, которую я выкладываю сначала идет ОбновитьСтроки, потом ПоТаймеру = Истина; из-за этого два раза вызывалось.
101 RomaH
 
naïve
17.07.13
15:27
v8: v8: Событие ПриПолученииДанных отрабатывает дважды

agarych

   
(0) посмотри на ИТС там все написано.

Первый раз отрабатывает, для строк выше текущей строки, второй раз для текущей строки + все что ниже.

Кстати два раза он у тебя будет вызываться если ты кнопки page up, page down используешь. И один раз если колесиком мышки крутить.
102 H A D G E H O G s
 
17.07.13
15:28
(100) (91)
103 H A D G E H O G s
 
17.07.13
15:28
(101) Все понятно.
Как ты ТРИ раза добился?
104 RomaH
 
naïve
17.07.13
15:29
(60) тестировалось на ЗУП - там не оформленные строки занимают 2 строки, а оформленные - 1

поэтому, похоже, отрабатывает целых три рааз
105 RomaH
 
naïve
17.07.13
15:30
т.е. обработало одну порцию - верхнюю - оформило - вывело
на экране стало показывать больше строк чем было изначально
потом - обрабатывает вторую часть - изначальну
на экране помещается еще больше строк
потом - обрабатывает все оставшиеся строки
106 RomaH
 
naïve
17.07.13
15:32
по сути алгоритм из (60) вроде должен работать хоть на одном хоть на трех проходах
107 Fragster
 
гуру
17.07.13
15:33
понял, счас посмотрю, что можно сделать...
108 Fragster
 
гуру
17.07.13
15:35
апдейт, который пашет правильно, вроде:

Процедура ВключитьТаймер()
   ПоТаймеру = Истина;
   ЭлементыФормы.ТабличноеПоле1.ОбновитьСтроки();
КонецПроцедуры

Процедура ВыключитьТаймер()
   ПоТаймеру = Ложь;
КонецПроцедуры

Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок)
   
   Если ПоТаймеру Тогда
       Для каждого Оформление Из ОформленияСтрок Цикл
           Оформление.Ячейки.ДолгоСчитается.УстановитьТекст(ТекущаяДата());
       КонецЦикла;
       ПодключитьОбработчикОжидания("ВыключитьТаймер", 0.1, Истина);
   Иначе
       ОтключитьОбработчикОжидания("ВключитьТаймер");
       ПодключитьОбработчикОжидания("ВключитьТаймер", 0.1, Истина);
   КонецЕсли;
КонецПроцедуры
109 Fragster
 
гуру
17.07.13
15:38
лучше у включения таймаут 0.5, иначе если успеть после первого оформления - то он при мотании будет оставшиеся строки все равно доотрисовывать
110 mikecool
 
17.07.13
15:42
(108) в этом случае только раз срабатывает ПриПолученииДанных?
111 RomaH
 
naïve
17.07.13
15:43
(110) см (101)
112 mikecool
 
17.07.13
15:44
(111) это я посмотрел, получается что в этой процедуре ОформленияСтрок - весь выводимый набор, но срабатывает дважды для "верха" и  "низа"?
113 mikecool
 
17.07.13
15:44
+112 нафига тогда в ОформленияСтрок  пихать весь набор?
114 RomaH
 
naïve
17.07.13
15:45
(110) не все-ли равно ОформленияСтрок всегда разные
115 RomaH
 
naïve
17.07.13
15:46
(113) точно разный?
116 H A D G E H O G s
 
17.07.13
15:46
(108) Вроде работает :-)
117 mikecool
 
17.07.13
15:47
(114) так если всегда разный, то какая разница - какой проход? если надо обработать все
118 mikecool
 
17.07.13
15:47
так что - годная тема получилась? можно было на конкурс с ипадом отправлять? )))
119 RomaH
 
naïve
17.07.13
15:50
(117) я тебя не понял
есть обновление данных списка
есть три прохода
оформление строк на всех трех проходах содержат разные коллекции
сумма коллекций в итоге дает все строки котрые показываются на экране
120 mikecool
 
17.07.13
15:52
(119) зачем отслеживать номер прохода, если каждый проход содержит другую коллекцию строк, которые надо обработать?
121 RomaH
 
naïve
17.07.13
15:54
(120) ... что бы не обрабатывать 4 проход вызваный прокручиванием спсика
122 mikecool
 
17.07.13
15:56
все равно не понимаю )))
есть событие, которое вызывается три раза
1) для текущей строки
2) для строк выше
3) для строк ниже
порядок щас не суть, каждый вызов содержит
1) одну строку
2) строки выше
3) строки ниже
каждую эту коллекцию надо обработать, а у тебя получается первые две пропускается и обрабатывается только третья?
123 RomaH
 
naïve
17.07.13
15:56
объясняю логику
надо обновить данные только после 3 секунд после остановки прокручивания

т.е. надо выподнять обновление не сразу, а только после 3 секунд после обновления

для этого при обновлении ... читайте код
124 RomaH
 
naïve
17.07.13
15:57
(122) у меня первые три обрабатываются - а последующие нет
125 mikecool
 
17.07.13
15:58
(124) а, епа мать )))
126 RomaH
 
naïve
17.07.13
15:58
2) строки выше
3) строки ниже
3) строки которые получились после уменьшения высоты строк из впервых двух коллекций
127 RomaH
 
naïve
17.07.13
15:59
(122) у меня первые три обрабатываются - а потом сбрасывается флаг, что это вызов надо обрабатывать
128 Fragster
 
гуру
17.07.13
16:06
Для того, чтобы случайно не попасть в период, когда таймер включен, но мы крутим форму - выключение флага перенес в обновление отображения, вроде работает:


Процедура ВключитьТаймер()
   Таймер = Истина;
   ЭлементыФормы.ТабличноеПоле1.ОбновитьСтроки();
КонецПроцедуры

Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок)
   Сообщить("При получении " + Таймер);
   Если Таймер Тогда
       Для каждого Оформление Из ОформленияСтрок Цикл
           Оформление.Ячейки.ДолгоСчитается.УстановитьТекст(ТекущаяДата());
       КонецЦикла;
   Иначе
       ОтключитьОбработчикОжидания("ВключитьТаймер");
       ПодключитьОбработчикОжидания("ВключитьТаймер", 0.5, Истина);
   КонецЕсли;
КонецПроцедуры

Процедура ОбновлениеОтображения()
   Сообщить("Обновление " + Таймер);
   Таймер = Ложь;
КонецПроцедуры
129 mikecool
 
17.07.13
16:07
да вроде и так норм отрабатывает
130 Fragster
 
гуру
17.07.13
16:07
(129) ну, залипнуть может - попробуй таймаут на выключение таймера поставить 5 секунд :)
131 H A D G E H O G s
 
17.07.13
16:09
(130) Он не залипнет. Он будет отрабатывать как будто никаких приблуд нет.
132 H A D G E H O G s
 
17.07.13
16:10
(130) Ну отработает несколько ПриПолученииДанных(), потом отлипнет.
Для 0.1 секунды вообще вряд ли так случиццо.
133 mikecool
 
17.07.13
16:15
Для 0.1 таймер срабатывает по ощущениям как через секунду (
134 H A D G E H O G s
 
17.07.13
16:15
Но вообще идея здравая, лучше перебдеть :-)
135 H A D G E H O G s
 
17.07.13
16:16
(133)
Вызов будет осуществляться только в "состоянии покоя", то есть в тот момент, когда программа не выполняет никаких действий.
136 mikecool
 
17.07.13
16:16
не, щас поставил 0,1 - не успеваю нажать на клавишу - срабатывает ))) надо 0.2
137 H A D G E H O G s
 
17.07.13
16:17
(136) Тоесть?
138 H A D G E H O G s
 
17.07.13
16:17
p.s. Вот мы фигней занимаемся...
139 mikecool
 
17.07.13
16:18
(138) почему фигней? я не знаю как у кого, но мне например не приятно, когда я листаю список, а он у меня покадрово с интервалом в 2 секунды прорисовывается ( юзерам думаю тоже не прикольно
140 Ёпрст
 
17.07.13
16:33
(139) И сколько у тебя расчетных колонок ?
141 mikecool
 
17.07.13
16:38
(140) пока две, щас планируют еще штуки три
142 mikecool
 
17.07.13
16:39
щас по мелочи переделываю вывод списка, умудрились получать валюту бух и упр в цикле по каждому оформлению ((( в шоке
143 Aprobator
 
17.07.13
16:41
(142) если в Корпе нет, то пример можно посмотреть на конфе КА или УПП.
144 mikecool
 
17.07.13
16:42
(143) да хватит с меня копрокода
145 Aprobator
 
17.07.13
16:43
грубо суть в следующем, с оформлениястрок снимается информация по полю источнику. Затем выполняется проверка наличия данных в кэше. Если данных нет - выполняется их получение с последующей записью в кэш.
146 mikecool
 
17.07.13
16:45
(145) да как бы уже разобрались )))
147 H A D G E H O G s
 
17.07.13
16:46
(145) Я тя помню еще с тех времен, когда бы запрос к ТабличномуПолю делал :-)
148 H A D G E H O G s
 
17.07.13
16:46
бы->ты
149 Aprobator
 
17.07.13
16:47
(147) попрошу без наездов) Все мы были когда то молодыми и глупыми )
150 Ёпрст
 
17.07.13
16:48
(141) тогда точно фигнёй.. всё и так листается на раз, переделай тока на соответствия.
151 Fragster
 
гуру
17.07.13
16:48
(145) да. только вот у тебя 10к номенклатуры и колонка с остатками. ты мотаешь список пэйдждайном. как тебе кэш поможет?
152 mikecool
 
17.07.13
16:49
(150) нихрена не на раз, залипание на вывод почти в секунду
но щас разгребу всю процедуру, возможно половину перенесу в запрос
153 Ёпрст
 
17.07.13
16:49
не думаю, что кого-то порадует, видеть нужные данные с задержкой, только после остановки.
154 Ёпрст
 
17.07.13
16:50
ну кидай свой код в приполучении
155 mikecool
 
17.07.13
16:51
(153) я не думаю, что их радует ждать после каждого нажатия )
как нибудь договоримся о компромиссе ))
(154) еще в процессе, кидать стыдно - он не мой )
156 Fragster
 
гуру
17.07.13
16:51
(153) допустим у тебя идет набор по строке. зачем тебе задержка на показ ненужных данных? а если данные получаются 2 секунды, то задержку в +0.2 ты не заметишь
157 H A D G E H O G s
 
17.07.13
16:51
(153) А мы опционально....
158 H A D G E H O G s
 
17.07.13
16:52
ПВХ
НастройкиПользователей
хватит на всех.
Даром.
И никто не уйдет обиженным.
159 Fragster
 
гуру
17.07.13
16:52
в идеале - чтобы вообще не тормозило - надо еще на фоновые переделать
160 Aprobator
 
17.07.13
16:52
(151) хм - я просто других вариантов не представляю. Либо каждый раз базу дергать, либо данные где то хранить.
161 Fragster
 
гуру
17.07.13
16:53
(160) вот в (0) вариант - дергать данные только когда мы остановили прокрутку списка...
162 mikecool
 
17.07.13
16:53
(160) лучше дергать по таймауту нужные, потому как акуальность их меняется довольно часто
163 Ёпрст
 
17.07.13
16:54
10к влёт кешируются в соответствиях, проверено.
У меня нет вообще обращения к базе при получении данных, тормозов, тоже нет..
164 mikecool
 
17.07.13
16:55
(163) а на создание соответствия времени сколько уходит?
165 Aprobator
 
17.07.13
16:56
(161) одно другому не мешает.
166 Ёпрст
 
17.07.13
16:59
(164)задержка при открытии формы подбора..1-2 секунды..
167 Ёпрст
 
17.07.13
16:59
не так и много
168 Ёпрст
 
17.07.13
16:59
могу видево слепить
169 Aprobator
 
17.07.13
17:00
+(165) идея конечно интересная сама по себе.
170 H A D G E H O G s
 
17.07.13
17:01
(169) Она великолепна.
Как поддерживать кэш в актуальном состоянии?
171 Aprobator
 
17.07.13
17:03
(170) нужен механизм, контролирующий изменения данных с момента последнего залива их в кэш.
172 Aprobator
 
17.07.13
17:05
хотя в случае остатков - кэш то может быть и нефига не оптимальным решением.
173 Ёпрст
 
17.07.13
17:05
(170) да никак не поддерживается, это форма подбора номенклатуры с останками и  кнопкой обновить.
Я забил на "актуальность" останков в "прямом эфире"
174 H A D G E H O G s
 
17.07.13
17:06
(173) Ну вот и все дела.
175 H A D G E H O G s
 
17.07.13
17:07
Когда идет выписка реализаций - остатки будут скакать каждую минуту, нафиг этот ваш кэш.
176 Aprobator
 
17.07.13
17:07
(175) согласен - тут не поспоришь.
177 Ёпрст
 
17.07.13
17:08
(174) на самом деле, при любой продаже получать всегда "актуальные" останки не реально, да и не верно это.
Ну прилетел тебе якобы "реальный остаток" в документ - и далеко не факт, что в момент проведения он еще будет на останках.
178 fisher
 
17.07.13
17:12
<робко> ... а может, сделать этот список на УФ?
179 Aprobator
 
17.07.13
17:13
+(176) хотя если присобачить какое нить оповещение кэша об изменении остатков - хз. Вот только как это реализовать? И где хранить кэш в таком случае?
180 H A D G E H O G s
 
17.07.13
17:13
Попробуйте с данным механизмом ВывестиСписок
181 H A D G E H O G s
 
17.07.13
17:14
Правой кнопкой - Вывести список.
И выберите расчетные колонки.

Бяда.
182 Fragster
 
гуру
17.07.13
17:15
(180) ты о отрисовке с задержкой?
183 H A D G E H O G s
 
17.07.13
17:15
(182) Да
184 Ёпрст
 
17.07.13
17:19
врят ли кто будет печатать это..
185 H A D G E H O G s
 
17.07.13
17:23
Как бы отследить источник вызова ПриПолученииДанных
186 Fragster
 
гуру
17.07.13
17:27
(185) или как вызвать команду "Вывесит список" программно?
187 Леха Дум
 
17.07.13
17:40
А вы УФ с динамическим списком не пробовали использовать?
188 mikecool
 
17.07.13
17:42
(187) уже спрашивали про это
189 mikecool
 
17.07.13
17:42
(184) у меня как раз любители печатать (
190 Ёпрст
 
17.07.13
17:43
забил бы давно болт на это, всё в кеш и привет.
191 Ёпрст
 
17.07.13
17:45
и обновление кеша по кнопке.
192 Леха Дум
 
17.07.13
17:46
(188) и где же ответ на этот вопрос?
193 mikecool
 
17.07.13
17:53
(192) см (181)
194 mikecool
 
17.07.13
17:53
+193 мои пользователи привыкли к отбору, а не к поиску (
и пока я их не буду переучивать, ибо и так туповаты, да скоро новая конфига будет внедряться
195 Леха Дум
 
17.07.13
18:03
(194) у нас тоже привыкшие были, переводил все формы списков на УФ постепенно, когда раскушали - сказали срочно давай еще это, это и это! Не увидел никаких проблем с печатью списка.
196 Полотенчик
 
17.07.13
18:16
А зачем считать ПриПолученииДанных? Почему нельзя сразу в таблицу поместить уже посчитанное?
197 Ёпрст
 
18.07.13
10:33
(194) ну чего, слепил ?
Можешь видево снять, как сейчас форма "ездиет" ?..