Имя: Пароль:
1C
1С v8
Как округлить дату по кратности?
0 manking
 
16.11.15
12:50
Добрый день.

Например
В этой функции дата округляется с кратностью 1.
То есть если ЕдиницаИзмерения  час, то время 12:45 округлится до 12:00.
Но как задать кратность, чтобы при кратности 2, время округлялось через 2 часа, 12:00 , 14:00 , 16:00.  При кратности 3 12:00 , 15:00 , 18:00.

&НаКлиенте
Функция ОкруглитьДату(Дата , ЕдиницаИзмерения , Кратность)
    
НоваяДата =Дата;    
Если  ЕдиницаИзмерения= "Час" Тогда
Час= Час(Дата);
НоваяДата = НачалоДня(Дата)+ (((3600)*(Час)));
ИначеЕсли ЕдиницаИзмерения= "День" Тогда
День= День(Дата);
НоваяДата = НачалоДня(Дата)+ (((86400)*(День)));
КонецЕсли;

// Кратность
          
Возврат НоваяДата;
КонецФункции
1 Горогуля
 
16.11.15
12:51
это надо программировать
2 1Сергей
 
16.11.15
12:52
(1) самую малость
3 Гёдза
 
16.11.15
12:53
сначала научись число округлять до 3
4 Гёдза
 
16.11.15
12:53
т.е 13 нужно округлить до 15
5 Ненавижу 1С
 
гуру
16.11.15
12:54
непонятно:
1. округлять или брать целое?
2. Час= Час(Дата);
(((3600)*(Час)))
3. не дату, а интервал времени
4. если часов 25, то функция вернет несколько иное

в целом:
Окр(Значение/Кратность)*Кратность
или
Цел(Значение/Кратность)*Кратность
6 Ненавижу 1С
 
гуру
16.11.15
12:54
(4) почему не до 12?
7 1Сергей
 
16.11.15
12:54
(6) +1
8 butterbean
 
16.11.15
12:56
НачалоДня(Дата)+3600*Цел(Час(Дата)/Кратность)*Кратность
9 Горогуля
 
16.11.15
12:58
там ещё единица измерения. предлагаю запросом
10 Фокусник
 
16.11.15
12:59
(0) Определить количество секунд (например от начала дня), количество секунд разделить до нужного "кванта времени" - это значение округлить до целых, вернуть в секунды, вернуть в дату...
11 DexterMorgan
 
16.11.15
13:07
(9) пипец, уже дошли до того, что сервер даты округлять будет, делать ему нечего совсем, ога
12 Ненавижу 1С
 
гуру
16.11.15
13:08
(11) ну у меня округляет количество и суммы, ничего, не заржавел
13 DexterMorgan
 
16.11.15
13:08
(11) Причем нах сервер преприятия, сервер скл!
14 Ненавижу 1С
 
гуру
16.11.15
13:08
(13) именно он
15 DexterMorgan
 
16.11.15
13:08
(12) В рамках задачи ТОЛЬКО округления даты - это бред
16 DexterMorgan
 
16.11.15
13:09
(14) Красавчик
17 Ненавижу 1С
 
гуру
16.11.15
13:10
(15) на самом деле он округляет не даты, а интервалы времени, ближе всего тип TimeSpan в .NET
18 DexterMorgan
 
16.11.15
13:13
(17) да молодец, ч0, количество на цену перемножаешь тоже запросом? не из Челябинска? Больно суров ты
19 Ненавижу 1С
 
гуру
16.11.15
13:14
(18) а че в том такого, я еще на курсы валют умножаю и на кратности делю, так-то
20 DexterMorgan
 
16.11.15
13:14
(19) При обработке текущей строки тч? =)
21 Ненавижу 1С
 
гуру
16.11.15
13:16
(20) в основном в отчетах
22 DexterMorgan
 
16.11.15
13:17
(21) А че при изменении количества в строке тч так не делать? Ч0бынет?
23 manking
 
16.11.15
13:46
Сделал так. Вроде нормально работает.

Задача в том, чтобы дата липла к ближайшему интервалу в соответствии с кратностью, которую задает пользователь. Чтобы хранить даты в ассоциативном массиве в меньшем количестве. Если кратность 2 для часа, то на один день будет только 12 записей , если 3 то 7.

&НаКлиенте
Функция ОкруглитьДату(Дата , ЕдиницаИзмерения , Кратность)
    
НоваяДата =Дата;
Если ЕдиницаИзмерения= "Минута" Тогда
НоваяДата=    НачалоЧаса(Дата)+ ((Цел((Минута(Дата))/Кратность)*Кратность)*60);
ИначеЕсли  ЕдиницаИзмерения= "Час" Тогда
НоваяДата=    НачалоДня(Дата)+3600*Цел((Час(Дата))/Кратность)*Кратность;
ИначеЕсли ЕдиницаИзмерения= "День" Тогда
НоваяДата=    НачалоМесяца(Дата)+ ((Цел((День(Дата))/Кратность)*Кратность)*86400);
КонецЕсли;
  
Возврат НоваяДата;
КонецФункции  


Дата_= '20151116133000';
        
ЕдиницаИзмерения = "День";
НоваяДата=ОкруглитьДату(Дата_ , ЕдиницаИзмерения , 2);
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший