Имя: Пароль:
1C
1С v8
Запрос
0 Segate
 
18.05.12
15:23
Никак не могу придумать оптимальный текст запроса.
Задача получить таблицу такого вида:
Организация| валюта| средний остаток на конец дня за период.

Т.е. Допустим по рублевым счетам было, суммарно, на конец первого дня 100р, на конец второго 200р средне-дневная сумма 150р.
1 shamannk
 
18.05.12
15:26
Выбрать
"ООО РагаИКопыта",
"руб",
15400
Поместить Вт;
Выбрать
*
Из
Вт
2 shamannk
 
18.05.12
15:27
(0) 0.1 сек формирует, очень оптимально)))
3 Segate
 
18.05.12
15:35
(2) пятнично, но только абсолютно не помогает ))
4 Maxus43
 
18.05.12
15:40
дык остатки на каждую дату получить и СРЕДНЕЕ в запросе на суммы
5 Maxus43
 
18.05.12
15:44
6 Maxus43
 
18.05.12
15:44
7 shuhard
 
18.05.12
15:44
(3) ВЫБРАТЬ
   НАЧАЛОПЕРИОДА(ДенежныеСредстваОстаткиИОбороты.Период, ДЕНЬ) КАК Период,
   ДенежныеСредстваОстаткиИОбороты.БанковскийСчетКасса,
   СРЕДНЕЕ(ДенежныеСредстваОстаткиИОбороты.СуммаКонечныйОстаток) КАК СуммаКонечныйОстаток
ИЗ
   РегистрНакопления.ДенежныеСредства.ОстаткиИОбороты(, , Регистратор, , ) КАК ДенежныеСредстваОстаткиИОбороты

СГРУППИРОВАТЬ ПО
   ДенежныеСредстваОстаткиИОбороты.БанковскийСчетКасса,
   НАЧАЛОПЕРИОДА(ДенежныеСредстваОстаткиИОбороты.Период, ДЕНЬ)
8 mkanaev
 
18.05.12
15:53
(7) некатит... остатки о ибороты не дают запись за день в котором небыло остатка...
вот с помощью этого запроса получишь даты с заданной периодичностью и интервалом дат:
ВЫБРАТЬ
   1 КАК а
ПОМЕСТИТЬ дни

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   5

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   6

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   7

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   9

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   10

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   11

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   12

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   13

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   14

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   15

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   16

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   17

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   18

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   19

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   20

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   21

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   22

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   23

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   24

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   25

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   26

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   27

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   28

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   29

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   30

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   31
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   дни.а КАК день,
   дни1.а КАК месяц
ПОМЕСТИТЬ ДеньМесяц
ИЗ
   дни КАК дни,
   дни КАК дни1
ГДЕ
   дни1.а МЕЖДУ 1 И 12
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ дни
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   1 КАК а
ПОМЕСТИТЬ числа

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   0

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   5

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   6

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   7

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   числа.а * 1000 + числа1.а * 100 + числа2.а + 10 + числа3.а КАК год
ПОМЕСТИТЬ года
ИЗ
   числа КАК числа,
   числа КАК числа1,
   числа КАК числа2,
   числа КАК числа3
ГДЕ
   числа.а * 1000 + числа1.а * 100 + числа2.а + 10 + числа3.а МЕЖДУ ГОД(&ДатаНачалаТаблицыПериодичности) И ГОД(&ДатаОкончанияТаблицыПериодичности)

СГРУППИРОВАТЬ ПО
   числа.а * 1000 + числа1.а * 100 + числа2.а + 10 + числа3.а
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   года.год КАК год,
   ДеньМесяц.месяц КАК месяц,
   ВЫБОР
       КОГДА ДеньМесяц.месяц = 4
               И ДеньМесяц.день > 30
           ТОГДА NULL
       КОГДА ДеньМесяц.месяц = 6
               И ДеньМесяц.день > 30
           ТОГДА NULL
       КОГДА ДеньМесяц.месяц = 9
               И ДеньМесяц.день > 30
           ТОГДА NULL
       КОГДА ДеньМесяц.месяц = 2
               И ((ВЫРАЗИТЬ(года.год / 4 КАК ЧИСЛО(10, 0))) * 4 = года.год
                       И НЕ (ВЫРАЗИТЬ(года.год / 100 КАК ЧИСЛО(10, 0))) * 100 = года.год
                   ИЛИ (ВЫРАЗИТЬ(года.год / 400 КАК ЧИСЛО(10, 0))) * 400 = года.год)
               И ДеньМесяц.день > 29
           ТОГДА NULL
       КОГДА ДеньМесяц.месяц = 2
               И НЕ((ВЫРАЗИТЬ(года.год / 4 КАК ЧИСЛО(10, 0))) * 4 = года.год
                           И НЕ (ВЫРАЗИТЬ(года.год / 100 КАК ЧИСЛО(10, 0))) * 100 = года.год
                       ИЛИ (ВЫРАЗИТЬ(года.год / 400 КАК ЧИСЛО(10, 0))) * 400 = года.год)
               И ДеньМесяц.день > 28
           ТОГДА NULL
       КОГДА ДеньМесяц.месяц = 11
               И ДеньМесяц.день > 30
           ТОГДА NULL
       ИНАЧЕ ДеньМесяц.день
   КОНЕЦ КАК День
ПОМЕСТИТЬ чистыйКалендарь
ИЗ
   ДеньМесяц КАК ДеньМесяц,
   года КАК года
ГДЕ
   НЕ ВЫБОР
               КОГДА ДеньМесяц.месяц = 4
                       И ДеньМесяц.день > 30
                   ТОГДА NULL
               КОГДА ДеньМесяц.месяц = 6
                       И ДеньМесяц.день > 30
                   ТОГДА NULL
               КОГДА ДеньМесяц.месяц = 9
                       И ДеньМесяц.день > 30
                   ТОГДА NULL
               КОГДА ДеньМесяц.месяц = 2
                       И ((ВЫРАЗИТЬ(года.год / 4 КАК ЧИСЛО(10, 0))) * 4 = года.год
                               И НЕ (ВЫРАЗИТЬ(года.год / 100 КАК ЧИСЛО(10, 0))) * 100 = года.год
                           ИЛИ (ВЫРАЗИТЬ(года.год / 400 КАК ЧИСЛО(10, 0))) * 400 = года.год)
                       И ДеньМесяц.день > 29
                   ТОГДА NULL
               КОГДА ДеньМесяц.месяц = 2
                       И НЕ((ВЫРАЗИТЬ(года.год / 4 КАК ЧИСЛО(10, 0))) * 4 = года.год
                                   И НЕ (ВЫРАЗИТЬ(года.год / 100 КАК ЧИСЛО(10, 0))) * 100 = года.год
                               ИЛИ (ВЫРАЗИТЬ(года.год / 400 КАК ЧИСЛО(10, 0))) * 400 = года.год)
                       И ДеньМесяц.день > 28
                   ТОГДА NULL
               КОГДА ДеньМесяц.месяц = 11
                       И ДеньМесяц.день > 30
                   ТОГДА NULL
               ИНАЧЕ ДеньМесяц.день
           КОНЕЦ ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), ГОД, чистыйКалендарь.год - 1), МЕСЯЦ, чистыйКалендарь.месяц - 1), ДЕНЬ, чистыйКалендарь.День - 1) КАК дата
ПОМЕСТИТЬ Таблица
ИЗ
   чистыйКалендарь КАК чистыйКалендарь
ГДЕ
   ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), ГОД, чистыйКалендарь.год - 1), МЕСЯЦ, чистыйКалендарь.месяц - 1), ДЕНЬ, чистыйКалендарь.День - 1) МЕЖДУ &ДатаНачалаТаблицыПериодичности И &ДатаОкончанияТаблицыПериодичности
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВЫБОР
       КОГДА &Периодичность = "День"
           ТОГДА НАЧАЛОПЕРИОДА(таблица.дата, ДЕНЬ)
       КОГДА &Периодичность = "Месяц"
           ТОГДА НАЧАЛОПЕРИОДА(таблица.дата, МЕСЯЦ)
       КОГДА &Периодичность = "Год"
           ТОГДА НАЧАЛОПЕРИОДА(таблица.дата, ГОД)
       ИНАЧЕ таблица.дата
   КОНЕЦ КАК Дата
   Поместить ТаблицаДат
ИЗ
   Таблица КАК таблица

СГРУППИРОВАТЬ ПО
   ВЫБОР
       КОГДА &Периодичность = "День"
           ТОГДА НАЧАЛОПЕРИОДА(таблица.дата, ДЕНЬ)
       КОГДА &Периодичность = "Месяц"
           ТОГДА НАЧАЛОПЕРИОДА(таблица.дата, МЕСЯЦ)
       КОГДА &Периодичность = "Год"
           ТОГДА НАЧАЛОПЕРИОДА(таблица.дата, ГОД)
       ИНАЧЕ таблица.дата
   КОНЕЦ

Потом к запросу прикрепляешь остатки на начало периода и все обороты с периодичностью например в день, в которых период оборота больше начала периода и меньше периода записи, арифметическими операциями прибывляя к нгачальному остатку ОборотыДТ(Приход) и вычитая оборотыКТ(Расход),Ю получишь остаток на каждый день, далее просто используешь СРЕДНЕЕ() и всё
9 Ненавижу 1С
 
гуру
18.05.12
16:01
взять сумму остатков и поделить на число дней в периоде
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший