Имя: Пароль:
1C
1C 7.7
v7: 1c++: получить за период обороты по реквизитам регистра с группировкой по дням
0 dk
 
28.12.11
08:39
Исходные:
1С++, 1С 7.7
Регистр ТОварыНАскладах
2 реквизита Оборот и Списание
измерение товар
Хочу получить обороты по реквизитам с группировкой по дням
например
товар1 - 01/01/2011 - sum(Оборот) - sum(Списание)
товар1 - 01/02/2011 - sum(Оборот) - sum(Списание)
товар2 - 01/01/2011 - sum(Оборот) - sum(Списание)
....
Пока наваял через конструктор

SELECT top 100
       ТоварыПоСкладамОбороты.Товар [Товар $Справочник.Номенклатура]
   ,    NullIf(ТоварыПоСкладамОбороты.Период, '17530101') Период
   ,    sum(ТоварыПоСкладамОбороты.Оборот) _1
   ,    sum(ТоварыПоСкладамОбороты.Списание) _2
FROM $РегистрОбороты.ТоварыПоСкладам(:НачДата,
       :КонДата,
       День,,,,) AS ТоварыПоСкладамОбороты

но матерится
qryConsole : State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Оборот'.
1 Mikeware
 
28.12.11
08:40
и?
2 dk
 
28.12.11
08:42
вообще исходная задача чуть шире - надо получить средние продажи за период, т.е. определить дни присутствия / продаж товара на складе и поделить сумму продаж за период на дни присутствия. может кто уже решал подобное
3 Гефест
 
28.12.11
08:42
В ВТ вроде нет реквизитов?
4 dk
 
28.12.11
08:42
>но матерится
qryConsole : State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Оборот'.
5 dk
 
28.12.11
08:43
их нет из-за группировки день?
6 Гефест
 
28.12.11
08:44
(5) Их совсем нет. Сроду не завозили
7 dk
 
28.12.11
08:46
(6) куда они из оборотов-то делись? )
8 Гефест
 
28.12.11
08:48
(7) Из оборотов никуда не девались, а в ВТ Обороты их нет
10 dk
 
28.12.11
08:50
тогда возвращаемся к теме
как получить обороты по реквизиту с группировкой по дням?
12 Mikeware
 
28.12.11
08:51
(2) Я решал.
13 Гефест
 
28.12.11
08:52
(10) Запросом к реальной таблице оборотов регистра. А там уже группируй как хочешь
14 Mikeware
 
28.12.11
08:52
(10)"оборот по реквизиту" - не понял нифига
15 dk
 
28.12.11
08:53
(8) конструктор показывает, что есть реквизиты в ВТ по оборотам, врет?
16 viktor_vv
 
28.12.11
08:56
Уточню, точно имеются ввиду реквизиты, а не ресурсы ?
17 ado
 
28.12.11
08:59
(10) Может, все-таки по измерению?
18 dk
 
28.12.11
09:00
(16) реквизиты
(17) по реквизиту
19 Гефест
 
28.12.11
09:02
(15) Значит врет
20 ado
 
28.12.11
09:04
(19) Да не, не врет. А вот автор врет. То что он написал конструктор выдать не мог.
21 ado
 
28.12.11
09:06
Стоп, стоп, "Оборот" и "Списани" -- это что, названия реквизитов?
22 dk
 
28.12.11
09:06
(20) я токмо суммы добавил
покажи как правильно, раз я вру
23 dk
 
28.12.11
09:07
(21) да, читаем (0)
24 ado
 
28.12.11
09:08
(22) Для начала, нарисуй структуру регистра, как она есть в конфигураторе. И уточни, оборотный он, или остаточный.
25 dk
 
28.12.11
09:12
измерения:
товар
склад
...
ресурсы:
Колво
вес
...
реквизиты:
оборот  - число
списание - число

регистр остатков
26 Mikeware
 
28.12.11
09:23
(25) все равно я нифига не понял. что ты в них хранишь, в этих реквизитах?
27 dk
 
28.12.11
09:24
конфа такая, себестоимость и сумма продаж там.
28 viktor_vv
 
28.12.11
09:27
Как-то так.

SELECT top 100
       $ТоварыПоСкладамОбороты.Товар [Товар $Справочник.Номенклатура]
   ,   Left(Ж.Date_Time_IDDOC,8)  [Период $Дата]
   ,    sum($ТоварыПоСкладамОбороты.Оборот) _1
   ,    sum($ТоварыПоСкладамОбороты.Списание) _2
FROM $Регистр.ТоварыПоСкладам AS ТоварыПоСкладамОбороты (nolock)
Left join _1Sjourn as Ж (nolock) on Ж.IDDOC = ТоварыПоСкладамОбороты.IDDOC
Where Ж.Date_Time_IDDOC between :НачДата and :КонДата~
Group by $ТоварыПоСкладамОбороты.Товар,Left(Ж.Date_Time_IDDOC,8)

или inner join , не могу до конца понять, как лучше.

Это если не стоит флаг "Быстрая обработка движений", если стоит, то журнал не нужен, Left(ТоварыПоСкладамОбороты.Date_Time_IDDOC,8)
29 dk
 
28.12.11
09:31
вроде разобрался уже через простой регистр

SELECT
   $ТоварыПоСкладам.Товар [Товар $Справочник.Номенклатура]
   , NullIf(Cast(Left(ТоварыПоСкладам.DATE_TIME_IDDOC, 8) AS datetime), '17530101') Документ_дата
   , min(0)
   , sum($ТоварыПоСкладам.Оборот) Оборот
   , sum($ТоварыПоСкладам.Списание) Списание
FROM $Регистр.ТоварыПоСкладам AS ТоварыПоСкладам With (NOLOCK)
WHERE ТоварыПоСкладам.DATE_TIME_IDDOC  between :НачДата AND :КонДата~
GROUP BY $ТоварыПоСкладам.Товар, NullIf(Cast(Left(ТоварыПоСкладам.DATE_TIME_IDDOC, 8) AS datetime), '17530101')

по идее (13)
30 Mikeware
 
28.12.11
09:38
NullIf(Cast(Left(ТоварыПоСкладам.DATE_TIME_IDDOC, 8) AS datetime), '17530101')
- шозабред?
, min(0) - шозабред?
31 dk
 
28.12.11
09:40
NullIf(Cast(Left(ТоварыПоСкладам.DATE_TIME_IDDOC, 8) AS datetime), '17530101')
хз конструктор наваял
а min - это для будующего union с остатками
32 toypaul
 
гуру
28.12.11
09:42
а в toysql без проблем :)
33 Ёпрст
 
28.12.11
09:43
(31) юнион в селект листе ?
ну-ну..
34 dk
 
28.12.11
15:46
а все оказалось напрасно (
долбаный 1с++ такую лажу возвращает из ВТ по остаткам на каждый день
35 Ёпрст
 
28.12.11
15:46
(34) а при чем тут остатки ?
:)
36 ado
 
28.12.11
15:53
(34) А ты, небось, еще и остатки по реквизитам получить хочешь? ;-)
37 AeDen
 
28.12.11
15:56
(35) + и причем тут 1С++?
38 viktor_vv
 
28.12.11
15:59
(34) А метод дополнения небось ДвиженияИГраницыПериода ?
39 dk
 
28.12.11
16:13
(35) (36) (37) Средние продажи нужны - дополнительно остатки по каждому дню считаю через

SELECT
       /*ТовОстаткиОбороты.Товар [Товар1 $Справочник.Номенклатура]*/
       ТовОстаткиОбороты.Товар Товар1
   ,    NullIf(ТовОстаткиОбороты.Период, '17530101') Период1
   ,    sum(ТовОстаткиОбороты.ОстатокТовараКонечныйОстаток) Остаток1
   ,    min(0) Оборот1
   ,    min(0) Списание1
FROM $РегистрОстаткиОбороты.ТоварыПоСкладам(:НачДата,
       :КонДата,
       День,
       ДвиженияИГраницыПериода,,,,) AS ТовОстаткиОбороты With (NOLOCK)
GROUP BY
   ТовОстаткиОбороты.Товар, NullIf(ТовОстаткиОбороты.Период, '17530101')

----
(38) проверял оба, оба лажу показывают
40 viktor_vv
 
28.12.11
16:14
(38)+ Хотя для периодичности День метод дополнения неважен.
41 viktor_vv
 
28.12.11
16:15
В чем лада заключается ? И группировать не надо, укажи в параметрах по каким измерениям считать. ВТ вернет уже свернутую нормально.
42 dk
 
28.12.11
16:25
(41) остатки вообще неадекватные возвращает
43 viktor_vv
 
28.12.11
16:26
:КонДата~
44 ado
 
28.12.11
16:31
А что такое "ОстатокТовараКонечныйОстаток"? Я в (25) не вижу ресурса с названием ОстатокТовара
45 viktor_vv
 
28.12.11
16:31
FROM $РегистрОстаткиОбороты.ТоварыПоСкладам(:НачДата,
       :КонДата~,
46 dk
 
28.12.11
16:39
(45) пофигу, я же за период смотрю, а не на последнюю дату
47 dk
 
28.12.11
16:40
(44) он есть там ... )
48 viktor_vv
 
28.12.11
16:41
(46) Ну это повлияет только на последний день периода. А так не знаю, где ты смотришь адекватные остатки, у меня нормально показывает.
49 dk
 
28.12.11
16:54
сравнивал с regprint и с ВТ остатки на заданную дату
regprint и ВТ остатки показывали правильный остаток, ВТОстаткиОбороты фигню
50 viktor_vv
 
28.12.11
17:00
Ну ХЗ. Сравнивал с тем же регпринтом, все нормально. Ты бы все-таки прописал измерение в параметры ВТ убрал Group by и убрал NullIf(ТовОстаткиОбороты.Период, '17530101'), оставив ТовОстаткиОбороты.Период, от греха подальше.
51 dk
 
29.12.11
09:40
если еще интересно
тек версия 1С++ 3.2.1.0

http://s017.radikal.ru/i435/1112/a0/9e3c3c0e5d00.jpg
ВТ остаткиобороты без группировки - несколько записей на 1 дату

http://s55.radikal.ru/i150/1112/6a/26b84c0dcd1f.jpg
ВТ остаткиобороты с группировкой - обороты вроде идут, остатки левые

http://s017.radikal.ru/i415/1112/1e/1a66a4f46869.jpg
ВТ остатки

http://i032.radikal.ru/1112/89/6fc2070d02bc.jpg
regprint
52 Ёпрст
 
29.12.11
09:42
(51) ёпта, перечисли наконец список нужных измерений унутри ВТ.
53 ЧеловекДуши
 
29.12.11
09:44
Вот, держи функцию... может поможет
Позволяет из строки дату получить в нужном разрезе :)

       //len1 - дата Строкой 8 симв (4 год + 2 мес + 2 день), len2 - параметр для результата
       ТекстЗапроса="
       |if   Object_ID('"+ФункПР+"') is null
       |Begin
       |Exec('
       |create FUNCTION  "+ФункПР+"( @len1 varchar(8), @len2 int) RETURNS datetime
       |AS
       |begin
       |declare @tval datetime;
       |declare @tval1 int;
       |declare @tval2 int;
       |set @tval = Cast(''17530101'' AS datetime);
       |
       |if (@len1 is null) or (LTrim(RTrim(@len1)) = '''') or (@tval >= Cast(@len1 AS datetime)) RETURN(@tval);
       |
       //1 - День
       |if @len2 = 1 set @tval = Cast(@len1 AS datetime);
       |Else
       |Begin
       // 2 - Неделя
       |  if @len2 = 2
       |    Begin
       |      set @tval  = Cast(@len1 AS datetime);
       |      set @tval1 = DatePart(w,@tval);
       |       set @tval  = DATEADD(d,1 - @tval1,@tval);
       |    end
       |  else
       |    Begin
       //     3 - квартал
       |      if @len2 = 3
       |        Begin
       |          set @tval  = Cast(@len1 AS datetime);
       |          set @tval1 = DatePart(q,@tval);
       |          set @tval2 = DatePart(yy,@tval);
       |          if @tval1 = 1 set @tval  = Cast( Str(@tval2,4,0)+''0101'' AS datetime)
       |          else  
       |            if @tval1 = 2 set @tval  = Cast( Str(@tval2,4,0)+''0401'' AS datetime)
       |            else  
       |              if @tval1 = 3 set @tval  = Cast( Str(@tval2,4,0)+''0701'' AS datetime)
       |              else  
       |                if @tval1 = 4 set @tval  = Cast( Str(@tval2,4,0)+''1001'' AS datetime);
       |        End
       |      else
       |        Begin
       //         4 - месяц
       |          if @len2 = 4
       |            Begin
       |              set @tval  = Cast(@len1 AS datetime);
       |              set @tval1 = DatePart(d,@tval);
       |              set @tval  = DATEADD(d,1 - @tval1,@tval);
       |            end
       |          else
       |            Begin
       //             5 - год
       |              if @len2 = 5
       |                Begin
       |                  set @tval  = Cast(@len1 AS datetime);
       |                  set @tval1 = DatePart(dy,@tval);
       |                  set @tval  = DATEADD(d,1 - @tval1,@tval);
       |                End
       |              else
       |                set @tval  = Cast(@len1 AS datetime);
       |            End;
       |        end;
       |    end;
       |end;
       |
       |RETURN(@tval);
       |end
       |')
       |
       |select 2 as Err
       |end else
       |select 1 as Err
       |";
54 Ёпрст
 
29.12.11
09:45
и остатки не левые, нужно всего лишь прибавить приход-расход к предыдущему итогу.
55 dk
 
29.12.11
10:02
(52) точно, помогло, спасибо