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