Имя: Пароль:
1C
1C 7.7
v7: Тормозит справочник в ЗиК
0 matizov
 
31.10.12
11:44
Здравствуйте!
С недавних пор начал тормозить справочник "сотрудники" в 1С ЗиК 7.7. Базы с 2008 года. SQL. С чем это может быть связано?
1 Ёпрст
 
31.10.12
11:45
с периодикой
2 matizov
 
31.10.12
11:46
с какой периодикой?
3 Ёпрст
 
31.10.12
11:47
которая отображается в форме списка справочника.
4 matizov
 
31.10.12
11:48
и как это исправить?
5 Ёпрст
 
31.10.12
11:49
убери колонку состояние, заместо неё - текст на форму с формулой Состояние, чтоб показ был только у текущего сотрудника.
Будет летать
6 Ёпрст
 
31.10.12
11:50
ну или, кешируй периодику перед открытием формы списка справочника..
7 matizov
 
31.10.12
11:57
ок. попробую.
8 matizov
 
31.10.12
12:17
может скажешь где найти информацию про кэширование?
9 Ёпрст
 
31.10.12
12:20
А че там знать то ?
Скидываешь в табличку все значения, потом в формуле списка справочника читаешь с этой таблички.
10 Gucci76
 
31.10.12
12:53
А еще лучше в ДБФ формат переводи базу и терминальный режим.
Плюс парочку манипуляций в конфигураторе и ваще все будет летать (раз в 10 быстрее, чем сейчас) ))))
11 matizov
 
31.10.12
13:20
Кэширование не помогло. на DBF работает хорошо, а на SQL нет. так же тормозит.
12 Ёпрст
 
31.10.12
13:24
(11) высчисляемые колонки то выкинул с формы списка справочника ?
13 matizov
 
31.10.12
13:45
Я в эту функцию закинул кэширование. а состояние сотрудника и так идет как текст с формулой.
14 Bizon2005
 
31.10.12
13:47
15 Ёпрст
 
31.10.12
13:48
(13) покажи код тогда, что сделал
16 Ёпрст
 
31.10.12
13:48
(14) выкинь регистрацию со своего сайта - люди мот и потянутся
17 matizov
 
31.10.12
13:50
//+маер
   стр = 0;
   Если глКэшПечатныхФорм.НайтиЗначение(ТекущийЭлемент(),стр,"Сотрудник") = 1 Тогда
       Для Ном = 1 По глКэшПечатныхФорм.КоличествоСтрок() Цикл
           глКэшПечатныхФорм.ПолучитьСтрокуПоНомеру(Ном);
           Если (ТекущийЭлемент() = глКэшПечатныхФорм.Сотрудник) Тогда
               Значение = глКэшПечатныхФорм.СостояниеФизлица;
               Возврат Значение;
           КонецЕсли;
       КонецЦикла;
   Иначе    
   //-маер
       
       Если (ПустоеЗначение(ТекущийЭлемент())=1)или(ЭтоГруппа()=1) Тогда
           Возврат ""
       КонецЕсли;
       ДатаПриема = Дата(0);
       ДатаУвольнения = Дата(0);
       ДатаАктуальности = ИспользоватьДату();
       Периодический.ИспользоватьОбъект("СостояниеФизлица",ТекущийЭлемент());
       СостояниеФЗ = Периодический.ЗначениеНаДату(ДатаАктуальности);
       Если ПустоеЗначение(СостояниеФЗ)=0 Тогда
           Если Периодический.НайтиЗначение(ДатаАктуальности,-1)=1 Тогда
               ДатаПриема = Периодический.ДатаЗнач
           КонецЕсли;
           Если Периодический.НайтиЗначение(ДатаАктуальности+1,1)=1 Тогда
               ДатаУвольнения = Периодический.ДатаЗнач-1
           КонецЕсли;
           Если ТекущийЭлемент().ОсновнойЭлемент<>ТекущийЭлемент() Тогда
               ОписаниеСостояния = "Внутреннее совместительство";
               Если СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботает Тогда
                   ОписаниеСостояния = "Внутреннее совмест-во, временно не работает";
               ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботаетВоеннослужащий Тогда
                   ОписаниеСостояния = "Внутреннее совмест-во, военнослужащий, временно не работает";            
               КонецЕсли;
           ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.СотрудникОсновной Тогда
               ОписаниеСостояния = "Штатный сотрудник";
           ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.СотрудникНеосновной Тогда
               ОписаниеСостояния = "Внешний совместитель";
           ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.Госслужащий Тогда
               Если Константа.ЕстьМуниципальныеСлужащие = 1 Тогда
                   ОписаниеСостояния = "Муниципальный служащий";
               Иначе
                   ОписаниеСостояния = "Государственный служащий";    
               КонецЕсли;
               
           ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботает Тогда
               ОписаниеСостояния = "Временно не работает";
           ИначеЕсли СостояниеФЗ=Перечисление.СостояниеФизлица.ВременноНеРаботаетВоеннослужащий Тогда
               ОписаниеСостояния = "Военнослужащий временно не работает";            
           Иначе
               ОписаниеСостояния = "Военнослужащий";
           КонецЕсли;  
           
           //+маер
           //Возврат ОписаниеСостояния+" с "+ДатаПриема+?(ПустоеЗначение(ДатаУвольнения)=1,""," по "+ДатаУвольнения)
           Значение = ОписаниеСостояния+" с "+ДатаПриема+?(ПустоеЗначение(ДатаУвольнения)=1,""," по "+ДатаУвольнения);  
           
           глКэшПечатныхФорм.НоваяСтрока();
           глКэшПечатныхФорм.Сотрудник = ТекущийЭлемент();
           глКэшПечатныхФорм.СостояниеФизлица = Значение;
           
           Возврат Значение;
           //-маер  
           
       Иначе
           Периодический.ОбратныйПорядок();
           Периодический.ВыбратьЗначения(,ДатаАктуальности);
           Пока Периодический.ПолучитьЗначение()=1 Цикл
               Если ПустоеЗначение(Периодический.Значение)=1 Тогда
                   //+маер
                   Если глВидРасчетаДействует(ОсновнойЭлемент,,ДатаАктуальности,ДатаАктуальности)=1 Тогда
                       Значение = "Физическое лицо, получающее доход на предприятии (договорник)";
                       глКэшПечатныхФорм.НоваяСтрока();
                       глКэшПечатныхФорм.Сотрудник = ТекущийЭлемент();
                       глКэшПечатныхФорм.СостояниеФизлица = Значение;
                       Возврат Значение;
                   Иначе
                       Значение = "Сотрудник уволен "+(Периодический.ДатаЗнач-1);                        
                       глКэшПечатныхФорм.НоваяСтрока();
                       глКэшПечатныхФорм.Сотрудник = ТекущийЭлемент();
                       глКэшПечатныхФорм.СостояниеФизлица = Значение;
                       Возврат Значение;
                   КонецЕсли;
                   //Возврат "Сотрудник уволен "+(Периодический.ДатаЗнач-1)
                   //-маер    
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
       Если ОсновнойЭлемент=ТекущийЭлемент() Тогда
           Если глВидРасчетаДействует(ОсновнойЭлемент,,ДатаАктуальности,ДатаАктуальности)=1 Тогда
               //+маер
               Значение = "Физическое лицо, получающее доход на предприятии (договорник)";
               глКэшПечатныхФорм.НоваяСтрока();
               глКэшПечатныхФорм.Сотрудник = ТекущийЭлемент();
               глКэшПечатныхФорм.СостояниеФизлица = Значение;
               Возврат Значение;
               //-маер
           Иначе
               //+маер
               Значение = "Физическое лицо";
               глКэшПечатныхФорм.НоваяСтрока();
               глКэшПечатныхФорм.Сотрудник = ТекущийЭлемент();
               глКэшПечатныхФорм.СостояниеФизлица = Значение;
               Возврат Значение;
               //-маер
           КонецЕсли;
       Иначе
           //+маер
           Значение = "Не принят на внутреннее совместительство";
           глКэшПечатныхФорм.НоваяСтрока();
           глКэшПечатныхФорм.Сотрудник = ТекущийЭлемент();
           глКэшПечатныхФорм.СостояниеФизлица = Значение;
           Возврат Значение;
           //-маер
       КонецЕсли;
   КонецЕсли;    //-маер
18 matizov
 
31.10.12
13:51
глКэшПечатныхФорм = СоздатьОбъект("ТаблицаЗначений");
глКэшПечатныхФорм.НоваяКолонка("Сотрудник","Справочник.Сотрудники");
глКэшПечатныхФорм.НоваяКолонка("СостояниеФизлица","Строка");
19 matizov
 
31.10.12
13:51
Перем глКэшПечатныхФорм; //маер
20 Ёпрст
 
31.10.12
13:53
(17) Это же полный п..ц
21 matizov
 
31.10.12
13:54
почему?
22 Ёпрст
 
31.10.12
13:57
(21)
А не видно разве ?

стр = 0;
Если глКэшПечатныхФорм.НайтиЗначение(ТекущийЭлемент(),стр,"Сотрудник") = 1 Тогда
   Возврат глКэшПечатныхФорм.ПолучитьЗначение(стр,"СостояниеФизлица");
Иначе
23 Ёпрст
 
31.10.12
13:57
стр = 0;
Если глКэшПечатныхФорм.НайтиЗначение(ТекущийЭлемент(),стр,"Сотрудник") = 1 Тогда
   Возврат глКэшПечатныхФорм.ПолучитьЗначение(стр,"СостояниеФизлица");
КонецЕсли;
24 matizov
 
31.10.12
13:59
http://infostart.ru/public/64424/
Взял отсюда.
25 Ёпрст
 
31.10.12
14:03
(24) чего ты оттуда взял ?
%))
26 Gucci76
 
31.10.12
14:04
Лучше через список значение
27 matizov
 
31.10.12
14:05
Если глКэшПечатныхФорм.НайтиЗначение(ВидОбъекта,стр,"ВидДокумента") = 1 Тогда
       Для Ном = 1 По глКэшПечатныхФорм.КоличествоСтрок() Цикл
           глКэшПечатныхФорм.ПолучитьСтрокуПоНомеру(Ном);
           Если (ВидОбъекта = глКэшПечатныхФорм.ВидДокумента) И (глКэшПечатныхФорм.Название <> "") Тогда
               ТаблицаПечФорм.НоваяСтрока();
               ТаблицаПечФорм.Название     = глКэшПечатныхФорм.Название;
               ТаблицаПечФорм.Кнопка       = глКэшПечатныхФорм.Кнопка;
               ТаблицаПечФорм.Файл         = глКэшПечатныхФорм.Файл;
               ТаблицаПечФорм.ФайлОписания = глКэшПечатныхФорм.ФайлОписания;
           КонецЕсли;
       КонецЦикла;
   Иначе
28 Ёпрст
 
31.10.12
14:08
(27) да уж..
29 matizov
 
31.10.12
14:09
смысл остается тот же. попробую сейчас снова.
30 Ёпрст
 
31.10.12
14:10
(29) см. (23).
И не бери гамно код откуда не поподя.
31 dedmoroz777
 
31.10.12
14:12
(29) смысл в том, что в глобальнике в ПриНачалеРаботыСистемы, заполнять таблицу значений данными. В форме справочника доставать из этой таблицы путём (23)
32 IvaneS
 
31.10.12
16:06
А если поменяет рабочую дату, то нужно пересмотреть весь кеш... :) Сколько сотров то в базе?
33 IvaneS
 
31.10.12
16:09
Наверно юзают базу через локалку, а там изменилась пропускная способность. (Вариант?)
34 Bizon2005
 
01.11.12
12:04
похожая тема, напиши если разобрался
http://ask.8c1.ru/questions/31/тормозит-справочник-сотрудников-в-зик