Имя: Пароль:
1C
1C 7.7
v7: Непонятки с регистрами
0 DCKiller
 
13.07.11
06:30
Ситуация следующая: есть регистр "Долги" с измерениями "Клиент" и "КредДокумент", по которому делают движения 2 документа (увеличение и уменьшение долга соответственно).Приход - увеличение, расход - уменьшение. В КредДокумент записывается, соответственно, документ, сформировавший движение в плюч или в минус. Если идет переплата, то документ уменьшения долга формирует движение прихода с указанием в кредДокумент себя любимого.
Проблема в следующем: если имеет место переплата, то ее нужно гасить следующим документом увеличения долга. Поэтому для получения остатков по клиенту в процедуре проведения документов предусмотрено обращение к итогам регистра.

ВремРегистры = СоздатьОбъект("Регистры");
   Если ИтогиАктуальны() = 0 Тогда
       ВремРегистры.Актуальность(1);
       ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());
   КонецЕсли;
   
   Оплачено = Сумма;
   ЗаписаноДвижений = 1;
   ВремДолги = ВремРегистры.Долги;
   ВремДолги.УстановитьЗначениеФильтра("Клиент", Клиент, 1);
   ВремДолги.ВыбратьИтоги();
   Пока ВремДолги.ПолучитьИтог() = 1 Цикл
//погашение сумм авансов...
КонецЦикла;

По идее, итоги должны рассчитываться на позицию ТОЛЬКО следующего после оплаты документа. Однако, если имелась переплата по данному клиенту, и введена она документом оплаты, скажем, от 13.07.11, (т.е. остаток имеется на 13.07.11), а ты заходишь в 12.07.11 и перепроводишь по этому же клиенту документ увеличения долга, то он этот будущий остаток ВИДИТ! В чем проблема? Смотрел как сделано в типовой, вроде все так же. Где что я упустил? Как сделать, чтобы док видел остатки только на свою позицию и не залезал вперед? Пробовал убрать метод Актуальность(), но результат тот же самый.
1 zak555
 
13.07.11
06:34
> В КредДокумент записывается, соответственно, документ, сформировавший движение в плюч или в минус.

с этого момента по-подробнее
2 DCKiller
 
13.07.11
06:36
(1) Что поподробнее?
По сути, ситуация в том, что регистры всегда рассчитываются не на позицию конкретного документа, а на точку актуальности. Вот ее и надо исправить.
3 zak555
 
13.07.11
06:36
переплата делается так в типовой :

КредитДок = ДокОтгрузки | СуммаОтгрузки
КредитДок = ДокОплаты   | СуммаОпалы - СуммаОтгрузки
4 Андрей_Андреич
 
naïve
13.07.11
06:38
ВремРегистры = СоздатьОбъект("Регистры");
   ВремДолги = ВремРегистры.Долги; // АНик
   ВремДолги.УстановитьЗначениеФильтра("Клиент", Клиент, 1); // АНик
   Если ИтогиАктуальны() = 0 Тогда
ВремДолги.ВременныйРасчет(); // АНик
       ВремРегистры.Актуальность(1);
       ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());
   КонецЕсли;
   
   Оплачено = Сумма;
   ЗаписаноДвижений = 1;
//АНик    ВремДолги = ВремРегистры.Долги;
//АНик    ВремДолги.УстановитьЗначениеФильтра("Клиент", Клиент, 1);
   ВремДолги.ВыбратьИтоги();
   Пока ВремДолги.ПолучитьИтог() = 1 Цикл
//погашение сумм авансов...

КонецЦикла
5 DCKiller
 
13.07.11
06:42
(4) Во, точно! Спасибо.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой