|   |   | 
| 
 | Остатки регистра накопления | ☑ | ||
|---|---|---|---|---|
| 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) Спорить не буду, выразил свое субъективное мнение. 
  Перевод конф = написанию новых. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |