Имя: Пароль:
1C
 
Как 1С хранит итоги в регистре остатков
0 РЕК
 
21.09.09
11:32
Всем, здравствуйте!
Пишу прямой запрос, к регистру остатков...
Не могу понять где 1С хранит остатки за предыдущий месяц. На начало следующего или того же самого, предыдущего?
Например сейчас 21.09.09(сентябрь!), а надо получить остаток на произвольную дату, например на 10.08.09(август!).
Как это сделать? Вроде бы, логично было бы получить остаток на 01.08, а потом движения с 01.08 по 10.08.
Но здесь http://www.script-coding.info/v77tables.html#3.4.2.1.1. пишут по другому, почему так - не пойму.
Получение итогов и остатков на произвольную дату.
Вот выдержка:

Поскольку итоги в нашем примере хранятся только на конец месяца или ТА, то необходимо выполнить 2 запроса, первый – для получения итога на начало периода (из примера 1), второй – для получения оборотов (из примера 2).
SELECT
   TMP.Товар As Товар,
   SUM(TMP.НачОст) As НачОст,
   SUM(TMP.Приход) As Приход,
   SUM(TMP.Расход) As Расход,
   SUM(TMP.НачОст + TMP.Приход - TMP.Расход) As КонОст
FROM
   (
   SELECT
       TabRegOst.SP20 As Товар,
       TabRegOst.SP21 As НачОст,
       0 As Приход,
       0 As Расход
   FROM
       RG13 As TabRegOst
   WHERE
       TabRegOst.PERIOD = @PERIODR
   UNION ALL
   SELECT
       TabReg.SP20 As Товар,
       0 As НачОст,
       (TabReg.SP21*((DEBKRED+1)%2)) As Приход,
       (TabReg.SP21*DEBKRED) As Расход
   FROM
       RA13 As TabReg
   INNER JOIN _1SJOURN As TabJ
       ON (TabReg.IDDOC = TabJ.IDDOC)
   WHERE
       TabJ.DATE_TIME_IDDOC >= @PERIODN
       AND TabJ.DATE_TIME_IDDOC <= @PERIODK
   ) As TMP
GROUP BY
   TMP.Товар
ORDER BY
   TMP.Товар

!!!!!!!!
где @PERIODR – переменная типа DateTime, условие по которой служит для получения результата запроса на период, меньший на 1 от рассчитываемого. В нашем случае для получения остатка на 20.02.2006 этой переменной необходимо присвоить значения начала января, т.е. «01.01.2006» (так как в случае условия на 01.02.2006 получим остаток или на конец февраля, или на точку актуальности)
!!!!!!!!
Помогите разобраться, пожалуйста!
1 ТелепатБот
 
гуру
21.09.09
11:32
2 Ёпрст
 
гуру
21.09.09
11:34
итоги хранятся на начало даты периодичности хранения остатков.. всё собственно.
3 РЕК
 
21.09.09
11:35
(2)То есть за август итоги можно получить, если указать дату 01.08.09 ?
4 Ёпрст
 
гуру
21.09.09
11:36
(3) да.
5 Ёпрст
 
гуру
21.09.09
11:37
+4 если периодичность - месяц.
6 Mikeware
 
21.09.09
11:37
Так что непонятно?
вроде все русским по-белому....
7 Mikeware
 
21.09.09
11:38
(3) не "за август", а "на конец августа" (либо, если ТА в августе - то на ТА)
8 dk
 
21.09.09
11:38
(0) а зачем тебе прямые запросы, ставь 1с++ или ToySQL
9 РЕК
 
21.09.09
11:42
(7)"на конец августа" храниться в начале августа?  запутано как то:) (6)я думал, что итоги за предыдущий месяц храняться на начало следующего. То есть на конец августа - 01.09(!).09. Так вроде бы логичнее))
(2,4)Понял, спасибо!
(8)С помощью 1С++ и пишу прямой запрос
10 ДенисЧ
 
21.09.09
11:42
(9) А если 1с++ используешь, то бери виртуальную таблицу и не парься...
11 dk
 
21.09.09
11:43
(9) извращенец )))
(10) +1
12 РЕК
 
21.09.09
11:43
(10)С виртуальной как раз и разбираюсь
13 Ёпрст
 
гуру
21.09.09
11:43
(9) вот смотри, наглядное пособие..писал одному дятлу, почему у него регистр "не закрывается"... слева - "не закрытый" регистр, справа - "нормальный"...
http://s55.radikal.ru/i147/0907/fc/0d1be61a68c2.jpg
14 ДенисЧ
 
21.09.09
11:43
(12) А зачем тебе тогда знать, как что хранится?
15 РЕК
 
21.09.09
11:44
+(12)В виртуальной немного лишнего есть
16 РЕК
 
21.09.09
11:45
я в сообщение вывел, то что выбирается для виртуальной и с этим пытаюсь разобраться
17 Mikeware
 
21.09.09
11:45
(8) Знания лишними не бывают.
Зная структуру хранения, тем же 1с++ пользуешься осознанно...
18 РЕК
 
21.09.09
11:46
мне например в результирующую выводить приходы и расходы не надо, а ВТ выводит
19 РЕК
 
21.09.09
11:46
и данные нужны по 1му измерению,а не по всем
20 РЕК
 
21.09.09
11:46
(13)спасибо, счас гляну!
21 dk
 
21.09.09
11:47
(17) угу есть у меня в конфе процентов 80 "осознанных" отчетов на прямых запросах.
Меня просто бесит, если их исправлять приходится.
22 ДенисЧ
 
21.09.09
11:47
(18) Кто выводит? РегистрОстатки() выводит?
23 Mikeware
 
21.09.09
11:47
(15) В виртуальных не то, что "немного лишнего" - там много чего не хватает.
24 Sadovnikov
 
21.09.09
11:48
(21) Дык изучи структруру данных и перестанет тебя это бесить моментально.
25 РЕК
 
21.09.09
11:48
(22)РегистрОстатки() не подходит потому что условие по документу надо вставить
26 РЕК
 
21.09.09
11:48
потому приходиться брать РегистрОстаткиОбороты()
27 ДенисЧ
 
21.09.09
11:49
(25) Остаток по документу движения?
28 РЕК
 
21.09.09
11:50
(27)По некоторым документам, нужно получить приход в результирующую выборку
29 РЕК
 
21.09.09
11:50
могу просто текст запроса сбросить
30 Злопчинский
 
21.09.09
11:51
(13) Епрст! а можно готовый отчетик поиметь для заюзанья? а то надысь как раз аналогичная задачка встала...
?????
31 РЕК
 
21.09.09
11:51
ТекстЗапросаSQL = "
       |SELECT
       |regOst_vt.Товар AS [Товар $Справочник.Товары],
       |regOst_vt.Док AS [Док $Документ.Приходная] ,
       |cast(regOst_vt.ДатаДок AS datetime) AS ДатаДок,
       |sum(regOst_vt.БазоваяСтоимостьОстаток) + sum(regOst_vt.БазоваяСтоимостьПриход) - sum(regOst_vt.БазоваяСтоимостьРасход) AS БазСто1,
       |sum(regOst_vt.ВалютнаяСтоимостьОстаток) + sum(regOst_vt.ВалютнаяСтоимостьПриход) - sum(regOst_vt.ВалютнаяСтоимостьРасход) AS ВалСто1,
       |ОстатокТовараПриход =
       |CASE
       |WHEN <УсловиеВидаДокумента> THEN sum(regOst_vt.ОстатокТовараПриход)
       |ELSE 0
       |END,
       |sum(regOst_vt.ОстатокТовараОстаток) + sum(regOst_vt.ОстатокТовараПриход) - sum(regOst_vt.ОстатокТовараРасход)  AS КонКол
       |FROM(
       |--Виртуальная таблица, полученая в результате склеивания таблицы итогов и оборотов--
       |--- Выборка из таблицы движений--
       |SELECT
       |ra99_vt.sp101 AS Товар,
       |ra99_vt.iddoc AS Док,
       |LEFT(j99_vt.date_time_iddoc,8) AS ДатаДок,
       |j99_vt.iddocdef AS ВидДокум,
       |$doc.ПризнакНакладной AS ПризнакНакладной,
       |--ra99_vt.sp100 AS Склад,
       |ra99_vt.sp4226 AS ТипОстатка,
       |ra99_vt.sp163 * ((ra99_vt.debkred+1)%2) As БазоваяСтоимостьПриход,
       |ra99_vt.sp163 * ra99_vt.debkred As БазоваяСтоимостьРасход,
       |0 AS БазоваяСтоимостьОстаток,
       |ra99_vt.sp164 * ((ra99_vt.debkred+1)%2) As ВалютнаяСтоимостьПриход,
       |ra99_vt.sp164 * ra99_vt.debkred As ВалютнаяСтоимостьРасход,
       |0 AS ВалютнаяСтоимостьОстаток,
       |ra99_vt.sp102 * ((ra99_vt.debkred+1)%2) As ОстатокТовараПриход,
       |ra99_vt.sp102 * ra99_vt.debkred As ОстатокТовараРасход,
       |0 AS ОстатокТовараОстаток
       |FROM ra99 AS ra99_vt (NOLOCK)
       |INNER JOIN _1sjourn AS j99_vt (NOLOCK) ON j99_vt.iddoc = ra99_vt.iddoc
       |--лефт джоин - только документам, которые есть в журнале, будут искаться соответствия в таблице шапки
       |LEFT JOIN $Документ.Приходная AS doc (NOLOCK) on j99_vt.iddoc = doc.iddoc
       |WHERE
       |(LEFT(j99_vt.date_time_iddoc,8) BETWEEN :ДатаНач AND :Дата2~)
       |AND j99_vt.rf99 = 0x1
       |"+?(ВыбТовар.Выбран()=1,"AND ra99_vt.sp101 IN (:ВыбТовар)","")+"
       |"+?(ВыбСклад.Выбран()=1," AND ra99_vt.sp100 IN (:ВыбСклад) ","")+"
       |---
       |
       |UNION ALL
       |
       |---Выборка из таблицы итогов--
       |---можно опустить, т.к. все итоги расчитываются в из таблицы движений
       |SELECT
       |rg99_vt.sp101 AS Товар,
       |$ПустойИД,
       |ВидДокум = '',
       |ДатаДок = 0,
       |ПризнакНакладной='',
       |rg99_vt.sp4226 AS ТипОстатка,
       |0,
       |0,
       |rg99_vt.sp163 AS БазоваяСтоимостьОстаток,
       |0,
       |0,
       |rg99_vt.sp164 AS ВалютнаяСтоимостьОстаток,
       |0,
       |0,
       |rg99_vt.sp102 AS ОстатокТовараОстаток
       |FROM rg99 AS rg99_vt (NOLOCK)
       |WHERE rg99_vt.period=:Дата3 --на начало предыдущего Дате1 месяца
       |"+?(ВыбТовар.Выбран()=1,"AND (rg99_vt.sp101 IN (:ВыбТовар))","")+"
       |"+?(ВыбСклад.Выбран()=1," AND (rg99_vt.sp100 IN (:ВыбСклад)) ","")+"
       |---
       |--
       |)
       |AS regOst_vt
       |LEFT JOIN sc33 AS spr_t (NOLOCK) ON regOst_vt.Товар = spr_t.id
       |<УсловиеЗаказ>
       |<УсловиеТипОстатка>
       |GROUP BY regOst_vt.Товар,
       |regOst_vt.Док,
       |regOst_vt.ДатаДок,
       |regOst_vt.ВидДокум,
       |regOst_vt.ПризнакНакладной
       |HAVING
       |--sum(regOst_vt.БазоваяСтоимостьОстаток) <> 0 OR
       |--sum(regOst_vt.БазоваяСтоимостьПриход) <> 0 OR
       |--sum(regOst_vt.БазоваяСтоимостьРасход) <> 0 OR
       |sum(regOst_vt.БазоваяСтоимостьОстаток) + sum(regOst_vt.БазоваяСтоимостьПриход) - sum(regOst_vt.БазоваяСтоимостьРасход) <> 0 OR
       |--sum(regOst_vt.ВалютнаяСтоимостьОстаток) <> 0 OR
       |--sum(regOst_vt.ВалютнаяСтоимостьПриход) <> 0 OR
       |--sum(regOst_vt.ВалютнаяСтоимостьРасход) <> 0 OR
       |sum(regOst_vt.ВалютнаяСтоимостьОстаток) + sum(regOst_vt.ВалютнаяСтоимостьПриход) - sum(regOst_vt.ВалютнаяСтоимостьРасход) <> 0 OR
       |--sum(regOst_vt.ОстатокТовараОстаток) <> 0 OR
       |sum(regOst_vt.ОстатокТовараПриход) <> 0 OR
       |--sum(regOst_vt.ОстатокТовараРасход) <> 0 OR
       |sum(regOst_vt.ОстатокТовараОстаток) + sum(regOst_vt.ОстатокТовараПриход) - sum(regOst_vt.ОстатокТовараРасход) <> 0
       |ORDER BY regOst_vt.Товар, regOst_vt.ДатаДок desc
       |";
32 dk
 
21.09.09
11:52
(24) какой запрос проще поправить?

1.
               text="
               |Select Tovar, Kontr, Ves, Ves*sum(Kol) as Val
               |from
               |(Select
               |    "+ИмяРег+"."+Tovar+" as Tovar,
               |    "+ИмяРег+"."+Kontr+" as Kontr,
               |    "+sprEd+"."+rVes+" as Ves,
               |    "+ИмяРег+"."+Kol+"*(1-"+ИмяРег+".DEBKRED*2) as Kol
               |from "+ИмяРег+" with (nolock) inner join "+sprTovar+" with (nolock) on "+sprTovar+".ID="+ИмяРег+"."+Tovar+"
               |        inner join "+SprEd+" with (nolock) on "+SprEd+".ID="+sprTovar+"."+rEd+"
               |        inner join _1SJOURN with (nolock) on "+ИмяРег+".IDDOC=_1SJOURN.IDDOC
               |        where (Left(_1SJOURN.DATE_TIME_IDDOC,8)>='"+ДатаНачалаОст+"')
               |          AND (Left(_1SJOURN.DATE_TIME_IDDOC,8)<='"+ДатаКонцаОст+"')
               |          AND (_1SJOURN."+ФлагДвижения+"=1) AND ("+SprEd+"."+rVes+"<>0)"+condition+"
               |) tmp
               |group by tmp.Tovar,tmp.Kontr,tmp.Ves
               |order by tmp.Kontr,tmp.Ves                    


2.
   |select    
   |    $ДокЗ.Экипаж as [Экипаж $Справочник.Экипажи]
   |    ,ДокЗ.IDDoc as [Ссылка $Документ.Заявка]    
   |    ,Сумма = 0
   |    ,sum($ТаблЗ.Количество) as Количество
   |from $Документ.Заявка as ДокЗ with (nolock)
   |
   |inner join $ДокументСтроки.Заявка as ТаблЗ with (nolock)
   |on ТаблЗ.IDDOC=ДокЗ.IDDoc
   |
   |inner join _1SJourn as Жур with (nolock)
   |on Жур.IDDOC=ДокЗ.IDDoc  
   |
   |inner join $Справочник.Экипажи as СпрЭ with (nolock)
   |on СпрЭ.ID=$ДокЗ.Экипаж
   |
   |where Жур.Closed & 1 = 1 and Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~
   |        and $ДокЗ.Экипаж IN (SELECT Val FROM #ПоЭкипажам)
   |"+?(ПустоеЗначение(лкТекстФильтр)=0, "and ("+лкТекстФильтр+")", "")+"
   |
   |group by СпрЭ.Code, $ДокЗ.Экипаж, СпрЭ.Descr, ДокЗ.IDDoc
   |order by СпрЭ.Code


)))
33 vde69
 
21.09.09
11:53
1с довольно быстро пишет в регистры, оптимизировать запись - бредовая идея, оптимизируй чтение и блокировки, а запись оставь типовой
34 Ёпрст
 
гуру
21.09.09
11:53
(30) в плане чего?
35 ДенисЧ
 
21.09.09
11:54
(33) Как раз запись движений документа лучше оптимизировать. Ибо она пересчитывает итоги после каждой записи. ЛУчше записать, потом разом всё пересчитать...
36 РЕК
 
21.09.09
11:59
Спасибо всем!
37 Mikeware
 
21.09.09
12:00
(35) Не факт, что будет быстрее. Но возникают две проблемы: поллержание актуальности временного расчета (если таковой используется :-), что вряд ли ). И вторая - повторное получение сделанных движений для вызова хранимки.