Имя: Пароль:
1C
 
Получить номера месяцев между датами
0 1ctube
 
07.06.21
09:15
Доброго времени суток. Нужно получить номера месяцев между двумя датами. В коде. Например: 25.02.2021 - 03.05.2021 то на выходе: 2,3,4,5.
Есть ли готовая системная функция для получения инфы в таком виде ?
Попробовал так: Месяц(ДатаОкончания)-Месяц(ДатаНачала)+1+12*(Год(ДатаОкончания)-Год(ДатаНачала)); Но так возвращается только количество месяцев между датами
1 acanta
 
07.06.21
09:18
Это да... Проблема(
2 Ненавижу 1С
 
гуру
07.06.21
09:20
(0) зачем? будем искать причину
3 ДенисЧ
 
07.06.21
09:20
Цикл написать - лениво?
4 Ненавижу 1С
 
гуру
07.06.21
09:21
+(2) к тому, что сделать можно, но стоит ли?
5 Масянька
 
07.06.21
09:21
(0) Готовой системной нет.
6 1ctube
 
07.06.21
09:24
(1) Это да(
7 1ctube
 
07.06.21
09:24
(3) Нет, цикл то написать всегда можно, просто хотел в одну короткую строчку
8 1ctube
 
07.06.21
09:24
(5) Жаль(((
9 1ctube
 
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 ..
Или как?
14 SleepyHead
 
гуру
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) О! И я про тоже.
19 1ctube
 
07.06.21
09:42
(12) Если слишком длинно то не удобно и приходиться укоротить)
20 SleepyHead
 
гуру
07.06.21
09:52
(15) Ну в (12) было про длину что-то.
21 Aleksey
 
07.06.21
10:00
А если несколько лет то как?
22 ДенисЧ
 
07.06.21
10:03
(20) Длина файла с кодом... А вам, батенька, нужно к специалистам ))
23 1Сергей
 
07.06.21
10:12
ВНИМАНИЕ! Не используйте код ниже! Это опасно для жизни. Написано ради хохмы

    Для Идн = (Год(ДатаНачала)*12 + Месяц(ДатаНачала)-1) По (Год(ДатаОкончания)*12 + Месяц(ДатаОкончания)-1) Цикл
        НомерМесяца = Идн%12 + 1;
24 Масянька
 
07.06.21
10:13
(22) Длинный файл с кодом - неудобно.
Это вам, батенька, надо к специалистам. 🤦🏻‍♀️
25 fisher
 
07.06.21
10:31
Не проверял

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

   Для НомерМесяца = Макс(МесяцНачала, МесяцОкончания) По 12 Цикл // с 1 по 12
      МассивМесяцев.Добавить(НомерМесяца);
   КонецЦикла;
   Для НомерМесяца = 1 По Мин(МесяцНачала, МесяцОкончания) Цикл // с 1 по 12
      МассивМесяцев.Добавить(НомерМесяца);
   КонецЦикла;
32 fisher
 
07.06.21
10:44
(31) Ну и? Первый цикл будет с 12 по 12, второй с 1 по 1.
33 1Сергей
 
07.06.21
10:44
(31) сторно
34 1Сергей
 
07.06.21
10:45
(32) прастити, фигню сморозил
35 Ненавижу 1С
 
гуру
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) Что это, Бэрримор?
37 1Сергей
 
07.06.21
10:57
(35) Проверял?
38 Ненавижу 1С
 
гуру
07.06.21
10:59
(37) да
39 1Сергей
 
07.06.21
11:00
Лаааадна
40 fisher
 
07.06.21
11:06
(35) Избыточно. С ростом диапазона будет больше размер списка, в то время как легко без этого обойтись.
41 fisher
 
07.06.21
11:08
Я понял задачу так, что дубли не нужны. Хотя задача похоже или некорректно сформулирована или не имеет отношения к реальной практике.
42 wertyu
 
07.06.21
11:09
ДатаОкончания = НачалоМесяца(ДатаОкончанияПериода);
ДатаЦикла = НачалоМесяца(ДатаНачалаПериода);
МассивМесяцев = Новый Массив;
Пока ДатаЦикла <= ДатаОкончания Цикл
МассивМесяцев.Добавить(Месяц(ДатаЦикла));
ДатаЦикла = ДобавитьМесяц(ДатаЦикла, 1);
КонецЦикла;
43 1ctube
 
07.06.21
11:10
(17) "Но ты ее напиши сам, а затем не забудь поделиться с сообществом в данной теме."

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

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

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

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

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