Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Странное поведение ТП. (Нашлась причина падения) (число прочтений - 11379 )
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Странное поведение ТП. На рел. 2.5.0.3 + FE #6
Ответ #15 - 23. Октября 2007 :: 09:10
Печать  
kms писал(а) 23. Октября 2007 :: 07:53:
Как это стабильно поймать? Твой пример пока не помогает.

У меня: на старой версии 1С++ при закрытии обработки с ТП ничего не происходит Улыбка
На новой версии: При закрытии формы 1С падает...
Если в новой версии добавить в "ПриЗакрытии()" код "РасшСправочник = 0;", то всё ОК...
Добавил на раборчей конфе Улыбка
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Странное поведение ТП. На рел. 2.5.0.3 + FE #6
Ответ #16 - 22. Ноября 2007 :: 07:22
Печать  
Как говорится, возвращаясь к напечатаному Улыбка
Наконец-то нашел причину падения:
у меня в ТП используется автообновление:
Код
Выбрать все
ТабличноеПоле.ТаймаутОбновления = ПериодАвтоОбновления;
 


и смена фильтров идёт сл. образом:
Код
Выбрать все
ТабличноеПоле.ПоставщикДанных = "";
ТекстЗапроса = ТекстЗапроса();
Источник.УстТекстЗапроса(ТекстЗапроса);
    
Источник.УстКлючПорядка(УточнитьПолеПорядка(ПолеПорядка));

ТабличноеПоле.ПоставщикДанных = Источник;

Источник.УстИдПоле("Документ");
Источник.Обновить(ТекСтрока);  
 


При этом база непрогнозируемо падала Печаль
Затем, на ТП от kms глюка почти не наблюдалось
Потом мне пришлось "утяжелить" запрос.
И падения начались снова.
Потратив неск-ко дней я нашёл причину падения.
Вот этот код работает нормально:
Код
Выбрать все
ПериодАвтоОбновления = ТабличноеПоле.ТаймаутОбновления;
ТабличноеПоле.ТаймаутОбновления = 0;

ТабличноеПоле.ПоставщикДанных = "";
ТекстЗапроса = ТекстЗапроса();
Источник.УстТекстЗапроса(ТекстЗапроса);
    
Источник.УстКлючПорядка(УточнитьПолеПорядка(ПолеПорядка));

ТабличноеПоле.ПоставщикДанных = Источник;

Источник.УстИдПоле("Документ");
Источник.Обновить(ТекСтрока);  

ТабличноеПоле.ТаймаутОбновления = ПериодАвтоОбновления;
 


Причина - ТП пытается обновиться, когда источник="", Либо источник обнуляется в тот момент, когда ТП обновляется. Печаль
Хотя скорее первое, так как при обновлении ТП база "Тормозит" и достучатся до формы нельзя.
Мне кажется, что это скорее баг, чем фича Улыбка
Давайте это запретим на уровне C-кода.

 И ещё:
ТП обновляется даже тогда, когда форма с контролом неактивна, и если запрос достаточно "Тяжёлый", то работая в другой форме наблюдаешь "торможение" базы...

Предлагаю реализовать возможность настройки обновления следующим образом:

 Параметр "АвтоматическоеОбновлениеАктивнойФормы":
1.Не обновлять
2.Только при простое, с заданым интервалом ;
3.Всегда, с заданым интервалом;
 Параметр "АвтоматическоеОбновлениеНеактивнойФормы":
1.Не обновлять, не обновлять строки ТП при активизации формы;
2.Не обновлять, обновить строки ТП при активизации формы;
3.Только при простое, с заданым интервалом ;
4.Всегда, с заданым интервалом;

Интервал устанавливается тем же параметром, что и раньше. Если зад.интервал 0, обновление не происходит

Для обратной совместимости - по умолчанию параметры равны 3 и 4 соответственно.
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Странное поведение ТП. (Нашлась причина падени
Ответ #17 - 22. Ноября 2007 :: 08:30
Печать  
Добавил пост в "Хотелки" - вроде-бы более подходит по теме Улыбка
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Странное поведение ТП. (Нашлась причина падени
Ответ #18 - 22. Ноября 2007 :: 10:05
Печать  
slider26 писал(а) 22. Ноября 2007 :: 08:30:
Добавил пост в "Хотелки" - вроде-бы более подходит по теме Улыбка


Ну решение же простое...
ПриАктивацииОкна
ПриДеактивацииОкна


Отключая-включай автообновление.

P.S. А вообще - расставь индексов/оптимизируй запрос и не будет тормозить
  
Наверх
 
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Странное поведение ТП. (Нашлась причина падени
Ответ #19 - 22. Ноября 2007 :: 10:21
Печать  
Arta писал(а) 22. Ноября 2007 :: 10:05:
Ну решение же простое...
ПриАктивацииОкна
ПриДеактивацииОкна

Отключая-включай автообновление.

Да это понятно Улыбка А если надо обновлять только в режиме простоя, то в обычной Форма.ОбработкаОжидания() написать "ТП.ОбновитьСтроки()".
ИМХО - Много лишней обвязки - удобней бы было этот механизм иметь в классе Улыбка
Кроме того проверка на существование источника тоже была бы не лишней Улыбка

  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Странное поведение ТП. (Нашлась причина падени
Ответ #20 - 22. Ноября 2007 :: 10:27
Печать  
Пока ты писал пост, я уже сделал у себя в базе Улыбка

В перехватчике формы:
ЭлементыУправленияНаФорме - СЗ с активиксами и ТП, всегда хранятся у меня в классе перехватчика.
Код
Выбрать все
Процедура ПриДеактивацииОкна() Экспорт
	Если ПустоеЗначение(ЭлементыУправленияНаФорме) = 0 Тогда
		Информатор = СоздатьОбъект("Информатор");
		Для Индекс = 1 По ЭлементыУправленияНаФорме.РазмерСписка() Цикл
			Элемент = ЭлементыУправленияНаФорме.ПолучитьЗначение(Индекс);
			Если ПустоеЗначение(Элемент) = 0 Тогда
				Если Информатор.МетодСуществует(Элемент, "ПриДеактивацииОкна") = 1 Тогда
					Элемент.ПриДеактивацииОкна();
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры
//***************************************************************
//***************************************************************
Процедура ПриАктивацииОкна() Экспорт
	Если ПустоеЗначение(ЭлементыУправленияНаФорме) = 0 Тогда
		Информатор = СоздатьОбъект("Информатор");
		Для Индекс = 1 По ЭлементыУправленияНаФорме.РазмерСписка() Цикл
			Элемент = ЭлементыУправленияНаФорме.ПолучитьЗначение(Индекс);
			Если ПустоеЗначение(Элемент) = 0 Тогда
				Если Информатор.МетодСуществует(Элемент, "ПриАктивацииОкна") = 1 Тогда
					Элемент.ПриАктивацииОкна();
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры
//***************************************************************
//***************************************************************
 



В классе ТП:
Код
Выбрать все
Перем ТаймаутОбновленияТП;

Процедура ПриДеактивацииОкна() Экспорт
	ТаймаутОбновленияТП = Сам().ТаймаутОбновления;
	Если ТаймаутОбновленияТП > 0 Тогда
		Сам().ТаймаутОбновления = 0
	КонецЕсли;
КонецПроцедуры
//***************************************************************
//***************************************************************
Процедура ПриАктивацииОкна() Экспорт
	Сам().ТаймаутОбновления = ТаймаутОбновленияТП;
КонецПроцедуры
//***************************************************************
//***************************************************************
 




Такой вариант можно запользовать и для других процедур обслуживания ТП при активации и деактивации ТП.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Странное поведение ТП. (Нашлась причина падени
Ответ #21 - 22. Ноября 2007 :: 10:28
Печать  
P.S. Спасибо за мысль  Смех
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать