Имя: Пароль:
1C
1С v8
как найти модуль где зависает 1с
,
0 mihalich979
 
08.07.19
10:14
Приветствую.

Есть база 1С КА 2.4

неудачно обновили, и теперь при проведении документа "Списание безналичных ДС" зависает намертво.
спасает только сбросить сеанс пользователя.

причем документ сохраняется без проблем. Но вот проведение.
1 Cyberhawk
 
08.07.19
10:15
F11
2 Cyberhawk
 
08.07.19
10:15
ТЖ
3 piter3
 
08.07.19
10:17
замер может быть
4 bolobol
 
08.07.19
10:18
Пауза
5 mihalich979
 
08.07.19
10:24
(4) По паузе

заходит в процедуру в обдем модуля Оперативные взаиморасчетыСервер:

Если ПланыОплат.Количество() > 0 Тогда
        
        ПланыОплат.Свернуть("Регистратор, ДокументПлан ,ВариантОплаты, Период, ДатаВозникновения, ДатаПлановогоПогашения, ПорядокОперации, ПорядокЗачетаПоДатеПлатежа, ХозяйственнаяОперация, ПриходДобавлен","КОплате, Оплачено");
        ПланыОплат.Сортировать("ПорядокОперации ВОЗР, ПорядокЗачетаПоДатеПлатежа ВОЗР");
        счПриход = 0;
        счРасход = 0;
        РаспределеноСтрок = 0;
        Пока счПриход < ПланыОплат.Количество() ИЛИ счРасход < ПланыОплат.Количество() Цикл
            
            Если счРасход > ПланыОплат.Количество()-1 Тогда
                Если РаспределеноСтрок = 0 Тогда
                    Прервать;
                Иначе
                    РаспределеноСтрок = 0;
                КонецЕсли;
                счПриход = счПриход + 1;
                счРасход = 0;
            КонецЕсли;
            
            Если счПриход > ПланыОплат.Количество()-1 Тогда
                Прервать;
            КонецЕсли;
            
            Если ПланыОплат[счПриход].КОплате = 0 Тогда
                счПриход = счПриход + 1;
                Продолжить;
            КонецЕсли;
            
            Если ПланыОплат[счРасход].Оплачено = 0 Тогда
                счРасход = счРасход + 1;
                Продолжить;
            КонецЕсли;
            
            Если ПланыОплат[счПриход].КОплате > 0 И ПланыОплат[счРасход].Оплачено > 0 Тогда
                
                РаспределеноСтрок = РаспределеноСтрок + 1;
                
                //Приход по плану и расход по плану
                Если ПланыОплат[счПриход].ПорядокОперации < ПланыОплат[счРасход].ПорядокОперации
                    И ПланыОплат[счПриход].Регистратор = ПланыОплат[счРасход].ДокументПлан Тогда
                    
                    СуммаСписания = Мин(ПланыОплат[счПриход].КОплате, ПланыОплат[счРасход].Оплачено);
                    
                    ПроверитьДобавитьПриходПланаОплат(ТаблицаПланОплат, ПланыОплат[счПриход], ГлобальныеПеременные.ХозяйственныеОперации["Планирование"], СуммаСписания);
                    ДобавитьРасходПланаОплат(ТаблицаПланОплат, ПланыОплат[счПриход], ПланыОплат[счРасход], СуммаСписания);
                    
                    ПланыОплат[счПриход].КОплате = ПланыОплат[счПриход].КОплате - СуммаСписания;
                    ПланыОплат[счРасход].Оплачено = ПланыОплат[счРасход].Оплачено - СуммаСписания;
                ИначеЕсли счРасход + 1 < ПланыОплат.Количество() Тогда
                    счРасход = счРасход + 1;
                Иначе
                    счРасход = 0;
                    счПриход = счПриход + 1;
                КонецЕсли;
            КонецЕсли;
            
            Если ПланыОплат[счПриход].КОплате = 0 Тогда
                счПриход = счПриход + 1;
                счРасход = 0;
            ИначеЕсли ПланыОплат[счРасход].Оплачено = 0 Тогда
                счРасход = счРасход + 1;
            КонецЕсли;
            
        КонецЦикла;

ну и соответственно бесконечный цикл:
Пока счПриход < ПланыОплат.Количество() ИЛИ счРасход < ПланыОплат.Количество() Цикл

т.к.
счРасход  = 3
ПланыОплат.Количество() = 5

и в процедуре никак оба значение не меняются.
6 bolobol
 
08.07.19
10:31
Очевидно, что не выполняются все условия из заложенных, значит, что существует Н+1 состояние, в котором у вас и находится система. Определите его, и, возможно, найдётся либо ошибка в исходных данных, либо в коде.
7 bolobol
 
08.07.19
10:33
С учётом "неудачно обновили" - это значит, что не все регламентированные процедуры обновления выполнились или конфига покривела?
Сравните конфигу в интересующей части с типовой, обновите кеш сервера.
8 mihalich979
 
08.07.19
10:42
(7) Про неудачно обновили это лишь мое предположение.

я не обновлял, не видел что и как.
Вприципе в данном модуле не думаю что были введены изменения.

Регламентные процедуры обновления попробую еще раз запустить.


(6) это как определить?
9 novichok79
 
08.07.19
10:56
замер производительности?
10 mihalich979
 
08.07.19
11:12
(9) а что он дает ?

ниразу не использовал.

сделал. и что дальше?

98% строка
ДанныеОНепроведенныхДокументах = ОбщегоНазначенияВызовСервера.ПровестиДокументы(МассивСсылок);
11 johnnik
 
08.07.19
11:21
Наверное дурацкий способ, но в 7.7 я в таких случаях ставил строку "Сообщить("любой текст");" и как минимум понимал, до какого места код отрабатывает нормально. Если в цикле проблема возникала (табличная часть и т.п.), то сообщал не голый текст, а строку цикла. Подобным методом тыка находил проблемный кусок и дальше было легче

Был уверен, что 99% 1С-ников так делает :)
12 sqr4
 
08.07.19
11:23
Взаиморасчеты онлайн скорее всего всему виной, делай офф
13 mihalich979
 
08.07.19
11:32
(11) так ведь определил  где зацикливание.

модули со старой конфой сравнил. нет изменений.
14 novichok79
 
08.07.19
11:35
(10) если у тебя в цикле виснет, значит замер не поможет. по поводу того, что у тебя 98% уходит на проведение, так это понятно - запись в БД - одна из самых затратных.
15 novichok79
 
08.07.19
11:36
(13) тогда ищи откуда у тебя там такие данные, раз код не отрабатывает эту ситуацию.
16 hhhh
 
08.07.19
11:39
(11) сообщить теперь не катит. На сервере все сообщения складываются в буфер и выдаются все скопом в самом конце.
17 mihalich979
 
08.07.19
11:45
(15) создал идентичный документ.

не проводится тоже.
18 VorHel
 
08.07.19
11:54
В типовом релизе не обрабатывается ситуация, когда в регистре накопления РасчетыСПоставщикамиПланОплат по какой-либо причине появляются отрицательные остатки. В результате в ОперативныеВзаиморасчеты.ЗаполнитьОперативныеВзаиморасчеты() получаются бесконечные циклы в двух местах.

Я обошла это так:

                                               //Если ПланыОплат[счПриход].КОплате = 0 Тогда
                                               Если ПланыОплат[счПриход].КОплате <= 0 Тогда

На этот счет я написала письмо в 1С.
19 bolobol
 
08.07.19
12:17
Вах! Это наверняка было не просто определить!
20 mihalich979
 
08.07.19
16:18
(18) остаток реально отрицательный.
21 mihalich979
 
08.07.19
16:21
буду сейчас пробовать условие менять.
22 mihalich979
 
08.07.19
16:50
(18) в копии все получилось!

спасибо!!

просто для сравнения:

я в от в этом месте поменял (дважды одинаково встречется)
а вы?

Если ПланыОплат[счПриход].КОплате <= 0 Тогда
  счПриход = счПриход + 1;
  счРасход = 0;
ИначеЕсли ПланыОплат[счРасход].Оплачено = 0 Тогда
  счРасход = счРасход + 1;
КонецЕсли;