Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Получение остатков (число прочтений - 3716 )
Riman
YaBB Newbies
*
Отсутствует



Сообщений: 11
Зарегистрирован: 26. Августа 2008
Пол: Мужской
Получение остатков
01. Сентября 2008 :: 10:45
Печать  
Всем привет!

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

Код
Выбрать все
MDW = СоздатьОбъект("MetaDataWork");  
...
РазобратьПозициюДокумента(Док.ПолучитьПозицию(),ДД,ЧЧ,ММ,СС);
ПозОст = MDW.ПолучитьДатуВремяИдДок(СформироватьПозициюДокумента(ДД,ЧЧ,ММ,СС,1));
...
ТекстЗапроса = "
	|SELECT
	|	РегТМЦ.ТМЦ as [ТМЦ $Справочник.Номенклатура],
	|	РегТМЦ.Склад as [Склад $Справочник.Склады],
	|	РегТМЦ.Партия as [Партия $Документ],
	|	РегТМЦ.КоличествоОстаток as Количество,
	|	РегТМЦ.СуммаМатОстаток as СуммаМат,
	|	РегТМЦ.СуммаЗПОстаток as СуммаЗП,
	|	РегТМЦ.СуммаНепрямОстаток as СуммаНепрям,
	|	РегТМЦ.СуммаАмортОстаток as СуммаАморт
	|FROM
	|	$РегистрОстатки.ТМЦ(:ПозОст,,,
	|	(ТМЦ,Склад,Партия),(Количество,СуммаМат,СуммаЗП,СуммаНепрям,СуммаАморт)) as РегТМЦ
	|";
 


а тем более
Код
Выбрать все
...
ПозОст = );
...
 



не помогает.

Второй метод определения позиции документа, как по мне, вообще нельзя использовать в прямых запросах.
Вот результат использования :
Код
Выбрать все
Док.ПолучитьПозицию() = "#20080801 863990000    378762CEN"
MDW.ПолучитьДатуВремяИдДок(Док.ПолучитьПозицию()) = "20080801EAEAY8"
....
СформироватьПозициюДокумента(Док.ПолучитьПозицию(),1) = "#20080801 863990000    378762CEN¹"
) = "20080801EAEAY8"
 


Как видим позиция документа, которая передается в запрос  - одна и та же.

Первый же метод формирует позицию смещенную относительно первой на 10-4 с, но он при этом в расчет остатка попадут те документы, которые имеют одинаковое время с нужным нам документом  Смущённый.

Кроме этого заметил, что все документы расположены на оси времени с точностью до секунды, когда есть возможность располагать их с точностью до 10-4 с .

Анализируя данную проблему пришел к выводам:

    [1] Необходимо каким-то образом разносить документы во времени (В моем случае только можно делать один раз, когда закрывается период, так как редактируются документы задним числом).
    [2] При записи нового документа каким-то образом проставлять время с точностью до 10-4 с. Тогда считаю, что вероятность того, что будут в системе документы с одинаковым временем - резко снизится.
    [3] Возможно стандартными методами получать позицию следующего документа и передавать ее в запрос. Но как по мне, если можно получать остатки на начало с помощью прямого запроса, то почему бы его не использовать для получения остатков и на конец расчетного периода.
    [4] Использование модификатора возможно только в случае, когда передаваемая позиция дата, а не конкретная позиция документа.


Хотелось бы услышать мнения, комментарии, а возможно и решения к описанной проблеме.


  

Сделал дело - гуляй смело!
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Получение остатков
Ответ #1 - 02. Сентября 2008 :: 00:40
Печать  
С модификаторами тоже моно:
...
where Журнал.date_time_iddoc <= :ВыбДокумент~~~~
....
RS.УстановитьТекстовыйПараметр("ВыбДокумент", ТекущийДокумент());
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Riman
YaBB Newbies
*
Отсутствует



Сообщений: 11
Зарегистрирован: 26. Августа 2008
Пол: Мужской
Re: Получение остатков
Ответ #2 - 03. Сентября 2008 :: 09:37
Печать  
Вадимко писал(а) 02. Сентября 2008 :: 00:40:
С модификаторами тоже моно:
...
where Журнал.date_time_iddoc <= :ВыбДокумент~~~~
....
RS.УстановитьТекстовыйПараметр("ВыбДокумент", ТекущийДокумент());


Спасибо за подсказку с модификатором для позиции документа.

Но все же с помощью ВТ $РегистрОстатки нельзя получить остатки на конец документа, передавая позицию этого документа.

Может я конечно ошибаюсь, но проанализировавши в QA текст запроса получил :

Если передавать позицию документа, которая ближе к началу месяца - остатки формируются как RG + RA (без движений переданного документа). Если же позиция ближе к концу месяца тогда RG - RA (здесь отнимаются движения переданного документа) и как результат остаток на начало документа.

Значит прийдется передавать позицию следующего документа для расчета остатка на конец документа (аналог КонОст ) Улыбка.

Может я конечно мало еще знаю о всех возможностях 1с++, но все же может есть какая-то недокументированная фича, которая позволяет получить с помощью ВТ $РегистрОстатки аналог КонОст, в случае передачи позиции документа ? Улыбка

  

Сделал дело - гуляй смело!
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Получение остатков
Ответ #3 - 04. Сентября 2008 :: 05:20
Печать  
Код
Выбрать все
Зпр.УстановитьТекстовыйПараметр("ВыбДок", СформироватьПозициюДокумента(Конт.ТекущийДокумент(), -1)); 


здесь для параметра ВыбДок время выбирается на начало документа

Код
Выбрать все
Зпр.УстановитьТекстовыйПараметр("ВыбДок", СформироватьПозициюДокумента(Конт.ТекущийДокумент(), 1)); 



... ну а здесь - на конец документа
  
Наверх
 
IP записан
 
Riman
YaBB Newbies
*
Отсутствует



Сообщений: 11
Зарегистрирован: 26. Августа 2008
Пол: Мужской
Re: Получение остатков
Ответ #4 - 04. Сентября 2008 :: 12:11
Печать  
sml писал(а) 04. Сентября 2008 :: 05:20:
Код
Выбрать все
Зпр.УстановитьТекстовыйПараметр("ВыбДок", СформироватьПозициюДокумента(Конт.ТекущийДокумент(), -1)); 


здесь для параметра ВыбДок время выбирается на начало документа

Код
Выбрать все
Зпр.УстановитьТекстовыйПараметр("ВыбДок", СформироватьПозициюДокумента(Конт.ТекущийДокумент(), 1)); 



... ну а здесь - на конец документа


Ну зачем сбивать людей с толку?!!

Такие, имхо, неправильные ответы как раз и засоряют форум, в результате чего найти правильное решение становится просто невозможным!!!  Злой


  

Сделал дело - гуляй смело!
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получение остатков
Ответ #5 - 04. Сентября 2008 :: 14:00
Печать  
Riman писал(а) 04. Сентября 2008 :: 12:11:
Ну зачем сбивать людей с толку?!!

Такие, имхо, неправильные ответы как раз и засоряют форум, в результате чего найти правильное решение становится просто невозможным!!!  Злой

Одно лишь то, что ты не понимаешь ответа, не означает, что он неправильный.  Круглые глаза

P.S. В реализации ПолучитьДатуВремяИдДок действительно есть ошибка, но из этого никак не следует, что в прямых запросах нельзя использовать позиции документов.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Riman
YaBB Newbies
*
Отсутствует



Сообщений: 11
Зарегистрирован: 26. Августа 2008
Пол: Мужской
Re: Получение остатков
Ответ #6 - 05. Сентября 2008 :: 07:48
Печать  
berezdetsky писал(а) 04. Сентября 2008 :: 14:00:
Одно лишь то, что ты не понимаешь ответа, не означает, что он неправильный.  Круглые глаза

Может и погорячился. Но ответ реально не понял. В первом посте была описана проблема, причем при прямой передаче позиции документа СформироватьПозициюДокумента(Конт.ТекущийДокумент()) в запрос у меня вываливалась ошибка! После приведения к нужному формату через ПолучитьДатуВремяИдДок - ошибка не появлялась.

berezdetsky писал(а) 04. Сентября 2008 :: 14:00:
P.S. В реализации ПолучитьДатуВремяИдДок действительно есть ошибка...


Если не трудно раскажите плз в чем ошибка заключается ?

berezdetsky писал(а) 04. Сентября 2008 :: 14:00:
...но из этого никак не следует, что в прямых запросах нельзя использовать позиции документов.

Что же касается формирования позици со смещением СформироватьПозициюДокумента(Конт.ТекущийДокумент(),1) или
СформироватьПозициюДокумента(Конт.ТекущийДокумент(),-1) и использования ПолучитьДатуВремяИдДок, то при использовании УРБД считаю, что методы СформироватьПозициюДокумента(Конт.ТекущийДокумент(),1) или
СформироватьПозициюДокумента(Конт.ТекущийДокумент(),-1) вообще использовать нельзя, так как идентификаторы баз данных задаются "от фонаря", а формат результата СформироватьПозициюДокумента()  - обыкновенная строка и правила для сравнения -  обычные. Поэтому считаю - что необходимо сравнивать временные характеристики- тоесть разбирать позицию вручную. Из серии :
Код
Выбрать все
Функция СформироватьСледующуюПозициюДокумента(ПозДок)
	ВремяДок = Число(Сред(ПозДок,10,9));
	Возврат СтрЗаменить(ПозДок,СокрЛП(ВремяДок),СокрЛП(ВремяДок + 1));
КонецФункции// СформироватьСледующуюПозициюДокумента(ПозДок)
 





  

Сделал дело - гуляй смело!
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получение остатков
Ответ #7 - 05. Сентября 2008 :: 10:20
Печать  
Riman писал(а) 05. Сентября 2008 :: 07:48:
Может и погорячился. Но ответ реально не понял. В первом посте была описана проблема, причем при прямой передаче позиции документа СформироватьПозициюДокумента(Конт.ТекущийДокумент()) в запрос у меня вываливалась ошибка! После приведения к нужному формату через ПолучитьДатуВремяИдДок - ошибка не появлялась.

При передаче строки с позицией используй первый модификатор строки. Метод ПолучитьДатуВремяИдДок в твоём случае не нужен.

Riman писал(а) 05. Сентября 2008 :: 07:48:
berezdetsky писал(а) 04. Сентября 2008 :: 14:00:
P.S. В реализации ПолучитьДатуВремяИдДок действительно есть ошибка...


Если не трудно раскажите плз в чем ошибка заключается ?

В том, что если в коде ИБ (у тебя = "CEN") нет пробелов, ПолучитьДатуВремяИдДок возвращает строку без идентификатора документа. Для исправления там, в соответствующем месте, нужно заменить строку
Код
Выбрать все
while(lastpos != -1) 

на
Код
Выбрать все
while(NumPart <= 2) 

.

Riman писал(а) 05. Сентября 2008 :: 07:48:
Что же касается формирования позици со смещением СформироватьПозициюДокумента(Конт.ТекущийДокумент(),1) или
СформироватьПозициюДокумента(Конт.ТекущийДокумент(),-1) и использования ПолучитьДатуВремяИдДок, то при использовании УРБД считаю, что методы СформироватьПозициюДокумента(Конт.ТекущийДокумент(),1) или
СформироватьПозициюДокумента(Конт.ТекущийДокумент(),-1) вообще использовать нельзя, так как идентификаторы баз данных задаются "от фонаря", а формат результата СформироватьПозициюДокумента()  - обыкновенная строка и правила для сравнения -  обычные. Поэтому считаю - что необходимо сравнивать временные характеристики- тоесть разбирать позицию вручную.

Может, оно и выглядит, как "от фонаря", однако, работает правильно.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Riman
YaBB Newbies
*
Отсутствует



Сообщений: 11
Зарегистрирован: 26. Августа 2008
Пол: Мужской
Re: Получение остатков
Ответ #8 - 05. Сентября 2008 :: 13:01
Печать  
Спасибо berezdetsky, за ликбез!!!  Улыбка
Все заработало и без метода ПолучитьДатуВремяИдДок.

З.Ы. Искренне извиняюсь перед sml, за свое поведение.
  

Сделал дело - гуляй смело!
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать