Имя: Пароль:
IT
 
Получение месяцев с определенной периодичностью
0 МешочекЗнаний
 
22.02.18
09:45
Приветствую уважаемые.

Второй час бьюсь вроде бы над простой задачей - необходимо получить месяца с определённой периодичностью. Не получается вывести формулу для запроса.

Например начисления происходят с 01.02.2018 с периодичностью в 3 месяца. В итоге должны быть месяца
01.02.2018
01.05.2018
01.08.2018
01.11.2018
1 Mort
 
22.02.18
09:47
НачалоПериода(, КВАРТАЛ)
2 Mort
 
22.02.18
09:48
А через ДобавитьКДате выходим на нужное смещение
3 МешочекЗнаний
 
22.02.18
09:48
(2) А если периодичность раз в 6 месяцев, или раз 2 месяца. Нужна универсальная формула
4 Asmody
 
22.02.18
09:49
(0) Найди на ИС статью про порождающие запросы, сформируй ВТ с нужными числами, и ДобавитьКДате
5 Малыш Джон
 
22.02.18
10:00
(0) не очень понял

то есть имеется определенный регистр с начислениями и надо оттуда вытащить начала месяцев с определенной периодичностью?
6 Малыш Джон
 
22.02.18
10:00
или самому сформировать табличку с такими месяцами?
7 Mort
 
22.02.18
10:04
ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&ИсходнаяДата, МЕСЯЦ, (ВЫРАЗИТЬ((РАЗНОСТЬДАТ(&ИсходнаяДата, &ТекущаяДата, МЕСЯЦ)-0.5)/&Периодичность КАК Число(10,0))) * &Периодичность ) КАК Результат

Где
&ИсходнаяДата - с которой начинается отсчет
&Периодичность - периодичность месяцев (целое число)
&ТекущаяДата - дату, которую нужно привести
8 Timon1405
 
22.02.18
10:08
(7) и где здесь таблица из 4х дат как в примере (0)?
9 МешочекЗнаний
 
22.02.18
10:09
(6) Да, саму таблицу создать. Порождающий запрос похоже на то что мне нужно, пока разбираюсь.
10 Ненавижу 1С
 
гуру
22.02.18
10:10
зачем порождающий, если можно таблицу значений передать во временную таблицу запроса?
11 Ненавижу 1С
 
гуру
22.02.18
10:13
НашаДата = Дата(2018,2,1);
Для й=1 по ЧислоПериодов Цикл
  Стр = ТЗ.Добавить();
  Стр.Период = НашаДата;
  НашаДата = ДобавитьМесяц(НашаДата,КоличествоМесяцев);
КонецЦикла;
12 МешочекЗнаний
 
22.02.18
10:18
(11) Не стану же я тут описывать задачу целиком, для упрощения я привёл пример что мне нужно - получить месяца в запросе (т.к. от многих условий дата и периодичность может меняться).
Решение в лоб есть, но оно медленное, поэтому сейчас оптимизирую.
13 тарам пам пам
 
22.02.18
12:06
(12) Как можно это умудриться сделать медленно? Если нужно прямо в запросе, можно так например сделать (при желании можно не 256 номеров сделать, а 65536, чтобы уж точно нужный период вошел):

ВЫБРАТЬ
    0 КАК Номер
ПОМЕСТИТЬ ВТНомера2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТНомера2.Номер + ВТНомера21.Номер * 2 КАК Номер
ПОМЕСТИТЬ ВТНомера4
ИЗ
    ВТНомера2 КАК ВТНомера2,
    ВТНомера2 КАК ВТНомера21
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТНомера4.Номер + ВТНомера41.Номер * 4 КАК Номер
ПОМЕСТИТЬ ВТНомера16
ИЗ
    ВТНомера4 КАК ВТНомера4,
    ВТНомера4 КАК ВТНомера41
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТНомера16.Номер + ВТНомера161.Номер * 16 КАК Номер
ПОМЕСТИТЬ ВТНомера256
ИЗ
    ВТНомера16 КАК ВТНомера16,
    ВТНомера16 КАК ВТНомера161
;

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

УПОРЯДОЧИТЬ ПО
    Период
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший