Имя: Пароль:
1C
1С v8
Запрос биллинг-периода
0 oly123456
 
15.03.12
10:50
Задачка такая:
Есть дата начала биллинга, например "01.01.2010"
биллинг-период квартал или год, например "Квартал", тогда биллинг-даты: "31.03.2010","30.06.2010","30.09.2010"...
Нужно на любую дату, например "15.03.2012"
найти ближайшую предыдущую биллинг-дату, для нашего примера должен вернуть "31.12.2011".

Простым перебором можно сделать, а как сделать все с помощью запроса?
1 ptiz
 
15.03.12
10:52
Ну очень сложная задача!
начало периода (квартал) и добавитькдате( -1 день)
2 ssh2006
 
15.03.12
10:54
ВЫБРАТЬ
   КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2012, 3, 12), КВАРТАЛ, -1), КВАРТАЛ) КАК Поле1
3 oly123456
 
15.03.12
10:56
Если дата на которую надо вернуть не "15.03.2012", а "31.03.2012", тогда вернет "31.12.2011", что не правильно!
4 oly123456
 
15.03.12
10:57
должен вернуть  "31.03.2012"
5 Ненавижу 1С
 
гуру
15.03.12
10:59
(3) почему неправильно?
6 Ненавижу 1С
 
гуру
15.03.12
10:59
(4) тогда сравни с концом квартала
7 oly123456
 
15.03.12
11:01
можно, но я хотел все в запросе
8 Maxus43
 
15.03.12
11:03
(7) где проблема? это всё выше и так в запросе
9 Maxus43
 
15.03.12
11:03
и сравнивать там же можно
10 oly123456
 
15.03.12
11:05
можно написать запрос, для не грамотных?
11 Maxus43
 
15.03.12
11:11
Выбор Когда НачалоПериода(Период, День) = НачалоПериода(Период, Квартал) Тогда
НачалоПериода(Период, День) Иначе
КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Период, КВАРТАЛ, -1), КВАРТАЛ) КАК Поле1
Конец
12 Maxus43
 
15.03.12
11:12
короче если день - это и есть начало квартала - то ничо не делаем, иначе ищем начало предыдущего квартала
13 oly123456
 
15.03.12
12:02
Сделал так:

Функция НайтиБиллингДату(Биллинг)
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ВЫБОР
   |        КОГДА КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) = КОНЕЦПЕРИОДА(&Дата, "+Биллинг+")
   |            ТОГДА КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)
   |        ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, "+Биллинг+", -1), "+Биллинг+")
   |    КОНЕЦ КАК БиллингДата";
   Запрос.УстановитьПараметр("Дата", ДатаОтчета);
   
   Возврат Запрос.Выполнить().Выгрузить()[0].БиллингДата;
   
КонецФункции // НайтиБиллингДату()
14 oly123456
 
15.03.12
12:05
Это не правильно, например биллинг-период "ГОД", начало "01.05.2010" выводит "31.12.2011", а должен "30.04.2011"
15 Ненавижу 1С
 
гуру
15.03.12
12:07
(14) это ПИПЕЦ, почему ведь ГОД жеж стоит?
16 oly123456
 
15.03.12
12:29
(1) ..."биллинг-период квартал или год"...
Если квартал, и начало "01.05.2010" тогда "31.01.2012"
17 Ненавижу 1С
 
гуру
15.03.12
12:31
то есть если год, то ищем конецквартала, а если квартал - то конец месяца, так что ли?
18 oly123456
 
15.03.12
12:37
нет, в договоре есть реквизит биллинг-период (год или квартал выбирает пользователь при ввооде), и реквизит начало биллинг-периода
19 Ненавижу 1С
 
гуру
15.03.12
12:42
(18) нормально сформулируй задачу
20 oly123456
 
15.03.12
12:55
Например начало "01.05.2010", а биллинг-период "квартал", в конце каждого биллинг-периода делается реализация. В этом примере "31.07.2010" должна быть сделана первая реализация, "31.10.2010" еще одна, "31.01.2011" следующая и так далее.
Нужен отчет который покажет который покажет даты на которые клиенту надо делать реализации. Т.к. всегда работа с клиентами ведется по предоплате, собираю не закрытые авансы, а затем должен в отчете указать когда должна быть сделана реализация. Бух 2.0
21 Ненавижу 1С
 
гуру
15.03.12
12:58
(20) у тебя случайно не гуманитарное образование?
22 oly123456
 
15.03.12
12:59
Спасибо за помощь, буду дальше думать.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой