Имя: Пароль:
1C
 
Подскажите почему в 8.2 МоментВремени() в запросе работает криво?
0 hidden1C
 
08.09.10
20:09
Проблема в том что передаю МоментВремени как параметр в следующем коде
Процедура ОбработкаПроведения(Отказ, Режим)
   
   Запрос = Новый Запрос;
   
   Запрос.Текст = "ВЫБРАТЬ
                  |    РегистрНакопления1Остатки.Ресурс1Остаток
                  |ИЗ
                  |    РегистрНакопления.РегистрНакопления1.Остатки(&МоментВремени, ) КАК РегистрНакопления1Остатки";
   Запрос.УстановитьПараметр("МоментВремени",МоментВремени());
   
   Результат = Запрос.Выполнить();
   
   Выборка = Результат.Выбрать();
   ВыборкаДанных=Выборка.Следующий();
   
   Движения.РегистрНакопления1.Записывать = Истина;
   Движение = Движения.РегистрНакопления1.Добавить();
   Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
   Движение.Период = Дата;
   Движение.Ресурс1 = Реквизит1;

КонецПроцедуры

Данные выбираются из регистра остатков с учетом текущего документа, в 8.1 все нормально выбирается проверил. Это Баг или так задумано?
1 smitru
 
08.09.10
20:38
(0) (задумчиво) так если я не ошибаюсь, то МоментВремени это "не дата", а Дата + ссылка (гуид)

Т.е. остатки обязательно должны быть ограничены не только по дате, но и гуидом соответствующего регистратора.

разве не так?

ЗЫ..

МоментВремени - Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методов других объектов, имеющих тип МоментВремени.
Момент времени используется в тех случаях, когда важно различать моменты времени для объектов, имеющих одинаковую дату и время, например для сравнения положений документов на временной оси.
2 Adept
 
08.09.10
20:40
(0) юзай границу
3 Snovy
 
08.09.10
20:48
(1) + Необходимо учитывать, что ссылка на объект данных в момент времени содержит ранний по времени реального добавления в конфигурацию объекта. Например, если физически в конфу раньше был добавлен документ № 1, а физически позже  документ № 2, то Момент времени на дату 31.12.2010 23.59.59 из документа № 2 получит движения документа № 1, а наоборот - нет. Если Вы попытаетесь в документе № 1 получить остатки на момент времени 31.12.2010 23.59.59, то у Вас не будет в результате запроса движений документа № 2 с датой 31.12.2010 23.59.59.
4 Мохнатое рыло
 
08.09.10
21:11
(2)+1
5 Snovy
 
08.09.10
21:15
Я всех программистов в регламентах заставляю использовать КонецДня(дата документа)+1 - в случае получения результата из остатков. Результат известен в отличие от моментов времени и границ. В дыух последних случаях результат запроса абсолютно недостоверен...
6 Andry888
 
08.09.10
21:22
(5) Не надо, в границе все известно... а момент для того и служит, что бы расположить на оси времени доки, даже если дата у них одинакова...
7 Fragster
 
гуру
08.09.10
21:24
(5) плохо
(2)+1. а если в запросе - то стандартные периоды рулят
8 Fragster
 
гуру
08.09.10
21:25
* в запросе = в СКД
9 Kenguru
 
08.09.10
22:19
(0) В 8.2 по умолчанию у документов свойство "Удаление движений" выставляется значение "Удалять автоматически при отмене проведения". А в 8.1 было просто "Удалять движения автоматически".
То есть в 8.2 движения автоматически удаляются только при отмене проведения, а при перепроведении документа остаются. Поэтому МоментВремени в запросе их и учитывает.
Если в 8.1 поставить для "Удаление движений" "Не удалять движения автоматически", то при перепроведении движения этого документа также попадут в запрос на МоментВремени документа.
10 Manaka
 
08.09.10
23:00
(0) Такое возникает при оперативном проведении. Документ проводится оперативно тогда, когда: 1. В метаданных документа в свойстве "Оперативное проведение" указано "Разрешить". 2. Дата документа равна текущей дате. 3. В свойстве формы "ИспользоватьРежимПроведения" не указано "Неоперативный". Если документ перепроводится оперативно и в свойстве формы "АвтоВремя" стоит значение "Текущее или последним", то при каждом последующем перепроведении время документа меняется на большее значение. Соответственно текущий момент времени, который мы получаем методом МоментВремени() стоит позже, чем при предыдущем проведении, а движения созданы именно в прошлый момент времени и они попадут в выборку. Если вам не нужно, чтобы в выборке были движения этого документа, то необходимо перед запросом их очистить: Движения.РегистрНакопления1.Очистить();
11 Manaka
 
08.09.10
23:06
Аналогично происходит, если мы перепроводим документ с увеличением Даты (времени).
12 Amiralnar
 
09.09.10
05:08
(9) +1

(10) Не путайте опративную отметку и момент времени. Вы даете неверную информацию.
13 saaken
 
09.09.10
08:02
двоечник ты Snovy (3), и программисты от тебя вешаются (5)
14 Manaka
 
09.09.10
10:05
(12) Если передать в параметр Период виртуальной таблицы остатков МоментВремени(), то в выборку не попадут движения на этот момент времени. Только если мы проводим оперативно или вручную увеличиваем время перепроводимого документа, текущее положение МоментаВремени оказывается позже, чем при прошлом проведении, поэтому в выборку движения документа попадут, т.к. у них еще старый момент времени.
15 Kenguru
 
09.09.10
12:11
(14) Мы оба правы, но частично.

При передаче МоментаВремени в качестве параметра в таблицу остатков платформа по умолчанию выбирает данные начало этого момента времени, не включая движения самого документа (как, если бы указать вместо момента времени Граница(МоментВремени(), ВидГраницы.Исключая) ).
При оперативном  (пере)проведении МоментВремени документа сдвигается и движения этого документа попадают в результат запроса !! Но только, если они НЕ удалились автоматически при перепроведении. Если движения удаляются автоматически, то при оперативном проведении в запросе их не будет.
Вот результаты небольшого эксперимента в 8.1 на основе текста программы в (0), только для МоментВремени установлена Граница с видом Включая или Исключая:
1.  Для документа установлено "Удалять движения автоматически"
а. ВидГраницы.Исключая
- Неоперативное проведение - > движения документа не попадают в результат (Нет)
- Оперативное проведение - > Нет
б. ВидГраницы.Включая
- Неоперативное проведение - > Нет
- Оперативное проведение - > Нет
2.  Для документа установлено "Не удалять движения автоматически"
а. ВидГраницы.Исключая
- Неоперативное проведение - > Нет
- Оперативное проведение - > движения документа попадают в результат (Да)
б. ВидГраницы.Включая
- Неоперативное проведение - > Да
- Оперативное проведение - > Да
В 8.2, если для документа установлено "Удалять автоматически при отмене проведения", думаю, что результат при проведении будет такой же, как в 8.1 для "Не удалять движения автоматически".
16 gavlexx
 
10.09.10
02:44
(15) Вы абсолютно правы.
Только от себя лишь добавлю, что в 8.2:
1) По умолчанию режим удаления движений установлен в "Удалять автоматически при отмене проведения"
2) При оперативном перепроведении документа режим по умолчанию установлен такой, что платформа не спрашивает а сама автоматически меняет время на текущее.

В результате (2) как раз и получается, что в запрос попадает момент времени более поздний, чем существующие движения документа, поэтому движения документа учитываются.
Рекомендуемый выход: для таких регистров, по которым берутся остатки, если режим проведения оперативный, перед проведением очищать набор записей и записывать(!) их в ИБ. Только после этого можно рассчитывать остатки и гарантировать, что существующие движения документа не будут на них влиять.