Вход | Регистрация
 

Получить номера месяцев между датами

Получить номера месяцев между датами
Я
   1ctube
 
07.06.21 - 09:15
Доброго времени суток. Нужно получить номера месяцев между двумя датами. В коде. Например: 25.02.2021 - 03.05.2021 то на выходе: 2,3,4,5.
Есть ли готовая системная функция для получения инфы в таком виде ?
Попробовал так: Месяц(ДатаОкончания)-Месяц(ДатаНачала)+1+12*(Год(ДатаОкончания)-Год(ДатаНачала)); Но так возвращается только количество месяцев между датами
   acanta
 
1 - 07.06.21 - 09:18
Это да... Проблема(
   Ненавижу 1С
 
2 - 07.06.21 - 09:20
(0) зачем? будем искать причину
   ДенисЧ
 
3 - 07.06.21 - 09:20
Цикл написать - лениво?
   Ненавижу 1С
 
4 - 07.06.21 - 09:21
+(2) к тому, что сделать можно, но стоит ли?
   Масянька
 
5 - 07.06.21 - 09:21
(0) Готовой системной нет.
   1ctube
 
6 - 07.06.21 - 09:24
(1) Это да(
   1ctube
 
7 - 07.06.21 - 09:24
(3) Нет, цикл то написать всегда можно, просто хотел в одну короткую строчку
   1ctube
 
8 - 07.06.21 - 09:24
(5) Жаль(((
   1ctube
 
9 - 07.06.21 - 09:25
(4) Да, стоит
   Обработка
 
10 - 07.06.21 - 09:26
(0) Как можно додуматься до того чтоб допустить вопрос у себя в голове нет ли системной функции такой?
Тогда уж.
Нет ли системной функции который возвращает все числа которые  стоят между двумя? например  3 и 8 Ответ 4,5,6,7
   Масянька
 
11 - 07.06.21 - 09:26
(7) Хотеть и мочь - две большие разницы. Особенно, в случае с продуктами 1С.
   ДенисЧ
 
12 - 07.06.21 - 09:26
(7) Обычно хотят, чтобы подлинее было... ))))
   Обработка
 
13 - 07.06.21 - 09:29
(0) Что должен вернуть функция? Строку = "2,3,4,5"? Числа в списке  = 2,3,4,5 ..
Или как?
   SleepyHead
 
14 - 07.06.21 - 09:29
(12) С этим вам не на форум 1с надо )
   ДенисЧ
 
15 - 07.06.21 - 09:38
(14) Я про оплату по количеству строк. А вы о чём?
   Масянька
 
16 - 07.06.21 - 09:38
(12) Говорят, что главное не размер, а умение.
🤔
   Мультук
 
17 - 07.06.21 - 09:38
(0) Готовой системной функции нет.
Но ты ее напиши сам, а затем не забудь поделиться с сообществом в данной теме.
   Масянька
 
18 - 07.06.21 - 09:39
(15) О! И я про тоже.
   1ctube
 
19 - 07.06.21 - 09:42
(12) Если слишком длинно то не удобно и приходиться укоротить)
   SleepyHead
 
20 - 07.06.21 - 09:52
(15) Ну в (12) было про длину что-то.
   Aleksey
 
21 - 07.06.21 - 10:00
А если несколько лет то как?
   ДенисЧ
 
22 - 07.06.21 - 10:03
(20) Длина файла с кодом... А вам, батенька, нужно к специалистам ))
   1Сергей
 
23 - 07.06.21 - 10:12
ВНИМАНИЕ! Не используйте код ниже! Это опасно для жизни. Написано ради хохмы
    Для Идн = (Год(ДатаНачала)*12 + Месяц(ДатаНачала)-1) По (Год(ДатаОкончания)*12 + Месяц(ДатаОкончания)-1) Цикл
        НомерМесяца = Идн%12 + 1;
   Масянька
 
24 - 07.06.21 - 10:13
(22) Длинный файл с кодом - неудобно.
Это вам, батенька, надо к специалистам. 🤦🏻‍♀️
   fisher
 
25 - 07.06.21 - 10:31
Не проверял
МассивМесяцев = Новый Массив;
МесяцНачала = Месяц(ДатаНачала);
МесяцОкончания =  Месяц(ДатаОкончания);
Для НомерМесяца = МесяцНачала По МесяцОкончания Цикл
   МассивМесяцев.Добавить(НомерМесяца);
КонецЦикла;
Если Год(ДатаНачала) <> Год(ДатаОкончания) Тогда
   Для НомерМесяца = Макс(МесяцНачала, МесяцОкончания) По 12 Цикл
      МассивМесяцев.Добавить(НомерМесяца);
   КонецЦикла;
   Для НомерМесяца = 1 По Мин(МесяцНачала, МесяцОкончания) Цикл
      МассивМесяцев.Добавить(НомерМесяца);
   КонецЦикла;
КонецЕсли;

   Serg_1960
 
26 - 07.06.21 - 10:34
[Как страшно жить] А если начало периода - в предыдущем году, а окончание периода - в текущем? Как автор считать месяца с одинаковыми номерами будет? Непонятно, однако.
   fisher
 
27 - 07.06.21 - 10:34
А, ччерт. Перемудрил. Если несколько лет, то неправильно может работать.
   1Сергей
 
28 - 07.06.21 - 10:36
(25) с 12.2020 по 01.2021 от туда ещё два года накинет
   1Сергей
 
29 - 07.06.21 - 10:38
(26) /vangamode on
он колонки в таблицу выводит
/vangamode off
   fisher
 
30 - 07.06.21 - 10:40
(28) Не, в этом случае ок будет. Не ок будет, если 07.2020 - 02.2023
 
 
   1Сергей
 
31 - 07.06.21 - 10:40
(30)

   Для НомерМесяца = Макс(МесяцНачала, МесяцОкончания) По 12 Цикл// с 1 по 12

      МассивМесяцев.Добавить(НомерМесяца);
   КонецЦикла;
   Для НомерМесяца = 1 По Мин(МесяцНачала, МесяцОкончания) Цикл// с 1 по 12

      МассивМесяцев.Добавить(НомерМесяца);
   КонецЦикла;
   fisher
 
32 - 07.06.21 - 10:44
(31) Ну и? Первый цикл будет с 12 по 12, второй с 1 по 1.
   1Сергей
 
33 - 07.06.21 - 10:44
(31) сторно
   1Сергей
 
34 - 07.06.21 - 10:45
(32) прастити, фигню сморозил
   Ненавижу 1С
 
35 - 07.06.21 - 10:55
class Program
    {
        public static IEnumerable<int> MonthNumbers(DateTime d1, DateTime d2)
        {
            return Enumerable.Range(d1.Year * 12 + d1.Month, (d2.Year - d1.Year) * 12 + (d2.Month - d1.Month) + 1).Select(n => n % 12 == 0 ? 12 : n % 12);
        }
        static void Main(string[] args)
        {
            DateTime d1 = new DateTime(2021, 02, 05);
            DateTime d2 = new DateTime(2021, 05, 03);
            foreach(var c in MonthNumbers(d1,d2))
            {
                Console.WriteLine(c);
            }
            Console.ReadKey();
        }
    }
   ДенисЧ
 
36 - 07.06.21 - 10:56
(35) Что это, Бэрримор?
   1Сергей
 
37 - 07.06.21 - 10:57
(35) Проверял?
   Ненавижу 1С
 
38 - 07.06.21 - 10:59
(37) да
   1Сергей
 
39 - 07.06.21 - 11:00
Лаааадна
   fisher
 
40 - 07.06.21 - 11:06
(35) Избыточно. С ростом диапазона будет больше размер списка, в то время как легко без этого обойтись.
   fisher
 
41 - 07.06.21 - 11:08
Я понял задачу так, что дубли не нужны. Хотя задача похоже или некорректно сформулирована или не имеет отношения к реальной практике.
   wertyu
 
42 - 07.06.21 - 11:09
ДатаОкончания = НачалоМесяца(ДатаОкончанияПериода);
ДатаЦикла = НачалоМесяца(ДатаНачалаПериода);
МассивМесяцев = Новый Массив;
Пока ДатаЦикла <= ДатаОкончания Цикл
МассивМесяцев.Добавить(Месяц(ДатаЦикла));
ДатаЦикла = ДобавитьМесяц(ДатаЦикла, 1);
КонецЦикла;
   1ctube
 
43 - 07.06.21 - 11:10
(17) "Но ты ее напиши сам, а затем не забудь поделиться с сообществом в данной теме."

Вот что получилось в итоге:

        КоличествоМесяцев = Месяц(ДатаОкончания)-Месяц(ДатаНачала)+1+12*(Год(ДатаОкончания)-Год(ДатаНачала));
        
        
        Пока НЕ КоличествоМесяцев = 0 Цикл 
        
               НомерМесяца = Месяц(ДобавитьМесяц(ДатаНачала,КоличествоМесяцев-1));

            КоличествоМесяцев = КоличествоМесяцев -1;
            
        КонецЦикла;

А дальше номермесяца можно пихать в тз и т.д.
   Ненавижу 1С
 
44 - 07.06.21 - 11:10
(40) ленивые вычисления же
   1ctube
 
45 - 07.06.21 - 11:11
(41) Нужен просто список номером месяца между заданными интервалами в таком в виде:
2
3
4
5
   wertyu
 
46 - 07.06.21 - 11:12
(45) период всегда меньше года?
   1ctube
 
47 - 07.06.21 - 11:13
(42) Тоже хороший вариант!
   1ctube
 
48 - 07.06.21 - 11:13
(46) Да
   Serg_1960
 
49 - 07.06.21 - 11:14
Так, как скучно просто так номера считать, то я имена месяцев считал :) ИменаМесяцев.Количество() - количество сами подсчитаете :))

    НачалоПериода = Дата("20190516");
    КонецПериода = Дата ("20210921");
    
    НачПериод = НачалоМесяца(НачалоПериода);
    КонПериод = КонецМесяца(КонецПериода);
    
    ИменаМесяцев = Новый Массив;
    ТекДата = НачПериод;
    
    Пока Истина Цикл
        Если ТекДата >= НачПериод И ТекДата <= КонПериод Тогда
            ИменаМесяцев.Добавить(Формат(ТекДата,"ДФ=MMMM"));
            ТекДата = ДобавитьМесяц(ТекДата,1);
        Иначе
            Прервать;
        КонецЕсли;
    КонецЦикла;
   fisher
 
50 - 07.06.21 - 11:17
(44) И чем это лечит? Тут вроде нет "лишних" вычислений которые смогут быть отброшены.
   Ненавижу 1С
 
51 - 07.06.21 - 11:19
(50) причем тут лечит и вычисления? главное оно не хранится в памяти целиком при вычислении, если ты специально не заставишь его это сделать
   fisher
 
52 - 07.06.21 - 11:24
(51) А, ты про память! А я еще и про молотилку, если дубли не нужны.
   Ненавижу 1С
 
53 - 07.06.21 - 11:25
(52) так никто не говорил, что дубли не нужны, хотя может я пропустил


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.