Имя: Пароль:
1C
 
Число периодов между двумя датами?
0 Zlodey1С
 
11.05.09
13:17
Можно как то узнать сколько периодов(день, недель, декад, месяцев и т.д) между двумя датами?
1 Immortal
 
11.05.09
13:23
мм..календарных или каких?
2 Zlodey1С
 
11.05.09
13:25
календарных, есть две даты надо найти сколько между ними периодов
3 AlinKabaev
 
11.05.09
13:26
(Дата2 - Дата1) / ЧислоСекундВПериоде )))))))))
4 IronDemon
 
11.05.09
13:27
Функция РАЗНОСТЬДАТ
Функция предназначена для получения разницы между двумя датами.

Первый параметр — выражение типа Дата;

Второй параметр — выражение типа Дата;

Третий параметр – тип разности, одно из: Секунда, Минута, Час, День, Месяц, Квартал, Год.
5 Ненавижу 1С
 
гуру
11.05.09
13:27
сначала формальное понятие функции на входе которой 2 даты, на выходе число периодов дайте
6 AlinKabaev
 
11.05.09
13:32
zlodey - злой гений? ))
7 Zlodey1С
 
11.05.09
13:35
_ДатаНач=УниверсальныйОтчет.ДатаНач;
   _ДатаКон=УниверсальныйОтчет.ДатаКон;
   
   числоПодпериодов=0;
   Если Периодичность=Перечисления.Периодичность.День Тогда
       числоПодпериодов    =    ?(Цел(((_ДатаКон-_ДатаНач)/86400))<1,1,Цел(((_ДатаКон-_ДатаНач)/86400)));       // День
   ИначеЕсли  Периодичность=Перечисления.Периодичность.Неделя Тогда
       числоПодпериодов    =    ?(Цел(((_ДатаКон-_ДатаНач)/604800))<1,1,Цел(((_ДатаКон-_ДатаНач)/604800)));     // Неделя
   ИначеЕсли  Периодичность=Перечисления.Периодичность.Неделя Тогда
       числоПодпериодов    =    ?(Цел(((_ДатаКон-_ДатаНач)/864000))<1,1,Цел(((_ДатаКон-_ДатаНач)/864000)));     // Декада
   ИначеЕсли  Периодичность=Перечисления.Периодичность.Неделя Тогда
       числоПодпериодов    =    ?(Цел(((_ДатаКон-_ДатаНач)/2592000))<1,1,Цел(((_ДатаКон-_ДатаНач)/2592000)));   // Месяц
   ИначеЕсли  Периодичность=Перечисления.Периодичность.Неделя Тогда
       числоПодпериодов    =    ?(Цел(((_ДатаКон-_ДатаНач)/7776000))<1,1,Цел(((_ДатаКон-_ДатаНач)/7776000)));      // Квартал
   ИначеЕсли  Периодичность=Перечисления.Периодичность.Неделя Тогда
       числоПодпериодов    =    ?(Цел(((_ДатаКон-_ДатаНач)/15724800))<1,1,Цел(((_ДатаКон-_ДатаНач)/15724800))); // Полугодие
   ИначеЕсли  Периодичность=Перечисления.Периодичность.Неделя Тогда
       числоПодпериодов    =    ?(Цел(((_ДатаКон-_ДатаНач)/31536000))<1,1,Цел(((_ДатаКон-_ДатаНач)/31536000))); // Год
   КонецЕсли;    
   
   сч=0;
   
   Пока Не числоПодпериодов < сч Цикл
        сч=сч+1;
        НоваяСтрока = пТаблицаИнтервалов.Добавить();
        НоваяСтрока.ИмяИнтервала    = СтрокаТабЧасти.Подпись;
        НоваяСтрока.НомерИнтервала  = СтрокаТабЧасти.НомерСтроки;
        НоваяСтрока.НачалоИнтервала = НачалоДня(УниверсальныйОтчет.ДатаКон) - ?????? сч * 60 * 60 * 24;
        НоваяСтрока.КонецИнтервала  = КонецДня(УниверсальныйОтчет.ДатаКон)  - ?????? СтрокаТабЧасти.КонецИнтервала  * 60 * 60 * 24;
   КонецЦикла


туплю ппц, че дальше делать не могу сообразить
8 Zlodey1С
 
11.05.09
13:38
короче надо получить таблицу с интервалами. Пользователь выберает периодичность и даты нач и кон. Число интервалов должно расчитаться на основании этих дат в соответствии с периодичностью. Отдыхать не как нельзя 3 дня, мозг расслабляется и не хочет запускаться.
9 Kyrales
 
11.05.09
19:18
че это за хрень? зачем это надо?
10 nbIx
 
11.05.09
19:40
Посмотри как стаж считается в ЗиКе или ЗУПе, Ведь число дней можно посчитать просто, а вот число месяцев или лет хрен посчитаешь.
Надо знать точку "Ч"
11 Oleg_Kag
 
11.05.09
19:43
(7)чувак у тебя в Периодичность лежит значение Перечисление.Периодичность.Бла-Бла-Бла...
Вот и вытаскиваай этот "бла-бла-бла".
P.S. "Хинт ушами" в Перечисление.Периодичность, ЕСЛИ не столь важен комментарий значений, и в дальнейшем его не нужно "красиво" использовать, то ложи кол-во секунд прямо в "Комментарий", потом вытянешь...
12 Гений 1С
 
гуру
11.05.09
20:56
Все уже написано до вас. Надо тщательнее изучать библиотеку функций. ыггыгы.

Функция ПериодыЗаИнтервал(Начало, Конец, Периодичность="День", ВыравниваниеПоПериоду=истина)Экспорт
   //Назначение: Вычисляет даты начала/конца периодов за интервал в виде таблицы значений
   //ДатаСоздания: 20070823
   //Автор: Fixin
   //Тестирована: Частично (Для дня, месяца и недели)
   //$Начало: Начало периода
   //$Конец: Конец периода
   //$Возврат: Возвращает таблицу значений
   //$Возврат.Колонки.Начало: Начало интервала
   //$Возврат.Колонки.Конец: Конец интервала
   //$Возврат.Колонки.Номер: Номер интервала (начиная с единицы)
   //$Периодичность - строка "День", "Месяц", "Неделя", "Год", "Квартал"
   
   Перем Р, Номер, ТекПериод, СледПериод;
   Р=Новый ТаблицаЗначений();
   Р.Колонки.Добавить("Начало", Новый ОписаниеТипов("Дата"));
   Р.Колонки.Добавить("Конец", Новый ОписаниеТипов("Дата"));
   Р.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(12,0)));
   
   ТекПериод=Начало;
   Номер=1;
   Пока истина Цикл
       Если Периодичность="День" Тогда
           Если ВыравниваниеПоПериоду Тогда
               ТекПериод=НачалоДня(ТекПериод);
               СледПериод=КонецДня(ТекПериод);
           Иначе
               СледПериод=ДобавитьДни(ТекПериод, 1);
           КонецЕсли;
       ИначеЕсли Периодичность="Месяц" Тогда
           Если ВыравниваниеПоПериоду Тогда
               ТекПериод=НачалоМесяца(ТекПериод);
               СледПериод=КонецМесяца(ТекПериод);
           Иначе
               СледПериод=ДобавитьМесяцы(ТекПериод, 1);
           КонецЕсли;
       ИначеЕсли Периодичность="Год" Тогда
           Если ВыравниваниеПоПериоду Тогда
               ТекПериод=НачалоГода(ТекПериод);
               СледПериод=КонецГода(ТекПериод);
           Иначе
               СледПериод=ДобавитьМесяцы(ТекПериод, 12);
           КонецЕсли;
       ИначеЕсли Периодичность="Квартал" Тогда
           Если ВыравниваниеПоПериоду Тогда
               ТекПериод=НачалоКвартала(ТекПериод);
               СледПериод=КонецКвартала(ТекПериод);
           Иначе
               СледПериод=ДобавитьМесяцы(ТекПериод, 3);
           КонецЕсли;
       ИначеЕсли Периодичность="Неделя" Тогда
           Если ВыравниваниеПоПериоду Тогда
               ТекПериод=НачалоНедели(ТекПериод);
               СледПериод=КонецНедели(ТекПериод);
           Иначе
               СледПериод=ДобавитьДни(ТекПериод, 7);
           КонецЕсли;
       ИначеЕсли Периодичность="Весь" Тогда
           Если ВыравниваниеПоПериоду Тогда
               ТекПериод=НачалоДня(ТекПериод);
           КонецЕсли;
           СледПериод=КонецДня(Конец);
       Иначе
           ВызватьИсключение "Неизвестная периодичность времени:"+Периодичность;
       КонецЕсли;
       Если ТекПериод>Конец И НЕ Номер=1 Тогда
           Прервать;
       КонецЕсли;
       
       Стр=Р.Добавить();
       Стр.Начало=ТекПериод;
       Стр.Конец=СледПериод;
       Стр.Номер=Номер;
       ТекПериод=СледПериод+1; //Переходим на следующий период (добавляем одну секунду)
       Номер=Номер+1;
   КонецЦикла;
   Возврат Р;
КонецФункции
13 Гений 1С
 
гуру
11.05.09
20:56
http://infostart.ru/projects/2024/
(Это ссылка на библиотеку, если кто еще в танке)
14 Serg_1960
 
11.05.09
22:46
(12) Исчезни в... оптимизацию :) Нафиг в цикле каждый раз "Если Периодичность..." :(
15 Zlodey1С
 
26.05.09
07:01
Забыл всем сказать большое спасибо.
(12) Отдельное спасибо.
16 ASU_Diamond
 
26.05.09
07:50
Интересно зачем обрабатывать
       ИначеЕсли Периодичность="Весь" Тогда
в цикле?
17 Zlodey1С
 
26.05.09
07:59
(16) Незнаю, все что мне надо я взял, все лишнее убрал. Гению наверное для своих целей понадобилось.
18 ASU_Diamond
 
26.05.09
08:11
(17) мне кажется что определять количество дней и недель через цикл будет долго, это лучше делать делением
19 Zlodey1С
 
26.05.09
08:29
(18) Не заметил. Год ставил все нормально считает, только если вы поставите период год, а периодичность день, у вас запросик будет веселинький
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший