Имя: Пароль:
1C
1С v8
СправочникСписок тормоза при ИерархическийПросмотр=Ложь
0 zladenuw
 
13.12.12
15:09
Пользователь меняют данную настройку. 1с подвисает. смотрю на процесс. сжирает почти 2 гб.

В процедуре при выводе строки идет обращение к регистру остатков
Само дольше вот тут по процентном соотношение. как можно оптимизировать

Фильтр    = Новый Структура();
       Фильтр.Вставить("Товар", ЗЧ);
       Если Склад.Пустая() = 0 Тогда            
           Фильтр.Вставить("Склад", Склад) ;
       КонецЕсли;
       ТабОст = РегЗЧ.Остатки ( , Фильтр, "Товар", "Кво") ;
       
       
       Ост = ?(ТабОст.Количество() =0,0, ТабОст[0].Кво);        
       ОформлениеСтроки.Ячейки.Ост.ОтображатьТекст = Истина;    
       ОформлениеСтроки.Ячейки.Ост.Текст = ""+  Ост;        

       Если Ост = 0 Тогда
           ОформлениеСтроки.ЦветФона = Новый Цвет(255,238,237);
       КонецЕсли;
1 zladenuw
 
13.12.12
16:29
Перенес в процедуру ПриПолученииДанных.
Но сильного эффекта нету.
Как исправить ситуацию ?
И чем все таки отличается ПриПолученииДанных и ПриВыводеСтроки
2 zladenuw
 
13.12.12
16:35
пробовал запросом, еще дольше.
3 H A D G E H O G s
 
модератор
13.12.12
16:43
(1) Давай, показывай своего друга.
4 zladenuw
 
13.12.12
16:44
Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)
   
   ДанныеСтроки = ОформленияСтрок[0].ДанныеСтроки;
   ОформлениеСтроки = ОформленияСтрок[0];
   
   Если ДанныеСтроки.ЭтоГруппа = 1 Тогда//ИЛИ НЕ ЭлементыФормы.СправочникСписок.ИерархическийПросмотр Тогда
       Возврат;
   КонецЕсли;
   ////
   ЗЧ = ДанныеСтроки.Ссылка;
   ОформлСтрЯчейки = ОформленияСтрок[0].Ячейки;    
   //
   //
   Если ДанныеСтроки.ВидЗч = Перечисления.ВидЗЧ.Услуга Тогда
       
       
       
       ОформлСтрЯчейки.Ост.ОтображатьТекст = Истина;    
       ОформлСтрЯчейки.Резерв.ОтображатьТекст = Истина;            
       ОформлСтрЯчейки.Резерв.Текст = "-";
       ОформлСтрЯчейки.Ост.Текст = "-";        
       ОформлениеСтроки.ЦветТекста = Новый Цвет(255,20,150);
       
       Возврат;
   КонецЕсли;    

   
   
   Если Фл_Цена = 1 Тогда
       ОформлСтрЯчейки.Цена.Текст = обЦенаСтр(ЗЧ, ТипЦены);
       ОформлСтрЯчейки.Цена.ОтображатьТекст = Истина;
   КонецЕсли;
   
       
   //------------------------------------------------------------------------
   
   Если Фл_Остатки = 1 Тогда    
       Фильтр    = Новый Структура();
       Фильтр.Вставить("Товар", ЗЧ);
       Если Склад.Пустая() = 0 Тогда            
           Фильтр.Вставить("Склад", Склад) ;
       КонецЕсли;
       ТабОст = РегЗЧ.Остатки (ТекущаяДата() , Фильтр, "Товар", "Кво") ;
       
       //Ост = ПолучитьТекОстЗЧ(ТекущаяДата(),Фильтр);
       
       
       Ост = ?(ТабОст.Количество() =0,0, ТабОст[0].Кво);        
       ОформлСтрЯчейки.Ост.ОтображатьТекст = Истина;    
       ОформлСтрЯчейки.Ост.Текст = ""+  Ост;        

       Если Ост = 0 Тогда
           ОформлениеСтроки.ЦветФона = Новый Цвет(255,238,237);
       КонецЕсли;
   КонецЕсли;    

   
       //------------------------------------------------------------------------
   
   Если Фл_Резерв = 1 Тогда    
       Фильтр    = Новый Структура() ;
       Фильтр.Вставить("Товар", ЗЧ);
       ТабРез = РегРез.Остатки (, Фильтр, "Товар", "Кво") ;        
       Рез = ?(ТабРез.Количество() =0,0, ТабРез[0].Кво);    
       ОформлСтрЯчейки.Резерв.ОтображатьТекст = Истина;            
       ОформлСтрЯчейки.Резерв.Текст = ""+  Рез;
   КонецЕсли;    
   
   Если Фл_Заказано = 1 Тогда    
       Фильтр    = Новый Структура() ;
       Фильтр.Вставить("Товар", ЗЧ);
       ТабЗак = РегЗак.Остатки (, Фильтр, "Товар", "Кво") ;
       Зак = ?(ТабЗак.Количество() =0,0, ТабЗак[0].Кво);
       
       ОформлСтрЯчейки.Заказано.ОтображатьТекст = Истина;    
       ОформлСтрЯчейки.Заказано.Текст = ""+  Зак;        
   КонецЕсли;    

   //----------------------------------------------------------
   
   Если Фл_Идентификатор = 1 Тогда    
           
       
       Ид = "";
       
       Если ЗЧ.ТипЗЧ.Пустая() = 0 Тогда
           Ид = СтрЗаменить(СОКРЛП(ЗЧ.ТипЗЧ.ПолныйКод()),"/",".");
       Иначе
           Ид = "х.х.х";    
       КонецЕсли;
       
       Если ДанныеСтроки.Родитель.ПроизводительГруппа.Пустая() = 0 Тогда
           Ид = Ид + "." + СОКРЛП(ДанныеСтроки.Родитель.ПроизводительГруппа.Код);
       Иначе
           Ид = Ид + ".х"
       КонецЕсли;
       
       Если Зч.ГруппаНаценки.Пустая() = 0 Тогда
           Ид = Ид + "." + СОКРЛП(Зч.ГруппаНаценки.Код);
       Иначе
           Ид = Ид + ".х"
       КонецЕсли;
       
       Если Зч.ГруппаСкидки.Пустая() = 0 Тогда
           Ид = Ид + "." + СОКРЛП(Зч.ГруппаСкидки.Код);
       Иначе
           Ид = Ид + ".х"
       КонецЕсли;
               
       ОформлСтрЯчейки.Идентификатор.ОтображатьТекст = Истина;    
       ОформлСтрЯчейки.Идентификатор.Текст = ""+  Ид;        
   КонецЕсли;    


   
   

КонецПроцедуры
5 zladenuw
 
13.12.12
16:46
через терминал еще нормально. пробовал локально. сожрало все свободное место на диске С и вылетела ошибкой, что нету места :)
6 H A D G E H O G s
 
13.12.12
16:48
Стена, ядъ.
7 H A D G E H O G s
 
13.12.12
16:48
Ересь какая-то.
8 zladenuw
 
13.12.12
16:50
творение не мое. переписываю. такого кода там валом. ошушение что конвертнули базу с 7 на 8.
9 H A D G E H O G s
 
13.12.12
16:50
В книге знаний есть пример, но где сейчас та книга знаний...
10 zladenuw
 
13.12.12
16:52
(9) а хоть примерно куда копать ?
11 H A D G E H O G s
 
13.12.12
16:53
(10) Обойти 1 раз все ОформленийСтрок, получить массивноменклатур и его то в запрос по остаткам запихивать.
12 H A D G E H O G s
 
13.12.12
16:53
И 2 раз обойти ОформленияСтрок и по результатам запроса вытащить остаток.
13 zladenuw
 
13.12.12
16:54
(11,12) понял. спасибо
14 H A D G E H O G s
 
13.12.12
16:56
ВыводитДанныеСертификатов=ЭлементыФормы.СправочникСписок.Колонки.НомерИДатаСертификата.Видимость;
   ВыводитДанныеОстатков=ЭлементыФормы.СправочникСписок.Колонки.СвободныйОстаток.Видимость и РежимОстатков<>0;
   Если НЕ ВыводитДанныеСертификатов и НЕ ВыводитДанныеОстатков Тогда
       Возврат;
   КонецЕсли;
   СписокСерий=Новый СписокЗначений;
   Для Каждого ЭлементОформления ИЗ ОформленияСтрок Цикл
       СписокСерий.Добавить(ЭлементОформления.ДанныеСтроки.Ссылка);
   КонецЦикла;
   ВыборкаПоСертификатамПуста=НЕ ВыводитДанныеСертификатов;
   Если ВыводитДанныеСертификатов Тогда
       ЗапросПоСертификатам.УстановитьПараметр("СписокСерий",СписокСерий);
       ВыборкаПоСертификатам=ЗапросПоСертификатам.Выполнить().Выбрать();
       ВыборкаПоСертификатамПуста=ВыборкаПоСертификатам.Количество()=0;
   КонецЕсли;
   
   ВыборкаПоОстаткамПуста=НЕ ВыводитДанныеОстатков;
   Если ВыводитДанныеОстатков Тогда
       ЗапросПоОстаткам.УстановитьПараметр("СписокСерий",СписокСерий);
       ВыборкаПоОстаткам=ЗапросПоОстаткам.Выполнить().Выбрать();
       ВыборкаПоОстаткамПуста=ВыборкаПоОстаткам.Количество()=0;
   КонецЕсли;
   Если ВыборкаПоОстаткамПуста и ВыборкаПоСертификатамПуста Тогда
       Возврат;
   КонецЕсли;
   Для Каждого ЭлементОформления ИЗ ОформленияСтрок Цикл
       Если ВыборкаПоСертификатамПуста=Ложь Тогда
           ВыборкаПоСертификатам.Сбросить();
           Если ВыборкаПоСертификатам.НайтиСледующий(ЭлементОформления.ДанныеСтроки.Ссылка,"СерияНоменклатуры") Тогда
               ЭлементОформления.Ячейки.НомерИДатаСертификата.УстановитьТекст(ВыборкаПоСертификатам.НомерСертификата + " от " + ВыборкаПоСертификатам.ДатаСертификата);
           Иначе
               ЭлементОформления.Ячейки.НомерИДатаСертификата.УстановитьТекст("");
           КонецЕсли;
       КонецЕсли;
       Если ВыборкаПоОстаткамПуста=Ложь Тогда
           ВыборкаПоОстаткам.Сбросить();
           Если ВыборкаПоОстаткам.НайтиСледующий(ЭлементОформления.ДанныеСтроки.Ссылка,"СерияНоменклатуры") Тогда
               ЭлементОформления.Ячейки.СвободныйОстаток.УстановитьТекст(ВыборкаПоОстаткам.СвободныйОстаток);
           Иначе
               ЭлементОформления.Ячейки.СвободныйОстаток.УстановитьТекст("0");
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
15 H A D G E H O G s
 
13.12.12
16:57
и сам запрос


       ЗапросПоОстаткам=Новый Запрос;
       ЗапросПоОстаткам.Текст=
       "ВЫБРАТЬ РАЗРЕШЕННЫЕ
       |    СвободныеОстаткиОстатки.СерияНоменклатуры,
       |    СвободныеОстаткиОстатки.КоличествоОстаток КАК СвободныйОстаток
       |ИЗ
       |    РегистрНакопления.СвободныеОстатки.Остатки(
       |            &Дата,
       |            Номенклатура = &Номенклатура
       |                И ВЫБОР
       |                    КОГДА &СкладПуст = ИСТИНА
       |                        ТОГДА ИСТИНА
       |                    ИНАЧЕ Склад = &Склад
       |                КОНЕЦ
       |                И СерияНоменклатуры В (&СписокСерий)) КАК СвободныеОстаткиОстатки";
16 zladenuw
 
15.12.12
23:38
Тормоза все ровно остались. запускал локально раз 10. 2 раза вылетело что не хватает памяти. в чем может быть причина.
Так же выделяется дополнительная память, а и иногда нет. сам процесс 1с сьедал до 2 гб. сейчас же не больше 200 мб.
субд и сервер(Постгрес) на линуксе.
17 mistеr
 
16.12.12
03:14
>при выводе строки идет обращение к регистру остатков

Это 5.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший