![]() |
![]() |
![]() |
|
Как 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) какой запрос проще поправить?
))) |
|||
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) Не факт, что будет быстрее. Но возникают две проблемы: поллержание актуальности временного расчета (если таковой используется :-), что вряд ли ). И вторая - повторное получение сделанных движений для вызова хранимки.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |