Имя: Пароль:
1C
1С v8
Подписка на событие при изменении регистра бухгалтерии.
,
0 Kelleron
 
23.05.16
17:29
Добрый день. БП 3.0. Сделал подписку на событие при записи в регистр бухгалтерии, чтобы делались записи по взаиморасчетам с контрагентами в добавленный регистр. Запись в регистр происходит через раз. Провели док, делающий движения в регистр бухгалтерии первый раз - проводки в новый регистр записались. Перепровели - проводки исчезли. Если отменить проведение и провести - отрабатывает. Привожу код общего модуля:

Процедура АТБ_ЗаписатьВзаиморасчётыСКонтрагентамиВРегистр(Источник, Отказ) Экспорт
УстановитьПривилегированныйРежим(Истина);
РегистрыНакопления.АТБ_ВзаиморасчетыСКонтрагентами.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Источник.Отбор.Регистратор.Значение);
    ВзаиморасчетыСКонтрагентами.Записывать = Истина;
    Для Каждого стр из Источник Цикл
        Если стр.СчетДт = ПланыСчетов.Хозрасчетный.РасчетыСРозничнымиПокупателями Тогда            
            Движение = Набор.Добавить();
            Движение.ВидДвижения=ВидДвиженияНакопления.Приход;
            Движение.Регистратор = Источник.Отбор.Регистратор.Значение;
            Движение.Контрагент = Источник.Отбор.Регистратор.Значение.Контрагент;
            Движение.Договор = Источник.Отбор.Регистратор.Значение.ДоговорКонтрагента;        
            Движение.Сумма = стр.Сумма;
            Движение.Период = стр.Период;
        ИначеЕсли стр.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСРозничнымиПокупателями Тогда
            Движение = Набор.Добавить();
            Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
            Движение.Регистратор = Источник.Отбор.Регистратор.Значение;
            Движение.Контрагент = Источник.Отбор.Регистратор.Значение.Контрагент;
            Движение.Договор = Источник.Отбор.Регистратор.Значение.ДоговорКонтрагента;        
            Движение.Сумма = стр.Сумма;
            Движение.Период = стр.Период;    
        КонецЕсли;
    КонецЦикла;
    Набор.Записать(Истина);
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Помогите, пожалуйста, уже не знаю куда копать.
1 Лефмихалыч
 
23.05.16
17:32
ты внутри подписки ПриЗаписи записываешь тот же набор, на котрый подписка выполняется?
2 aleks_default
 
23.05.16
18:01
РегистрыНакопления.АТБ_ВзаиморасчетыСКонтрагентами.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Источник.Отбор.Регистратор.Значение);
    ВзаиморасчетыСКонтрагентами.Записывать = Истина;

Это что за хрень?
3 Kelleron
 
24.05.16
07:50
(1) Подписка выполняется на событие ПриЗаписи регистра бухгалтерии. То есть, когда проводки записываются в РБ, я пишу свои проводки в свой регистр.
4 Kelleron
 
24.05.16
07:51
(2) Без отбора ошибка- "не установлен отбор по регистратору"
5 alle68
 
24.05.16
07:57
(4) Интересует, в 1-й и 3-й строке один и тот же регистр?
6 Defender aka LINN
 
24.05.16
07:58
(4) Подозреваю, что вопрос все же в том - кто такой "Набор" и откуда взялся. Ну и кто такой "ВзаиморасчетыСКонтрагентами" тоже. И на кой ему ставить флаг "Записывать", если ты не в обработке проведения
7 Kelleron
 
24.05.16
08:15
(5) Да, один и тот же, Простите, я сплю.
Вот нормальный код
УстановитьПривилегированныйРежим(Истина);
Набор = РегистрыНакопления.АТБ_ВзаиморасчетыСКонтрагентами.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Источник.Отбор.Регистратор.Значение);
    АТБ_ВзаиморасчетыСКонтрагентами.Записывать = Истина;
    Для Каждого стр из Источник Цикл
        Если стр.СчетДт = ПланыСчетов.Хозрасчетный.РасчетыСРозничнымиПокупателями Тогда            
            Движение = Набор.Добавить();
            Движение.ВидДвижения=ВидДвиженияНакопления.Приход;
            Движение.Регистратор = Источник.Отбор.Регистратор.Значение;
            Движение.Контрагент = Источник.Отбор.Регистратор.Значение.Контрагент;
            Движение.Договор = Источник.Отбор.Регистратор.Значение.ДоговорКонтрагента;        
            Движение.Сумма = стр.Сумма;
            Движение.Период = стр.Период;
        ИначеЕсли стр.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСРозничнымиПокупателями Тогда
            Движение = Набор.Добавить();
            Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
            Движение.Регистратор = Источник.Отбор.Регистратор.Значение;
            Движение.Контрагент = Источник.Отбор.Регистратор.Значение.Контрагент;
            Движение.Договор = Источник.Отбор.Регистратор.Значение.ДоговорКонтрагента;        
            Движение.Сумма = стр.Сумма;
            Движение.Период = стр.Период;    
        КонецЕсли;
    КонецЦикла;
    Набор.Записать(Истина);
    УстановитьПривилегированныйРежим(Ложь);
8 Лефмихалыч
 
24.05.16
08:31
(0) >Провели первый раз - проводки в новый регистр записались. Перепровели - проводки исчезли. Если отменить и провести - отрабатывает.

а подписка-то эта вызывается в тех случаях, когда новые движения не делаются?
9 Kelleron
 
24.05.16
08:52
(8) Судя по всему нет, если проводки через раз пишутся. Как отловить это событие?
10 aleks_default
 
24.05.16
09:07
(7) все равно это не рабочий код
вот это все же что за хрень
АТБ_ВзаиморасчетыСКонтрагентами.Записывать = Истина;

и у набора записей нет такого события "При изменении"
11 Kelleron
 
24.05.16
10:03
(10) Так вешаю на событие ПриЗаписи а не на ПриИзменении
РегистрыНакопления.АТБ_ВзаиморасчетыСКонтрагентами.Записывать = Истина;
Снова извиняюсь.
12 xxTANATORxx
 
24.05.16
10:07
смотри отладчиком когда и в каком случае вызывается
13 hhhh
 
24.05.16
10:08
(11) ну это  

РегистрыНакопления.АТБ_ВзаиморасчетыСКонтрагентами.Записывать = Истина;  зачем пишешь? выкинь
14 Kelleron
 
24.05.16
10:26
(13) Даже если это выкинуть - отрабатывает абсолютно также.
15 Kelleron
 
24.05.16
10:26
(12) Не помогает отладчик.
16 hhhh
 
24.05.16
10:32
(15) ну так напиши

АТБ_ВзаиморасчетыСКонтрагентами.Записывать = Ложь;

тебе же жизненно важно, чтобы там была ложь.
17 Kelleron
 
24.05.16
11:39
Заработало, правда по-другому пришлось сделать, через оппу.