Имя: Пароль:
1C
1С v8
Остатки регистра накопления
,
0 dizpers
 
13.05.12
22:33
Есть РН Счет с измерением Абонет (ссылка на справочник) и реквизитом Сумма (число). Есть документ ПополнитьСчет. У документа следующий обработчик проведения:



Процедура ОбработкаПроведения(Отказ, Режим)
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   // регистр Счет Приход
   Движение = Движения.Счет.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
   Движение.Период = Дата;
   Движение.Сумма = Сумма;
   Движение.Абонент = Абонент;
   
   
   Фильтр = Новый Структура("Абонент", Абонент);
   тзОстатокНаСчете = РегистрыНакопления.Счет.Остатки(ТекущаяДата(), Фильтр);
   Сообщить(тзОстатокНаСчете[0].Сумма);
   
   
   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


При этом каждый раз сообщением он выводит не то что надо. Надо, чтобы он выводил остаток на счете учитывая текущую операцию, а выводит остаток на счете до этой операции. Подскажите, в чем проблема?
1 Grusswelle
 
13.05.12
22:37
(0) Транзакция не завершена потому что.

Сообщить(тзОстатокНаСчете[0].Сумма + Сумма);
2 Feanor
 
13.05.12
22:38
тзОстатокНаСчете = РегистрыНакопления.Счет.Остатки(Новый Граница(ТекущаяДата(), ВидГраницы.Включая), Фильтр);
3 Feanor
 
13.05.12
22:38
(1) точно)
4 dizpers
 
13.05.12
22:47
(2) А что за финт с границей? Это для того, чтобы остатки считались по концу дня?
5 dizpers
 
13.05.12
22:49
(1) Спасибо! А у такого варианта нет проблем, то есть я всегда в таком случае получу остаток на счете, включая последнюю операцию?
6 Grusswelle
 
13.05.12
22:55
(4) Это бред. До завершения транзакции (Процедура ОбработкаПроведения) данных в регистре нет, и никакими границами их оттуда считать невозможно.
(5) Пожалуйста! Да.
7 Feanor
 
13.05.12
23:06
(5) в (1) отличный пример быдлокода)

вот так всё же удачнее:

   Движение = Движения.Счет.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
   Движение.Период = Дата;
   Движение.Сумма = Сумма;
   Движение.Абонент = Абонент;
   
   Движения.Счет.Записать();
   Движения.Счет.Записывать = Ложь;
   
   Фильтр = Новый Структура("Абонент", Абонент);
   тзОстатокНаСчете = РегистрыНакопления.Счет.Остатки(Новый Граница(ТекущаяДата(), ВидГраницы.Включая), Фильтр);
   
   Сообщить(тзОстатокНаСчете[0].Сумма);
8 Лефмихалыч
 
13.05.12
23:07
(7) остатки и так получаются по границу "включая"
9 Grusswelle
 
13.05.12
23:08
(7) Ой, спасибо! :-))
10 Feanor
 
13.05.12
23:08
(8) неправда
11 Лефмихалыч
 
13.05.12
23:13
(10) да, правильно - неправда

РегистрНакопленияМенеджер.<Имя регистра накопления>.Остатки (AccumulationRegisterManager.<Имя регистра накопления>.Balance)
РегистрНакопленияМенеджер.<Имя регистра накопления> (AccumulationRegisterManager.<Имя регистра накопления>)
Остатки (Balance)
Синтаксис:

Остатки(<МоментВремени>, <Отбор>, <Измерения>, <Ресурсы>)
Параметры:

<МоментВремени> (необязательный)

Тип: Дата; МоментВремени; Граница.
Момент времени, на который необходимо получить остатки. Если параметр не указан, то будут получены текущие остатки (на максимальную дату движений регистра). Если в качестве параметра передана Дата, то остатки будут получены на начало дня, если МоментВремени - то в остатках не будут учтены движения регистра, произошедшие в тот же момент времени.
12 dizpers
 
13.05.12
23:31
(7), опробовал твой метод



Процедура ОбработкаПроведения(Отказ, Режим)
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   // регистр Счет Приход
   Движение = Движения.Счет.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
   Движение.Период = Дата;
   Движение.Сумма = Сумма;
   Движение.Абонент = Абонент;
   
   
   Фильтр = Новый Структура("Абонент", Абонент);
   тзОстатокНаСчете = РегистрыНакопления.Счет.Остатки(ТекущаяДата(), Фильтр);
   
   тзОстатокНаСчете = РегистрыНакопления.Счет.Остатки(Новый Граница(ТекущаяДата(), ВидГраницы.Включая), Фильтр);
   
   Сообщить(тзОстатокНаСчете[0].Сумма);

   
   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Все также получаю предыдущее значение остатка на счете. Все-таки (1) верно отметил, что транзакция не завершена - и инфа о новом движении в РН еще не попала.
13 dizpers
 
13.05.12
23:32
Тьфу, не по глазам. Не увидел, что ты там закрыл транзакцию %)
14 Feanor
 
13.05.12
23:32
(13) ничего я там не закрывал :) просто записал движения в регистр
15 dizpers
 
13.05.12
23:34
При использовании (7) ругается, что у Движения.Счет нет поля  Записывать.
16 Feanor
 
13.05.12
23:35
(15) у тебя 8.1 О.о
17 dizpers
 
13.05.12
23:35
(14) а такой вариант действительно лучше, чем (1) ?
18 dizpers
 
13.05.12
23:35
(16) да
19 Feanor
 
13.05.12
23:36
(18) она уже мёртвая давно, ставь 8.2
20 dizpers
 
13.05.12
23:39
(19) А если относительно 8.1 говорить - как можно в ее контексте записать твой вариант?
21 Feanor
 
13.05.12
23:39
(20) тогда печаль - движения дважды будут записываться в БД, что не очень красиво
22 Feanor
 
13.05.12
23:40
(17) к примеру, в случае суммы и абонента в табличной части, такой способ уже будет испытывать неудобства.
23 dizpers
 
13.05.12
23:43
Спасибо за разъяснения, видимо (1) в таком случае лучший выход:)
24 GROOVY
 
14.05.12
00:03
Кто же Вас всех учит остатки объектной моделью получать?
25 dizpers
 
14.05.12
00:11
(24) Научите, как правильно:) Запросом?
26 GROOVY
 
14.05.12
00:15
Конечно запросом. И записывать движения правильнее не обращаясь к конкретному объекту коллекции, а ко всей коллекции "Движения.Записать()". Но это только в 8.2 и выше. Переходите на нормальную платформу.
27 dizpers
 
14.05.12
00:16
Если лучше запросом, то зачем тогда вообще существует метод Остатки у РН?
28 GROOVY
 
14.05.12
00:19
(27) Этот вопрос лучше всего адресовать в фирму 1С.

Метод "Остатки" как и много других порождают неуправляемый запрос к БД.

Нам нужны запросы которыми мы не можем управлять? Нет! => ...
29 GROOVY
 
14.05.12
00:21
Но если честно, то объектная модель для чтения данных осталась для более низкого порога вхождения прогеров переучивающихся с 7.7.
30 dizpers
 
14.05.12
00:32
Интересно:) Тоесть везде где нужно получать информацию надо использовать запрос, и забыть про объектную модель, так?
31 GROOVY
 
14.05.12
00:35
(30) Точно.
32 АцкийЖипер
 
14.05.12
00:36
(29) Скорее не для прогеров, а для быстрого перевода конф с последующим постепенным рефакторингом.
33 GROOVY
 
14.05.12
00:37
(32) Спорить не буду, выразил свое субъективное мнение.
Перевод конф = написанию новых.
2 + 2 = 3.9999999999999999999999999999999...