Имя: Пароль:
1C
 
Как "пролистать" декады ?
Ø
0 Mobilis
 
15.12.04
15:24
Уважаемый ALL, помогите найти алгоритм, который бы формировал даты начала и конца декад. Принимаем за основу, что декад в месяце три : 1-10, 11-20, 21- Дата конца месяца.
Необходимо не кнопки "Листать вперед" и "Листать назад" навесить процедуру смены отчетного периода типа "Декада"
1 Бит
 
15.12.04
15:29
В таблицу значений загоняй свои данные, пиши функцию получения декады и записуй в графу декада, а потом свернуть по графам +декада.
2 Mobilis
 
15.12.04
15:36
Данные мне не нужны. А вот Функция получения декад и нужна.
3 Бит
 
15.12.04
15:44
функция ВозвратДекады(дата)
темп=ПериодСтр(НачМесяца(дата)),КонМесяца(дата)));
темп2=число(лев(строка(дата),2));
если темп2<11 тогда
   темп="Декада 1 "+Темп;
   результат темп;
иначеесли темп2<21 тогда
   томп="Декада 2 "+Темп;
   результат темп;
иначе
   томп="Декада 3 "+Темп;
   результат темп;
конецесли;
конецфункции
Примерно так
4 Бит
 
15.12.04
15:46
Сори опечаток на делал
функция ВозвратДекады(ТвояДата)
Темп=ПериодСтр(НачМесяца(ТвояДата)),КонМесяца(ТвояДата)));
Темп2=число(лев(строка(ТвояДата),2));
если темп2<11 тогда
   Темп="Декада 1 "+Темп;
   результат Темп;
иначеесли темп2<21 тогда
   Темп="Декада 2 "+Темп;
   результат темп;
иначе
   Темп="Декада 3 "+Темп;
   результат темп;
конецесли;
конецфункции
5 Бит
 
15.12.04
15:49
Туплю
функция ВозвратДекады(ТвояДата)
Темп=ПериодСтр(НачМесяца(ТвояДата)),КонМесяца(ТвояДата)));
Темп2=число(лев(строка(ТвояДата),2));
если темп2<11 тогда
   Темп="Декада 1 "+Темп;
   возврат Темп;
иначеесли темп2<21 тогда
   Темп="Декада 2 "+Темп;
   возврат Темп;
иначе
   Темп="Декада 3 "+Темп;
   возврат Темп;
конецесли;
конецфункции
6 Mobilis
 
15.12.04
15:49
(3) Ты немного не понял, или, возможно я не корректно объяснил проблему.
Проблемы получения номера декады текущего интервала НЕТ.
Надо получать ДАТЫ начала и конца Предыдущих или последующих декад.
7 Мулька
 
15.12.04
15:59
Значения из списка: 1 - Неделя, 2 - Декада, 3 - Месяц, 4 - квартал, 5 - день, 6 - полмесяца
сам разберешься ?
===Процедура ДобавитьИнтервалы()
  Инд=1;
  тц.НоваяСтрока();
  тц.ДатаНИ=Константа.ФирмаПоУмолчанию.ДатаРегистрации;
  тц.ДатаКИ=ДатаОтчета-1;
  ТекДата=ДатаОтчета;
  Если спПериоды.ТекущаяСтрока()=1 Тогда
    тц.НоваяСтрока();
    тц.ДатаНИ=ТекДата;
    тц.ДатаКИ=КонНедели(ТекДата)+Смещ;
    ТекДата=КонНедели(ТекДата)+Смещ+1;
  ИначеЕсли спПериоды.ТекущаяСтрока()=3 Тогда
    тц.НоваяСтрока();
    тц.ДатаНИ=ТекДата;
    тц.ДатаКИ=КонМесяца(ТекДата)+Смещ;
    ТекДата=КонМесяца(ТекДата)+Смещ+1;
  ИначеЕсли спПериоды.ТекущаяСтрока()=6 Тогда
    тц.НоваяСтрока();
    тц.ДатаНИ=ТекДата;
    Если ТекДата > Дата(НачМесяца(ТекДата)+14) Тогда
      тц.ДатаКИ=КонМесяца(ТекДата)+Смещ;
      ТекДата=КонМесяца(ТекДата)+Смещ+1;
    Иначе
      тц.ДатаКИ=НачМесяца(ТекДата)+14+Смещ;
      ТекДата=НачМесяца(ТекДата)+14+Смещ+1;
    КонецЕсли;
  ИначеЕсли спПериоды.ТекущаяСтрока()=4 Тогда
    тц.НоваяСтрока();
    тц.ДатаНИ=ТекДата;
    тц.ДатаКИ=КонКвартала(ТекДата)+Смещ;
    ТекДата=КонКвартала(ТекДата)+Смещ+1;
  ИначеЕсли спПериоды.ТекущаяСтрока()=2 Тогда
    тц.НоваяСтрока();
    тц.ДатаНИ=ТекДата;
    Если (ДатаЧисло(ТекДата)>5)
    и (ДатаЧисло(ТекДата)<=14) Тогда
      ТекДата=Дата(ДатаГод(ТекДата),ДатаМесяц(ТекДата),10);
    ИначеЕсли (ДатаЧисло(ТекДата)>14)
    и (ДатаЧисло(ТекДата)<=24) Тогда
      ТекДата=Макс(Дата(ДатаГод(ТекДата),ДатаМесяц(ТекДата),20),ДатаОтчета);
    ИначеЕсли (ДатаЧисло(ТекДата)>24) и (ДатаЧисло(ТекДата)<=31)
    или (ДатаЧисло(ТекДата)>0) и (ДатаЧисло(ТекДата)<=5) Тогда
      ТекДата=Макс(Дата(ДатаГод(ТекДата),ДатаМесяц(ТекДата),ДатаЧисло(КонМесяца(ТекДата))),ДатаОтчета);
    КонецЕсли;
    тц.ДатаКИ=ТекДата+Смещ;
    ТекДата=ТекДата+Смещ+1;
  ИначеЕсли спПериоды.ТекущаяСтрока()=5 Тогда
    тц.НоваяСтрока();
    тц.ДатаНИ=ТекДата;
    тц.ДатаКИ=ТекДата+Смещ;
    ТекДата=ТекДата+Смещ+1;
  КонецЕсли;
  Пока Инд=1 Цикл
    Если спПериоды.ТекущаяСтрока()=1 Тогда
      тц.НоваяСтрока();
      тц.ДатаНИ=ТекДата;
      тц.ДатаКИ=КонНедели(ТекДата)+Смещ;
      ТекДата=КонНедели(ТекДата)+Смещ+1;
    ИначеЕсли спПериоды.ТекущаяСтрока()=2 Тогда
      тц.НоваяСтрока();
      тц.ДатаНИ=ТекДата+Смещ;
      ТекДата=ТекДата+Смещ+10;
      Если ДатаЧисло(ТекДата)<=5 Тогда
        ТекДата=НачМесяца(ТекДата)-1;
      ИначеЕсли (ДатаЧисло(ТекДата)>5)
      и (ДатаЧисло(ТекДата)<=14) Тогда
        ТекДата=Дата(ДатаГод(ТекДата),ДатаМесяц(ТекДата),10);
      ИначеЕсли (ДатаЧисло(ТекДата)>14)
      и (ДатаЧисло(ТекДата)<=24) Тогда
        ТекДата=Дата(ДатаГод(ТекДата),ДатаМесяц(ТекДата),20);
      ИначеЕсли (ДатаЧисло(ТекДата)>24)
      или (ДатаЧисло(ТекДата)<=4) Тогда
        ТекДата=Дата(ДатаГод(ТекДата),ДатаМесяц(ТекДата),ДатаЧисло(КонМесяца(ТекДата)));
      КонецЕсли;
      тц.ДатаКИ=ТекДата+Смещ;
      ТекДата=ТекДата+Смещ+1;
    ИначеЕсли спПериоды.ТекущаяСтрока()=3 Тогда
      тц.НоваяСтрока();
      тц.ДатаНИ=ТекДата+Смещ;
      тц.ДатаКИ=КонМесяца(ТекДата)+Смещ;
      ТекДата=КонМесяца(ТекДата)+Смещ+1;
    ИначеЕсли спПериоды.ТекущаяСтрока()=6 Тогда
      тц.НоваяСтрока();
      тц.ДатаНИ=ТекДата+Смещ;
      Если тц.ДатаНИ < Дата(НачМесяца(ТекДата)+14) Тогда
        тц.ДатаКИ=НачМесяца(ТекДата)+14+Смещ;
        ТекДата=НачМесяца(ТекДата)+14+Смещ+1;
      Иначе
        тц.ДатаКИ=КонМесяца(ТекДата)+Смещ;
        ТекДата=КонМесяца(ТекДата)+Смещ+1;
      КонецЕсли;
    ИначеЕсли спПериоды.ТекущаяСтрока()=4 Тогда
      тц.НоваяСтрока();
      тц.ДатаНИ=ТекДата;
      тц.ДатаКИ=КонКвартала(ТекДата)+Смещ;
      ТекДата=КонКвартала(ТекДата)+Смещ+1;
    ИначеЕсли спПериоды.ТекущаяСтрока()=5 Тогда
      тц.НоваяСтрока();
      тц.ДатаНИ=ТекДата;
      тц.ДатаКИ=ТекДата+Смещ;
      ТекДата=ТекДата+Смещ+1;
    КонецЕсли;
    Если ТекДата>=ДатаКон Тогда
      Прервать;
    КонецЕсли;
  КонецЦикла;
КонецПроцедуры
// -------------------------------------------
8 Мулька
 
15.12.04
16:01
(7) + Смещ - это еще и смещение в днях от начала выбранного интервала
9 zzz
 
15.12.04
16:07
не советую работать с декадами. Ибо они неполные и непонятно как работать при переходе с месяца на месяц. Короче вылезет вам гимор в будущем.
10 Mobilis
 
15.12.04
16:19
(8) Это как ?
11 Мулька
 
15.12.04
16:25
Начало недели - 01.11.04, юзер хочет разбить понедельно интервал, но со смещением в 2 дня. так вот при Смещ=2 интервалы будут будет не с понедельника по воскресенье, а со вторника по понедельник
12 Mobilis
 
15.12.04
16:46
(11) Спасибо за помощь. Прикольная функция, но немного не то.
Уточню вопрос еще раз. Имеем конкретную дату (Она обязательно есть конец какой-то декады: т.е или 11, или 21 или КонецМесяца ). Интересует функция, которая бы к этой дате прибавляла декаду, т.е выдавала дату конца следующей декады, либо, соответственно, отнимала декаду.
13 SilverDemon
 
15.12.04
16:53
ТекДата='11.12.2004';
НоваяДата=ТекДата+10;
Сообщить(НоваяДата);
результат: 21.12.04
14 Mobilis
 
15.12.04
17:42
Наваял. Может кто подправит :
Шаг = 1 Вперед, -1 Назад
ДатаОтчета= обязательно дата конца произвольной декады.
      НомерТекущейДекады=Окр(ДатаЧисло(ДатаОтчета)/10,0);
      ЗначениеДекады=НомерТекущейДекады+Шаг;
      ЧислоИскомойДекады=?(ЗначениеДекады=0,3,?(ЗначениеДекады>3,1,ЗначениеДекады));
      Если Шаг>0 тогда
        НачалоИскомогоМесяца=НачМесяца(ДобавитьМесяц(ДатаОтчета,?(ЧислоИскомойДекады=1,Шаг,0)));
      Иначе
        НачалоИскомогоМесяца=НачМесяца(ДобавитьМесяц(ДатаОтчета,?(ЧислоИскомойДекады=3,Шаг,0)));
      КонецЕсли;
      ДатаОтчета=Дата(ДатаГод(НачалоИскомогоМесяца),ДатаМесяц(НачалоИскомогоМесяца),
      ?(ЧислоИскомойДекады=1,10,?(ЧислоИскомойДекады=2,21,ДатаЧисло(КонМесяца(НачалоИскомогоМесяца)))));
15 Programmer
 
15.12.04
17:55
Функция ЛистатьДекаду(ТекДата,Вперед)
Если Вперед=1 Тогда
  Если ТекДата=КонМесяца(ТекДата) Тогда
    рез=ТекДата;
  Иначе
    рез=ТекДата+10;
  КонецЕсли;
Иначе//назад
  Если ТекДата=КонМесяца(ТекДата) Тогда
    Рез=Дата("21."+Строка(ДатаМесяц(ТекДата))+"."+Строка (ДатаГод(ТекДата)));
  Иначе
    Рез=ТекДата-10;
   КонецЕсли;
возврат рез;
КонецФункции;