Имя: Пароль:
1C
 
Получить в запросе все даты указанного периода
,
0 mzelensky
 
11.02.15
13:23
Доброго всем!
В запрос передается 2 даты - начала и окончания. Нужно в запросе получить таблицу со всеми днями из указанного интервала.

Точно помню, что нечто подобное выкладывали, но никак найти не могу :(
1 mikecool
 
11.02.15
13:24
запрос к РС календарныеграфики
2 trooba
 
11.02.15
13:26
(0) БП3.0 РегистрСведений.ДанныеПроизводственногоКалендаря
3 mzelensky
 
11.02.15
13:30
(1) (2) Умный ты. У меня такого нет. Конфа "Розница"
4 mzelensky
 
11.02.15
13:30
(0) Где-то народ извращался все это именно запросом получать...
5 trooba
 
11.02.15
13:34
(4) Календарь в любом случае думаю есть. Называется по другому, но думаю, что есть. У вас касса в нем есть? Наверняка! Значит есть кассовая книга? А там ее печатать надо помесячно и погодично. Так что календарь, должен быть.
6 Godofsin
 
11.02.15
13:37
(5) Как связан календарь и кассовая книга?
7 trooba
 
11.02.15
13:43
(6) Хм, посмотрел в бухгалтерии (розницы нет), действительно не используется в кассовой книге календарь, думалось, что по датам из него строится обороты по кассе
8 mzelensky
 
11.02.15
13:48
(7) Он там считается каждый раз. Просто циклом (по крайней мере в старых БП именно так было)


Давайте от календаря абстрагируемся и все же попробуем запросом :)
9 Ненавижу 1С
 
гуру
11.02.15
13:50
(8) там будет ограничение на интервал
в асмом общем случае - не получится
10 mzelensky
 
11.02.15
13:52
(9) какого рода ограничения?

По сути, в 99% случаев интервал у меня будет лежать в рамках одного месяца
11 mzelensky
 
11.02.15
13:53
(10) Можно даже так задачу перефразировать - подается дата(как параметр). Нужно получить таблицу дней всего месяца, в котором она лежит.
12 rozer76
 
11.02.15
13:56
// Возвращает таблицу значений с датами за период //  
// Параметры:
//  НачДата  - Дата - Начало периода
//  КонДата  - Дата - Конец периода
//  Интервал - Строка - одно из следующих значений:
//             (Секунда, Минута, Час, День, Неделя, Месяц, Квартал, Полугодие, Год)
//
//  Возвращаемое значение:
//   Таблица значений с датами за период. Содержит одну колонку "НачИнтервала"
//
Функция ПолучитьТаблицуДатЗаПериод(НачДата, КонДата, Интервал)
    
     тзИнтервалов = Новый ТаблицаЗначений;
     тзИнтервалов.Колонки.Добавить("НачИнтервала", Новый ОписаниеТипов("Дата"));
    
     Запрос = Новый Запрос;
     Запрос.Текст = "ВЫБРАТЬ
     |   НАЧАЛОПЕРИОДА(&НачДата, День) КАК НачИнтервала
     |УПОРЯДОЧИТЬ ПО
     |   НачИнтервала
     |ИТОГИ ПО
     |   НачИнтервала ПЕРИОДАМИ("+Интервал+", &НачДата, &КонДата)";
     //Параметры запроса
     Запрос.УстановитьПараметр("НачДата", НачДата);
     Запрос.УстановитьПараметр("КонДата", КонДата);
    
     Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "НачИнтервала", "ВСЕ");
     Пока Выборка.Следующий() Цикл
         НоваяСтрока = тзИнтервалов.Добавить();
         НоваяСтрока.НачИнтервала = Выборка.НачИнтервала;
     КонецЦикла;
    
     Возврат  тзИнтервалов;
    
КонецФункции //ПолучитьТаблицуДатЗаПериод()
13 Ненавижу 1С
 
гуру
11.02.15
13:57
(1) у даты определяешь номер месяца, високосность года и тупо делаешь

ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВСЕ
...
ВЫБРАТЬ 28
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 29
ОБЪЕДИНИТЬ ВСЕ
ГДЕ ТвойМесяц<>2 или ГодВисокосный
...
14 kumena
 
11.02.15
13:57
>> По сути, в 99% случаев интервал у меня будет лежать в рамках одного месяца

это что то меняет, или вас устраивает, что запрос иногда будет косячить?

делайте через календарь и мозг не выносите.
15 kumena
 
11.02.15
13:59
(12) если я правильно понял, то цель получить не из запроса, а таблицу дат в запросе.
16 mzelensky
 
11.02.15
14:02
(14) Давай для начала допустим ,что устраивает
17 mzelensky
 
11.02.15
14:03
(14)"делайте через календарь и мозг не выносите." - запарили уже!!! НЕТ КАЛЕНДАРЯ!!! ВСЕ, ТОЧКА!!! НЕТУ!!!
18 ProgAL
 
11.02.15
14:05
19 mzelensky
 
11.02.15
14:07
(12) откуда ты такую конструкцию взял:

|ИТОГИ ПО
|   НачИнтервала ПЕРИОДАМИ("+Интервал+", &НачДата, &КонДата)";
20 mzelensky
 
11.02.15
14:19
(18) Благодарю!
21 Defender aka LINN
 
11.02.15
14:20
(11) Заполни ТЗ и передай ее в запрос
22 mzelensky
 
11.02.15
14:21
(21) Сперва так и хотел. Но передавать нужно в СКД. А там геморой с этим.

(18) меня устраивает
23 mikecool
 
11.02.15
14:23
(22) никаких геморроев
24 hhhh
 
11.02.15
14:27
(22)в СКД как раз нет гиморроя.
25 Alexaha
 
11.02.15
14:28
(22) в СКД группировка по периоду с дополнением по дням
26 mikecool
 
11.02.15
14:28
(25) если бы это работало еще на момент выборки - цены бы скд не было
27 mzelensky
 
11.02.15
14:29
(23) Значит я не умею ее готовить. Дай пример передачи ТЗ в СКД, формирование и вывод результата на УФ.
28 mikecool
 
11.02.15
14:32
(27) как то так:
СКД.Параметры.Установить(ТЗ)
в запросе
Выбрать поля
поместить ВТ_ТЗ
из &ТЗ
29 Alexaha
 
11.02.15
14:32
(26) может и сделают....когда нибудь
30 mzelensky
 
11.02.15
14:37
(28) Ты сам так пробовал делать???

В СКД нельзя передавать ТЗ как параметр, только через "объект"
31 val
 
11.02.15
14:57
На SQL я делал так:

drop table #Periods
    GO
    create table #Periods (Period date primary key)
    GO
    DECLARE D datetime;
    DECLARE @ENDDATE datetime;
    SET D='20150101'
    SET @ENDDATE='20150131'
    WHILE D<=@ENDDATE
    BEGIN
      INSERT #Periods(Period) VALUES(D)
    SET D=DATEADD(DAY,1,D)
    END
    GO
    select * from #Periods
    GO
32 Alexaha
 
11.02.15
15:21
(26) пришел в голову изврат
шаг 1. СКД формирует таблицу дат - выгружаем в ТЗ
шаг 2. загружаем эту ТЗ в СКД или в обычный запрос и вперед...
33 mzelensky
 
11.02.15
15:29
(32) Печаль беда с тобой...

Попутно ответь на (30) ?!
34 Alexaha
 
11.02.15
15:39
(33) ну во первых мне приходилось так делать, правда от безысходности - это к 32 - ни печали ни беды - работало и нормально
по поводу 30, хоть есть набор данных объект - через него и добавляй
35 mzelensky
 
11.02.15
16:31
(34) У меня корректно через него не получилось запустить. Пример есть рабочий для УФ ?
36 Alexaha
 
11.02.15
16:34
под рукой нет, увы, но как раз на УФ и писал
37 Бертыш
 
11.02.15
16:48
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс