Имя: Пароль:
1C
1С v8
Алгоритм: перебор месяцев в периоде
0 extrim-style
 
25.01.13
14:49
Подскажите грамотный перебор месяцев в периоде. Начало перебора от начала периода, конец перебора - конец периода.
1 salvator
 
25.01.13
14:50
Для Сч=Месяц(ДатаНач) По Месяц(ДатаКон) Цикл
2 Maxus43
 
25.01.13
14:50
перебор где? зачем?
задачу огласи, там ясней будет
3 Maxus43
 
25.01.13
14:51
(1) года разные могут быть
4 salvator
 
25.01.13
14:51
Но тут возникает загвоздка, если даты в разных годах. В любом случае, каков вопрос - таков ответ ))
5 extrim-style
 
25.01.13
14:51
(0) перебор помесячно
6 pessok
 
25.01.13
14:51
Месяцев = Месяц(КонецПериода) - Месяц(НачалоПериода)

Для А = 0 По Месяцев Цикл
7 Maxus43
 
25.01.13
14:52
(6) тоже (3) :)
8 фросия
 
25.01.13
14:52
(6) если там больше 12 мес- не по получится
9 extrim-style
 
25.01.13
14:53
(6) не катит. см (3)
10 c00Lo
 
25.01.13
14:54
Год(Дата1)*12 + Месяц(Дата1) по Год(Дата2)*12 + Месяц(Дата2)
11 Maxus43
 
25.01.13
14:55
Номер = 1;
Пока ДобавитьМесяц(Начало, Номер) <> Конец Цикл
Номер = Номер + 1;
12 Jstunner
 
25.01.13
14:55
Засунуть в запрос, добавить условия, сделать итоги по НАЧАЛОПЕРИОДА
13 Ayvengo
 
25.01.13
14:55
Месяц = НачалоМесяца(ТекущаяДата());
Пока не надоест Цикл
  Месяц = ДобавитьМесяц(Месяц,1);
КонецЦикла;
14 extrim-style
 
25.01.13
14:56
(12) без запроса
15 Jstunner
 
25.01.13
14:57
(14) почему?
16 extrim-style
 
25.01.13
14:57
(15) потому
17 Jstunner
 
25.01.13
14:58
(16) успехов
18 extrim-style
 
25.01.13
14:59
(11)(13) ну я изначально накатал сходу нечто похожее, но что-то мне кажется, что это попахивает г-кодом:

Если НачалоМесяца(НачалоПериода) = НачалоМесяца(КонецПериода) Тогда
//выбран 1 месяц
НачальнаяДата = НачалоПериода;
КонечнаяДата = КонецПериода;
       
//действие
       
Иначе
НачальнаяДата = НачалоПериода;
КонечнаяДата = КонецМесяца(НачалоПериода);
Пока КонечнаяДата <> КонецМесяца(КонецПериода) Тогда
           
//действие
           
НачальнаяДата = НачалоМесяца(ДобавитьМесяц(НачальнаяДата));
КонечнаяДата = ДобавитьМесяц(КонечнаяДата);      
Цикл;
       
//КонечнаяДата = КонецМесяца(КонецПериода)
КонечнаяДата = КонецПериода;
       
//действие
       
КонецЕсли;
19 c00Lo
 
25.01.13
14:59
(12) А в запрос что засовывать?))
20 Maxus43
 
25.01.13
15:00
(18) норм впринципе, если работает.
пока нет ответа на вопрос (2) - нечего думать дальше
21 extrim-style
 
25.01.13
15:00
(17) сразу не веришь? обосновывать обязательно?
22 c00Lo
 
25.01.13
15:01
(18) А зачем перебор месяцев? колоночки чтоль сделать по месяцам?))
23 GROOVY
 
25.01.13
15:01
ТП = НачалоПериода;
Пока ТП < КонецПериода Цикл
ТП = ДобавитьМесяц(ТП,1);
КонецЦикла;
24 extrim-style
 
25.01.13
15:02
(20) мне не интересно как повернуть задачу по-другому (этого и нельзя сделать). весь вопрос в (0)
25 Ayvengo
 
25.01.13
15:03
Мой фэншуй говорит, что условие лучше сделать так:
Пока КонечнаяДата > КонецМесяца(КонецПериода) Тогда

Хотя работать и так и так будет ;)

КонечнаяДата = ДобавитьМесяц(КонечнаяДата); - тут цифры не хватает, смотри СП ДобавитьМесяц
26 Maxus43
 
25.01.13
15:04
(24) значит норм всё у тебя, вон даже GROOVY одобряет
27 extrim-style
 
25.01.13
15:04
(23) а где выбор от начала периода по конец месяца, потом помесячно, и потом от начала последнего месяца до конца периода?
28 Ayvengo
 
25.01.13
15:05
(27) мужиГ, ты уж додумай, идею то подбросили ;)
29 extrim-style
 
25.01.13
15:05
вся соль вопроса в (27) и есть ощущение, что (18) можно переписать покороче
30 GROOVY
 
25.01.13
15:05
(27) Перебор месяцев в периоде это означает перебрать месяца в периоде: Январь, февраль, март и пр...

Что такое "от начала последнего месяца до конца периода"?
31 extrim-style
 
25.01.13
15:07
(30) период: 10.11.12 - 05.02.13.
помесячно: 10.11.12 - 30.11.12, 01.12.12 - 31.12.12, 01.01.13-31.01.13, 01.02.13 - 05.02.13
32 Ayvengo
 
25.01.13
15:08
НачалоПериода = Дата(2013,1,1);
КонецПериода = Дата(2013,12,1);
Пока НачалоПериода <= КонецПериода Цикл
   НачалоПериода = ДобавитьМесяц(НачалоПериода,1);
КонецЦикла;
33 Ayvengo
 
25.01.13
15:11
Ну, видимо тебе еще нужно будет СовсемКонецПериода = КонецМесяца(КонецПериода) :D
34 extrim-style
 
25.01.13
15:11
(32) мне нужно между НачалоПериода и КонецПериода, а не между НачалоМесяца(НачалоПериода) и КонецМесяца(КонецПериода)
35 Ayvengo
 
25.01.13
15:12
(34) видимо мозг у Вас совсем не хочет работать :P
36 extrim-style
 
25.01.13
15:13
(35) может и не хочет, сегодня же пятница. А что, я чёто не увидел в (32)?
37 extrim-style
 
25.01.13
15:14
неужели только у меня ощущение, что (18) - это г-код?
38 Ayvengo
 
25.01.13
15:17
(36) Добавь еще переменную КонецМесяцаНачалаПериода и условие на то, что КонецПериода > КонецМесяцаНачалаПериода. Думаю, что еще кучу вариантов придумать можно ;) Пятница - мозгоразжижайница О_О
39 extrim-style
 
25.01.13
15:18
(38) оно и заметно)
40 hhhh
 
25.01.13
15:19
(37) ну сделай как в  (23) груви советует.
41 acsent
 
25.01.13
15:24
(37) человеку просто за количество строк платят
42 extrim-style
 
25.01.13
15:26
(41) было бы странно создавать сабж, если мне платят за количество строк...
43 extrim-style
 
25.01.13
15:27
(40) там нет ответа на (27) и (31)
44 extrim-style
 
25.01.13
15:35
Так пойдет?

   НД = НачалоПериода;
   КД = НачалоПериода;
   Пока КД <> КонецМесяца(КонецПериода) Цикл
       Если НачалоМесяца(НД)=НачалоМесяца(НачалоПериода) Тогда
           НД = НачалоПериода;
       Иначе
           НД = НачалоМесяца(ДобавитьМесяц(НачалоПериода,1));
       КонецЕсли;
       Если КонецМесяца(КД)=КонецМесяца(КонецПериода) Тогда
           КД = КонецПериода;
       Иначе
           КД = КонецМесяца(ДобавитьМесяц(КонецПериода,1));
       КонецЕсли;    
       //действие
   КонецЦикла;
45 Ayvengo
 
25.01.13
15:36
НачалоПериода = Дата(2013,1,1);
КонецПериода  = Дата(2013,12,5);

НачальнаяДата = НачалоПериода;
КонечнаяДата  = КонецПериода;

Пока НачальнаяДата < НачалоМесяца(КонечнаяДата) Цикл

   НачальнаяДата = ДобавитьМесяц(НачальнаяДата, 1);
   КонечнаяДата  = ?(КонецМесяца(НачальнаяДата)<КонецПериода, КонецМесяца(НачальнаяДата), КонецПериода);

КонецЦикла;
46 Ayvengo
 
25.01.13
15:37
(45) тьфу, ток в цикле < НачалоМесяца(КонецПериода)
47 extrim-style
 
25.01.13
15:37
(45) неправильно, начальная дата должна в начало месяца становиться
48 Ayvengo
 
25.01.13
15:38
(47) даже, если выбрано 5 января, тебе всегда нужно 1 января? Ну это ты и сам доработаешь ;)
49 extrim-style
 
25.01.13
15:39
+(44) переписал условия
   НД = НачалоПериода;
   КД = НачалоПериода;
   Пока КД <> КонецМесяца(КонецПериода) Цикл
       НД = ?(НачалоМесяца(НД)=НачалоМесяца(НачалоПериода), НачалоПериода, НачалоМесяца(ДобавитьМесяц(НачалоПериода,1)));
       КД = ?(КонецМесяца(КД)=КонецМесяца(КонецПериода), КонецПериода, КонецМесяца(ДобавитьМесяц(КонецПериода,1)));
       //действие
   КонецЦикла;
50 extrim-style
 
25.01.13
15:40
(48) я имел ввиду начало следующего месяца
51 Ayvengo
 
25.01.13
15:42
В цикле условие лучше по началу месяца для обоих значений делай, иначе что-нибудь да накосячится ;)
52 Ayvengo
 
25.01.13
15:43
(49) кстати, КД = НачалоПериода - это верно?
53 extrim-style
 
25.01.13
15:44
(52) именно так и писал, сейчас проверю обработкой
54 extrim-style
 
25.01.13
15:49
чёт неправильно
55 Ayvengo
 
25.01.13
15:50
(54) отладчик в руки и тыц-тыц, танцы с бубном :)
56 extrim-style
 
25.01.13
15:53
(55) угу. я уже бубню)
57 hhhh
 
25.01.13
16:08
(43) ну вот если бы ты голову включил, то уже бы до (31) было

ТП = НачалоПериода;
Пока ТП <= КонецПериода Цикл
ТП = ДобавитьМесяц(ТП,1);
НД = Макс(НачалоПериода, НачалоМесяца(ТП));
КД = Мин(КонецДня(КонецПериода), КонецМесяца(ТП));
КонецЦикла;
58 extrim-style
 
25.01.13
16:16
(57) у тебя первый месяц неправильно
хочу, чтобы в (18) осталось одно //действие
59 extrim-style
 
25.01.13
17:49
Апну. что-то не получается...
60 extrim-style
 
25.01.13
17:55
Переписал. Вроде работает. Но выглядит стрёмно.

   НД = НачалоПериода;
   КД = КонецМесяца(НачалоПериода);
   Сч=1;
   Пока НачалоМесяца(КонецПериода)<>НачалоМесяца(КД) Цикл        
       НД = ?(НачалоМесяца(НачалоПериода)=НачалоМесяца(НД) И Сч=1, НачалоПериода, НачалоМесяца(ДобавитьМесяц(НД,1)));        
       КД = ?(НачалоМесяца(КонецПериода)=НачалоМесяца(НД), КонецПериода, КонецМесяца(НД));    
       Сч=2;
       Сообщить(""+НД+" --- "+КД);
   КонецЦикла;
61 extrim-style
 
25.01.13
18:01
+(60) не работает, если период 1 месяц
62 extrim-style
 
25.01.13
18:05
Все сдались? лузеры)
63 Рыцарь
 
25.01.13
18:08
(62)Все домой ушли))
64 extrim-style
 
25.01.13
18:25
(63) просто нужно признать, что задачка оказалась не по зубам)...
65 Goggy
 
25.01.13
18:34
А какая ваще задача решалась таким способом?
66 rphosts
 
25.01.13
18:35
(64) задача скучная, ТС нормально не может сформулировать что ему нужно... да кому интересно при таком раскладе личное время тратить да ещё и в пятницу...
67 Goggy
 
25.01.13
18:36
+ (65) может ваще можно было бы всё просто методом

ВыборкаПериод = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "ВСЕ");

Пока ВыборкаПериод.Следующий() Цикл
//...
КонецЦикла;


решить и не париться?
68 extrim-style
 
25.01.13
18:46
(66) Переформулирую. Есть период: 10.11.12 - 05.02.13.
Необходимо в цикле пройти его помесячно. Для первого месяца начальная дата (НД) - начало периода, для последнего месяца конечная дата (КД) - конец периода: 10.11.12 - 30.11.12, 01.12.12 - 31.12.12, 01.01.13-31.01.13, 01.02.13 - 05.02.13. "Сообщить(""+НД+" - "+КД)" должно быть только 1 раз в цикле.
69 GROOVY
 
25.01.13
18:56
(68) Издеваешься? Тебе что не написать гомнокод на 7 строк? 4 часа обсуждать на форуме...
70 extrim-style
 
25.01.13
18:58
(69) не издеваюсь. чёт никак... буду признателен помощи
71 ЗлобнийМальчик
 
25.01.13
19:04
(70) скажите, а Вы школу закончили???
72 extrim-style
 
25.01.13
19:10
(71) возможно затупил. вот так случилось. школу закончил.
буду признателен помощи.
73 extrim-style
 
25.01.13
19:17
вот. наваял еще г-код. зато с одним "Сообщить":

НД = НачалоПериода;
КД = КонецМесяца(НачалоПериода);
ТП = НачалоПериода;
Пока ТП <= КонецДня(КонецПериода) Цикл
ПредТП = ТП;
ТП = НачалоМесяца(ДобавитьМесяц(ТП,1));
НД = Мин(НД, НачалоМесяца(ТП));
КД = Мин(КД, КонецМесяца(ТП));
Если НачалоМесяца(НачалоПериода) = НачалоМесяца(КонецПериода) Тогда
   КД = КонецДня(КонецПериода);
КонецЕсли;
Сообщить(""+НД+" --- "+КД);
НД = НачалоМесяца(ДобавитьМесяц(НД,1));
КД = КонецМесяца(ДобавитьМесяц(КД,1));
Если НачалоМесяца(КД)=НачалоМесяца(КонецПериода) Тогда
   КД = КонецДня(КонецПериода);
КонецЕсли;
КонецЦикла;
74 extrim-style
 
25.01.13
19:18
+(73) работает)
75 extrim-style
 
25.01.13
19:18
+(73) упс. ПредТП лишнее
НД = НачалоПериода;
КД = КонецМесяца(НачалоПериода);
ТП = НачалоПериода;
Пока ТП <= КонецДня(КонецПериода) Цикл
ТП = НачалоМесяца(ДобавитьМесяц(ТП,1));
НД = Мин(НД, НачалоМесяца(ТП));
КД = Мин(КД, КонецМесяца(ТП));
Если НачалоМесяца(НачалоПериода) = НачалоМесяца(КонецПериода) Тогда
   КД = КонецДня(КонецПериода);
КонецЕсли;
Сообщить(""+НД+" --- "+КД);
НД = НачалоМесяца(ДобавитьМесяц(НД,1));
КД = КонецМесяца(ДобавитьМесяц(КД,1));
Если НачалоМесяца(КД)=НачалоМесяца(КонецПериода) Тогда
   КД = КонецДня(КонецПериода);
КонецЕсли;
КонецЦикла;
76 mistеr
 
26.01.13
10:40
(75) Хочется, чтобы коротко и красиво? Ну вот:

ТекущийМесяц = Месяц(НачалоПериода);
Пока КонецПериода > ТекущийМесяц Цикл
   НД = Макс(ТекущийМесяц, НачалоПериода);
   КД = Мин(КонецМесяца(ТекущийМесяц), КонецПериода);
   Сообщить(""+НД+" --- "+КД);
   ТекущийМесяц = ДобавитьМесяц(ТекущийМесяц, 1);
КонецЦикла;

P.S. Не проверял.
P.P.S. Количество строк Павел определил мастерски :)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой