Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Переполнение стека встроенного языка на сервере 1С

Переполнение стека встроенного языка на сервере 1С
Я
   lite777
 
26.10.20 - 09:00
Добрый день, 1с Розница, создал подписку на событие ,Источник РегистрНакопленияНаборЗаписей.Продажи, Событие-ПриЗаписи , обработчик в общем модуле-,
цель заполнить созданный самостоятельно реквизит Регистра продажи-КОНТРАГЕНТ,при изменение РГ продажи ,
в частности при проведении чека выдает такую ошибку--"Переполнение стека встроенного языка на сервере"


Процедура РГПродажиПриЗаписи(Источник, Отказ, Замещение) Экспорт
                
        Для Каждого ТекДвижение Из  Источник Цикл
            
            ТекДвижение.Контрагент=ТекДвижение.Регистратор.Клиент ;
        
            
        КонецЦикла;
        Источник.Записать() ;

КонецПроцедуры
   Волшебник
 
1 - 26.10.20 - 09:02
При изменении идёт запись объекта Источник, в нём вызывается РГПродажиПриЗаписи, в которой вызывается Источник.Записать()...

бесконечная рекурсия
   ДенисЧ
 
2 - 26.10.20 - 09:03
А ты сам прикинь..
Ты записываешь источник, ака набор записей регистра. При это срабатывает подписка при записи. В которой ты записываешь источник. При это срабатывает подписка при записи...
Продолжать? )))
Белые люди (BLdM) такие финты делают в ПередЗаписью
   Конструктор1С
 
3 - 26.10.20 - 09:11
(0) в этом коде ужасно всё. Это надо умудриться, чтобы на четыре строки кода сделать три грубые ошибки
   lite777
 
4 - 26.10.20 - 09:32
(3) Где три ?Не умничай
   lodger
 
5 - 26.10.20 - 09:35
(4)
первая ошыбка Источник.Записать() ;
вторая ТекДвижение.Регистратор.Клиент ;
третья размещение "ТекДвижение.Регистратор.Клиент ;" в цикле.
   lodger
 
6 - 26.10.20 - 09:35
я так вижу (с)
   ДенисЧ
 
7 - 26.10.20 - 09:36
(5) 2 и 3 - пофиг. После первого обращения уже в кеше всё. Да и, скорее всего, регистратор в этот момент уже в кеше.
   lite777
 
8 - 26.10.20 - 09:40
Прямо разнесли в пух и прах)
   lodger
 
9 - 26.10.20 - 09:47
(7) это когда регистратор переменная. а когда регистратор это реквизит тикающей переменной (пускай даже один и тот же), платформа может и не оптимизировать гуанокод.
   lite777
 
10 - 26.10.20 - 09:52
А как надо сделать то в итоге ?
   H A D G E H O G s
 
11 - 26.10.20 - 09:56
Еще и в ПриЗаписи.
Нифига он не запишет.
   H A D G E H O G s
 
12 - 26.10.20 - 09:57
Именно поэтому автор попробовал Записать()

На шару.
   H A D G E H O G s
 
13 - 26.10.20 - 09:57
Используйте ПередЗаписью()
   lodger
 
14 - 26.10.20 - 09:58
(10) перевесь подписку на ПередЗаписью.

в начале процедура из отбора или первой записи достань регистратор.
проверь тип регистратора на нужный
получи из регистратора Клиент.

а дальше как было.
   SleepyHead
 
15 - 26.10.20 - 10:02
(10) а нафига ты вообще источник перезаписываешь?
   lite777
 
16 - 26.10.20 - 10:13
Процедура РГПродажиПриЗаписи(Источник, Отказ, Замещение) Экспорт
    
    
    Для Каждого ТекДвижение Из  Источник Цикл

            
            ТекДвижение.Контрагент=ТекДвижение.ДокументПродажи.Клиент ;
            


        КонецЦикла;


    
    
КонецПроцедуры
   lite777
 
17 - 26.10.20 - 10:13
так вроде идет
   ДенисЧ
 
18 - 26.10.20 - 10:16
(17) неправильно. У тебя не попадёт результат
В (14) написано праувильно
   lite777
 
19 - 26.10.20 - 10:19
(18) в РГ продажи котрагент залетает норм
   lite777
 
20 - 26.10.20 - 10:47
Спасибо! Всем
   Конструктор1С
 
21 - 27.10.20 - 10:33
(4) ошибки:
1. Вместо ПриЗаписи нужно было использовать ПередЗаписью. При входе в обработчик ПриЗаписи объект уже записан в БД
2. Источник.Записать() приводит к повторной записи, это твоя бесконечная рекурсия
3. ТекДвижение.Регистратор.Клиент считывает документ со всеми табличные частами и сохраняет его в КЭШе, совершенно лишнее дёрганье данных. Правильнее получить эти данные один раз и затем подставлять
есть ещё пара моментов, до которых можно было бы докапаться. Но пока что хватит


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.