|
v7: 1С++. Неверный расчет итогов | ☑ | ||
---|---|---|---|---|
0
kissolo
01.10.19
✎
14:53
|
Дано. Справочник материалы. Ему подчинен справочник Партии. Есть документ инвентаризация, который корректирует остатки по Регистру Коробки(Продукт,МестоОбработки,Партия)(Брутто,Нетто,КоличествоКоробок)
В табличной части документа заведены данные (Продукт(справочник.Материалы), Партия(Справочник.Партия), НеттоФакт,БруттоФакт,КолвоКоробокФакт). При проведении считаю остатки по регистру Коробки на момент документа, вычитаю остатки из документа (с учетом партий), остальное приходую со знаком минус. ПРоблема: Если я считаю остатки как итоги по регистру: рег=СоздатьОбъект("регистр.Коробки"); рег.УстановитьЗначениеФильтра("МестоОбработки",МестоОбработки,2); рег.ВременныйРасчет(1); Если СравнитьТА()=-1 тогда РассчитатьРегистрыНа(ТекущийДокумент()); иначе РассчитатьРегистрыНа(ПолучитьПозициюТА()); КонецЕсли; рег.выбратьИтоги(); ну и далее в цикле загружаю их в исходную таблицу, куда изначально выгрузил табличную часть документа.... .. то остатки после проведения правильные. Если же я считаю остатки на момент документа через запрос 1с, или запрос 1с++, определяя при этом позицию момента расчета остатков как Если СравнитьТА() < 1 Тогда //Позиция не больше ТА. Позиция = СформироватьПозициюДокумента(ТекущийДокумент(), -1); Иначе Позиция = ПолучитьПозициюТА(); КонецЕсли; ..то итог проведения документа неверный (остатки по регистру неверные), причем совпадающий (т.е. и по 1с_запрос и по 1с++ - совпадает). Из чего сделал вывод, что неправильно указываю момент, на который надо считать. Считается момент времени расчета итогов по первому варианту, по позиции документа. Что я делаю не так? Вот на всякий случай код текста запроса по 1с++ RS = СоздатьОбъект("ODBCRecordset"); ТекстЗапроса=" |SELECT | РегК.Продукт as [Продукт $Справочник], | РегК.Партия as [Партия $Справочник.Партии], | РегК.НеттоОстаток as НеттоНачОст, | РегК.БруттоОстаток as БруттоНачОст, | РегК.КоличествоКоробокОстаток as КоличествоКоробокНачОст |FROM | $РегистрОстатки.Коробки(:ДатаКонца~,, | МестоОбработки =:ВыбЦФУ, | (Продукт,Партия),(Брутто,Нетто,КоличествоКоробок)) as РегК |"; RS.УстановитьТекстовыйПараметр("ДатаКонца", СформироватьПозициюДокумента(ТекущийДокумент(), -1)); RS.УстановитьТекстовыйПараметр("ВыбЦФУ", МестоОбработки); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
1
Salimbek
01.10.19
✎
15:10
|
(0) А ты понимаешь - что делаешь этим: :ДатаКонца~ ?
|
|||
2
kissolo
01.10.19
✎
15:20
|
(1) Получаю остатки на момент = позиции документа. нет?
|
|||
3
kissolo
01.10.19
✎
15:21
|
(1) Вот текст из описаловки по 1с++
В модуле документа обычно необходимо получить остатки на документ. Делается это так: ТекстЗапроса = “ |SELECT | Рег.Товар as [Товар $Справочник.Номенклатура], | Рег.КоличествоОстаток as Количество, | Рег.СуммаОстаток as Сумма |FROM | $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,, | Склад = :ВыбСклад, | (Товар), (Сумма, Количество)) as Рег"; RS.УстановитьТекстовыйПараметр("ВыбДата", СформироватьПозициюДокумента(ТекущийДокумент(), -1)); |
|||
4
palpetrovich
01.10.19
✎
15:25
|
(2) уже попробовал ДатаКонца без тильды?
|
|||
5
kissolo
01.10.19
✎
15:29
|
(4) давно пробовал. Ошибку выдает:
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); {Документ.ИнвентаризацияКоробок.Модуль Документа(293)}: State 22007, native 241, message [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from character string. |
|||
6
kissolo
01.10.19
✎
15:33
|
(1) ПО идее, тильда говорит, что на конец считаем. Но, т.к. позицию документа получаем на предыдущий момент, то и получается как раз на момент "перед документом". То, что надо.
Это, как я понял этот код. Ну и в описаловке так написано.... Поэтому я не понимаю, где проблема. |
|||
7
leshikkam
01.10.19
✎
15:35
|
RS.УстановитьТекстовыйПараметр("ПозицияДокумента", ТекущийДокумент());
и :ВыбДата~~~~ |
|||
8
palpetrovich
01.10.19
✎
15:53
|
(7) похоже да, позиция другая
по (3) where ra45_vt.date_time_iddoc > '20191001' and ra45_vt.date_time_iddoc < '201910016OYRO01HNEDAЯЯЯ' по (7) where ra45_vt.date_time_iddoc > '20191001' and ra45_vt.date_time_iddoc < '201910016OYRO01HNEDB ' |
|||
9
kissolo
01.10.19
✎
16:04
|
(7) охренеть конструкция.
Но работает!!!! Спасибо! Понять бы еще, что она означает? |
|||
10
palpetrovich
01.10.19
✎
16:10
|
(9) дык, позиция конца другая, см. 8
ну или у себя RS.Отладка(1) нартсуй - посмотри что там внутри |
|||
11
Salimbek
01.10.19
✎
19:58
|
(9) Как я и писал в (1) - ты не до конца понял - как работают модификаторы.
Когда пишешь :ДатаКонца~ - то эта дата превращается в '20191001z' и потому соберет все остатки до конца дня. Подробнее - читать тут: http://www.1cpp.ru/docum/icpp/html/ODBC.html#id42 Потом испытывать в разных вариантах, пока не получится так, как надо ))) И да, контролировать запросы - через RS.Отладка(1) |
|||
12
victuan1
01.10.19
✎
20:01
|
закладка
|
|||
13
kissolo
02.10.19
✎
09:54
|
(11) Спасибо за ссылку!
|
|||
14
kissolo
02.10.19
✎
11:04
|
(11) чет хрень какую-то все равно делают. Буду разбираться с разными вариантами...
|
|||
15
Ёпрст
02.10.19
✎
11:31
|
(14) почитай форму 1cpp, там давно все запросы есть, которые в модулях доков живут и делают правильный расчет на позицию дока
|
|||
16
Ёпрст
02.10.19
✎
11:31
|
*форум
|
|||
17
Salimbek
02.10.19
✎
13:52
|
(14) "Хрень делают" - ну так нет же проблем, скидываешь полученные данные куда-то, и смотришь, на сколько отличаются от нужного, а далее - или ищешь - откуда взялся излишек/недостача, или какой документ ошибочно влез. В частности - может быть у тебя Текущий Документ свои движения в таблицу "докидывает" - и тогда надо брать остатки на позицию "чуть меньше, чем сейчас", а может наоборот, ты формируешь позицию вручную и потому какие-то документы в этой же секунде выпадают из выборки.
Детально - нам отсюда все равно не протелепатировать - чего ты там наваял и в какую сторону изменения вносить. |
|||
18
kissolo
02.10.19
✎
14:56
|
(17) Так я ж и написал в (14) - буду разбираться))))
Всем спасибо за советы, будут новости - напишу) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |