Имя: Пароль:
1C
1С v8
Помогите с запросом.
,
0 WED
 
09.07.13
10:34
Регистр накопления Взаиморасчеты: Контрагент, Сумма

Нужно по контрагенту получить обороты за период, но хитро:

Допустим задан период 01.07 - 09.07, значи
надо получить запросом суммы расхода за периоды:
01.06 - 01.07
02.06 - 02.07
03.06 - 03.07
....
09.06 - 09.07

Помогите запрос написать.
1 1Сергей
 
09.07.13
10:35
проще сваять ТЗ с периодами и соединить
2 WED
 
09.07.13
10:35
(1) т.е.?
3 WED
 
09.07.13
10:36
Мне это всё надо потом выдать отчетом через СКД, чтобы показать цифрами и графиком.
4 Bober
 
09.07.13
10:40
(0) а что будет при 10.06 - ?
5 WED
 
09.07.13
10:42
(4) Ничего, потому что задан период 01.07 - 09.07.

Фактически нужна сумма расхода за последний месяц на каждый день в указанном периоде.
6 Нууф-Нууф
 
09.07.13
10:44
получить таблицу оборотов
7 razlagator
 
09.07.13
10:44
(0) хочешь в отчете сравнивать день с днем предыдущего месяца?
8 WED
 
09.07.13
10:44
(6)  и?
9 razlagator
 
09.07.13
10:45
(7) не, это не то
10 Oleg_Kag
 
09.07.13
10:46
Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон)
11 Нууф-Нууф
 
09.07.13
10:46
01.06  500р
02.06  700р
...
01.07  125р
02.07  150р

из нее получить таблицу
01.06  500р  01.07 (добавить месяц)
02.06  700р  ...
...
01.07  125р  ...
02.07  150р  ...

и ее соединить саму с собой при день >= день2. а потом сгруппировать и ссумировать
12 WED
 
09.07.13
10:47
(7) нет
(10) это даст обороты за каждый день с 01.07 по 09.07 и это не то, что надо.
13 WED
 
09.07.13
10:48
(11) ммм. не вкурил
14 Oleg_Kag
 
09.07.13
10:50
А понятно... задумка в запросе по каждому дня интервала получать обороты на каждый полный предыдущий месяц
15 WED
 
09.07.13
10:51
(14) Именно
16 Inform
 
09.07.13
10:51
(11) + надо наложить ограничение на другую часть:
День2 > ДобавитьМесяц(День, -1)
17 fisher
 
09.07.13
10:54
Через ВычислитьВыражение() можно такое сделать в ресурсе СКД. Там можно задать выражения для начального и конечного значения по группировке.
18 WED
 
09.07.13
10:55
Попробую на цифрах объяснить....

Допустим расходы были такие:
01.06 10 р
02.06 9 р
03.06 10 р
04.06. 5 р.
нет движений
01.07 1 р
02.07 2 р
03.07 1 р
нет движений
09.07 10 р


тогда запрос должен выдать такое:
01.06 - 01.07 = 35 (10+9+10+5+1)
02.06 - 02.07 = 27 (9+10+5+1+2)
03.06 - 03.07 = 19 (10+5+1+2+1)
04.06 - 04.07 = 9 (5+1+2+1)
05.06 - 05.07 = 4 (1+2+1)
06.06 - 06.07 = 4 (1+2+1)
07.06 - 07.07 = 4 (1+2+1)
08.06 - 08.07 = 4 (1+2+1)
09.06 - 09.07 = 14 (1+2+1+10)
19 Нууф-Нууф
 
09.07.13
11:16
ВЫБРАТЬ
   ВзаиморасчетыСКонтрагентамиОбороты.Период КАК Дата1,
   ВзаиморасчетыСКонтрагентамиОбороты.СуммаУпрРасход КАК Сумма,
   ДОБАВИТЬКДАТЕ(ВзаиморасчетыСКонтрагентамиОбороты.Период, МЕСЯЦ, 1) КАК Дата2
ПОМЕСТИТЬ ТаблицаОборотов
ИЗ
   РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&НачалоПериода, &ОкончаниеПериода, День, ) КАК ВзаиморасчетыСКонтрагентамиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаОборотов.Дата1 КАК НачалоПериода,
   ТаблицаОборотов.Дата2 КАК ОкончаниеПериода,
   СУММА(ТаблицаОборотовДляСоединения.Сумма) КАК СуммаОборота
ИЗ
   ТаблицаОборотов КАК ТаблицаОборотов
       ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаОборотов КАК ТаблицаОборотовДляСоединения
       ПО ТаблицаОборотов.Дата1 <= ТаблицаОборотовДляСоединения.Дата1
           И ТаблицаОборотов.Дата2 > ТаблицаОборотовДляСоединения.Дата1

СГРУППИРОВАТЬ ПО
   ТаблицаОборотов.Дата1,
   ТаблицаОборотов.Дата2
20 Bober
 
09.07.13
11:34
(0) хорошо, а что делать
с ?.02 - 30.03
  ?.04-31.05
21 Bober
 
09.07.13
11:35
(0)
"получить обороты за период, но хитро"
и
"надо получить запросом суммы расхода "

так обороты нужны или расходы?
22 WED
 
09.07.13
11:38
(20) Ничего не делать, потому что период задается 01.07 - 09.07

т.е. это даты концов интересующих периодов.

(21) да, я не верно выразился. Нужны только расходы.
23 WED
 
09.07.13
11:41
период, который указывает пользователь - это даты, который будут использованы как конечная дата месячных расходов.

т.е. если пользователь задает 01.07 - 03.07
значит ему нужны расходы за:
01.06 - 01.07
02.06 - 02.07
03.06 - 03.07

если пользователь задаст 30.03 - 03.04
значит нужны расходы за периоды:
28.02 - 30.03
01.03 - 01.04
02.03 - 02.04
03.03 - 03.04
24 sirsp
 
09.07.13
11:46
ВЫБРАТЬ ДАТАВРЕМЯ(2013,06,01) Период, 10 Сумма ПОМЕСТИТЬ Данные
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2013,06,02) Период, 9 Сумма
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2013,06,03) Период, 10 Сумма
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2013,06,04) Период, 5 Сумма

ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2013,07,01) Период, 1 Сумма
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2013,07,02) Период, 2 Сумма
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2013,07,03) Период, 1 Сумма
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2013,07,09) Период, 10 Сумма

;//////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
   Д1.Период
   ,СУММА(Д2.Сумма) Сумма
ИЗ
   Данные Д1
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ
   Данные Д2
   ПО
       Д1.Период МЕЖДУ &нач И &кон
       И Д2.Период МЕЖДУ ДОБАВИТЬКДАТЕ(Д1.Период, МЕСЯЦ, -1) И Д1.Период
СГРУППИРОВАТЬ ПО
   Д1.Период
25 WED
 
09.07.13
11:48
(24) Прикольно, а если период другой? :)
26 RomanYS
 
09.07.13
11:48
(23)
28.02 - 30.03
????? - 31.03      
01.03 - 01.04
02.03 - 02.04
03.03 - 03.04

Ответ в (19), только не забудь расширить период в первой ВТ на месяц назад, и отсечь лишние (непопадающие в исходный период) записи во втором подзапросе
27 Bober
 
09.07.13
11:49
(23) не понял алгоритма на сложных датах (29, 30, 31).

делаешь один запрос по таблице движений
а-ля

ВЫБРАТЬ НачалоПериода(РН.Период, ДЕНЬ) КАК ПериодДень, СУММА(РН.Ресурс) КАК Ресурс ПОМЕСТИТЬ РасходыПоДням ИЗ РегистрНакопления.Расчеты КАК РН ГДЕ РН.Период МЕЖДУ &НачалоПериода И &КонецПериода И РН.Активность И РН.ВидДвижения = Значение(ВидДвиежнияНакопления.Расход) СГРУППИРОВАТЬ ПО НачалоПериода(РН.Период, ДЕНЬ)
28 Bober
 
09.07.13
11:50
(27) щас напишу что дальше делать
29 WED
 
09.07.13
11:51
Можно немного упростить:
Берем интервалы по 30 дней, вне зависимости от количства дней месяца.
30 WED
 
09.07.13
11:59
(26) запрос в (19) выдает расход за каждый день за указанный период, т.е. не то, что надо.
31 Bober
 
09.07.13
12:00
(27) далее через ТЗ или генерацию периодов запросом (если отчет на СКД) создаешь таблицу вида
НачалоПериода, КонецПериода

потом к таблице левым соединением присоединяешь запрос из (27)
с условиях соединения ставишь
"ПО РасходыПоДням.ПериодДень МЕЖДУ ТЗПериоды.НачалоПериода И ТЗПериоды.КонецПериода"

и делаешь группировку. Все.
32 WED
 
09.07.13
12:06
(31) В том и дело, что этот отчет уже есть практически в том же варианте, что ты предложил:

сначала запросом получается временная таблица, в которой каждая строка - суммарный расход за 30 дней по каждой дате из указанного периода.
А потом СКД из этой таблицы строит отчет.

Я хотел свести всё воедино в один запрос в СКД.
33 Bober
 
09.07.13
12:24
(32) не понимаю как можно просуммировать данные из запроса по регистру без таблицы периодов. все делается минимум тремя запросами если
34 Bober
 
09.07.13
12:24
через запрос. и больше трех если через СКД
35 RomanYS
 
09.07.13
12:29
(30) запрос в (19) делает тоже самое что и в (24) - это то, что тебе нужно, осталось только аккуратно передать параметры
36 Нууф-Нууф
 
09.07.13
12:45
(30) запрос в 19 возвращает расходы не за каждый день, а за каждый месяц начиная с каждой даты как ты и описал в 18.


возьми любой свой регистр, по которому ты строишь, убери группировку и суммирование в конце и все увидишь.

только незабудь про каммент про дополнительный месяц для второй ВТ. Точнее на этот дополнительный месяц нужно увеличить первую ВТ, а потом ее же и ограничить. вообщем с периодами правильно сыграть.
37 WED
 
10.07.13
16:10
(36) У меня запрос вернул расход за каждый день в периоде + 2 даты: начало месяца и конец месяца.
Причем для периода 01.07  - 09.07 даты были 01.07 - 01.08, 02.07 - 02.08... т.е. месяц прибавлялся, а надо наоборот.
38 WED
 
10.07.13
16:11
+(37) или я что-то не так понимаю с этим запросом
39 WED
 
11.07.13
15:00
Всё. Получилось.
Благодаря наводке в (19) получил нудный запрос:


<CODE>
ВЫБРАТЬ
   Взаиморасчеты.Период КАК Дата1,
   Взаиморасчеты.СуммаРасход КАК Сумма,
   ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(Взаиморасчеты.Период, МЕСЯЦ, 1), СЕКУНДА, -1) КАК Дата2
ПОМЕСТИТЬ ТаблицаОборотов
ИЗ
   РегистрНакопления.Взаиморасчеты.Обороты(ДОБАВИТЬКДАТЕ(&НачалоПериода, МЕСЯЦ, -1), &ОкончаниеПериода, День, ) КАК Взаиморасчеты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаОборотов.Дата1 КАК НачалоПериода,
   ТаблицаОборотов.Дата2 КАК ОкончаниеПериода,
   СУММА(ТаблицаОборотовДляСоединения.Сумма) КАК СуммаОборота
ИЗ
   ТаблицаОборотов КАК ТаблицаОборотов
       ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаОборотов КАК ТаблицаОборотовДляСоединения
       ПО ТаблицаОборотов.Дата1 <= ТаблицаОборотовДляСоединения.Дата1
           И ТаблицаОборотов.Дата2 > ТаблицаОборотовДляСоединения.Дата1
ГДЕ
   ТаблицаОборотов.Дата2 >= &НачалоПериода
   И ТаблицаОборотов.Дата2 <= &ОкончаниеПериода

СГРУППИРОВАТЬ ПО
   ТаблицаОборотов.Дата1,
   ТаблицаОборотов.Дата2

УПОРЯДОЧИТЬ ПО
   НачалоПериода
</CODE>