![]() |
|
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) Во, точно! Спасибо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |