Имя: Пароль:
1C
1С v8
Подсчет количества часов между двумя значениями времени
0 LivingStar
 
01.11.13
10:14
Есть например, 2 значения времени:

7:57

21:15

как подсчитать между ними количество часов? Или для этого нужны значения не времени а дат со временем?
1 DimVad
 
01.11.13
10:16
(0) А они в каком виде, в строковом что ли ? Тогда получить дату со временем.
2 zak555
 
01.11.13
10:17
РАЗНОСТЬДАТ  ?
3 Галахад
 
гуру
01.11.13
10:17
Есть такое математическое действие - "Вычитание"
4 1dvd
 
01.11.13
10:19
(3) и деление на 60 ещё :)
5 1dvd
 
01.11.13
10:19
(0) в 8.х нет типа "Время"
6 FoxFox
 
01.11.13
10:21
Перевести в минуты, вычесть и поделить на 60
7 User_Agronom
 
01.11.13
10:21
(4) Деление на 3600 - если быть точным.
Да, (5) совершенно верно
8 Wobland
 
01.11.13
10:22
(6) тогда уж перевести в часы
9 User_Agronom
 
01.11.13
10:22
Стаж 8 лет. Мдя...
10 Wobland
 
01.11.13
10:24
(9) пятница
11 Wobland
 
01.11.13
10:25
это хорошо ещё, что автор представляет две даты одного дня. разница в часах между сегодня и 1986м годом, должно быть введёт его в ступор
12 FoxFox
 
01.11.13
10:26
(8) ну можно и в часы, разницы нет, тогда будут дроби вычитаться :)
13 pumbaEO
 
01.11.13
10:26
Время из одного часового пояса?
14 Wobland
 
01.11.13
10:27
(12) ээ... я имел в виду перевод разности в часы ;)
15 1dvd
 
01.11.13
10:28
(13) + С одной планеты?
16 BICO
 
01.11.13
10:28
Пятницо же !!
17 LivingStar
 
01.11.13
10:29
(13) да из одного
18 Wobland
 
01.11.13
10:29
(17) что надумал?
19 LivingStar
 
01.11.13
10:38
(18) Да вот берусь, думаю даты со временем нужны, и использовать


(2) Эта функция в запросе что ли применяется?
20 LivingStar
 
01.11.13
10:39
(2) мне то в коде нужно
21 alexiv79
 
01.11.13
10:44
(19) Вообще ДатаКонца - датаНачала = разность в секундах. А там дальше сам смотри - можно Цел(Разность/3600) - тогда округляешь до полных часов, если в большую сторону тогда Если Цел(Разность/3600) < Разность/3600 Тогда
КолЧасов = Цел(Разность/3600);
КонецЕсли;
Это в большую сторону 4.5 часа станут 5 часов
22 alexiv79
 
01.11.13
10:45
+(21)Вот так надо:  КолЧасов = Цел(Разность/3600)+1
23 Wobland
 
01.11.13
10:46
(22) хочешь сказать, что между полуднем и полуднем 1 час?
24 LivingStar
 
01.11.13
10:47
(21) нифига сибе!!!
25 alexiv79
 
01.11.13
10:48
(23) Нет, не хочу-непонятно, откуда такой вывод?
26 Wobland
 
01.11.13
10:48
(24) это арифметика, сынок
(25) а плохо читал
27 alexiv79
 
01.11.13
10:48
12-12 = 0. Цел(0) не меньше 0
28 alexiv79
 
01.11.13
10:50
(24) ты меня пугаешь. А это 8 лет назад впервый раз писал когда только за 7.7 сел.
29 LivingStar
 
01.11.13
10:58
ДатаКонца - датаНачала = разность

Если Цел(Разность/3600) < Разность/3600 Тогда
   КолЧасов = Цел(Разность/3600)+1;
КонецЕсли;

так что ли?
30 Wobland
 
01.11.13
11:03
(29) нет
31 Serg_1960
 
01.11.13
11:23
Разность = Макс(ДатаКонца, ДатаНачала) - Мин(ДатаКонца, ДатаНачала);
КолЧасов  = Цел(Разность*(1/3600));
КолМинут  = Цел((Разность-КолЧасов)*...
КолСекунд = ...


Тяпница удалась :)
32 LivingStar
 
01.11.13
11:42
(31) Спасибо, нужно попробовать!
33 LivingStar
 
05.11.13
05:53
(31) А что не дописанно по минутам у вас там не понятно?

(21) ДатаКонца, ДатаНачала - это у вас какие типы данных?
34 1dvd
 
05.11.13
08:14
(33) ну, пораскинь остатками моска.

Разность = Макс(ДатаКонца, ДатаНачала) - Мин(ДатаКонца, ДатаНачала);
КолЧасов  = Цел(Разность / 3600);
КолМинут  = Цел((Разность % 3600) / 60);
КолСекунд = Разность % 60;
35 LivingStar
 
05.11.13
08:42
(34) спасибо!

Результаты первого тестирования:

ДатаНачала: 02.10.2013 14:29:02
ДатаКонца0: 2.10.2013 0:56:22

разность:   48 760

часы:       13
минуты:     32
секунды:    40


Как думаете верны ли полученные данные? Поку думаю продолжать тестирование...
36 1dvd
 
05.11.13
08:50
(35) проверь хорошенько. Вдруг холодная машина ошибается...
37 Wobland
 
05.11.13
08:51
(35) голосовалку!
38 Serg_1960
 
05.11.13
09:06
(31) *
В первой строке - "защита от дурака". Даты произвольные и далеко не факт, что первая дата ранее второй.
Во второй строке - защита от случая, когда даты - одинаковые. В третьей строке - пятничная шутка :) Сам посуди: что будет если от секунд отнять количество часов?
39 1dvd
 
05.11.13
09:19
(38) >>Во второй строке - защита от случая, когда даты - одинаковые

ага. ага. не отмазывайся - не военкомат
40 Ненавижу 1С
 
гуру
05.11.13
09:21
какая то нереальная жесть в формуле:

КолЧасов  = Цел(Разность*(1/3600));
41 LivingStar
 
05.11.13
10:29
Ну вот очередные примеры, я думаю не корректно считает !!!

    Разность = Макс(СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента, СтрПромеж.ДатаПоявленияУПервогоКонтрагента) - Мин(СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента, СтрПромеж.ДатаПоявленияУПервогоКонтрагента);
                КолЧасов  = Цел(Разность / 3600);
                КолМинут  = Цел((Разность % 3600) / 60);
                КолСекунд = Разность % 60;                



СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента    03.10.2013 2:14:47
СтрПромеж.ДатаПоявленияУПервогоКонтрагента    03.10.2013 1:32:38
Разность    2 529
КолЧасов    0
КолМинут    42
КолСекунд    9



СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента    04.10.2013 8:31:56
СтрПромеж.ДатаПоявленияУПервогоКонтрагента    04.10.2013 2:01:46
Разность    23 410
КолЧасов    6
КолМинут    30
КолСекунд    10



СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента    07.10.2013 11:39:00
СтрПромеж.ДатаПоявленияУПервогоКонтрагента    07.10.2013 1:56:35
Разность    34 945
КолЧасов    9
КолМинут    42
КолСекунд    25



СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента    08.10.2013 6:25:33
СтрПромеж.ДатаПоявленияУПервогоКонтрагента    08.10.2013 1:12:42
Разность    18 771
КолЧасов    5
КолМинут    12
КолСекунд    51
42 Ненавижу 1С
 
гуру
05.11.13
10:31
(41) почему ты так решил?
43 LivingStar
 
05.11.13
10:32
(41)

в первом примере не понятно, похоже на круговой проход времени

во втором примере видно, что больше 6 часов в любом случае, если бы это были разные дни, но там один и тот же день, так что тоже не понятно...


вижу что все примеры не корректные, там везде меняется день
44 LivingStar
 
05.11.13
10:34
(42) извиняюсь, это я не так считал.... похоже считает, но не совсем точно да?
45 Ненавижу 1С
 
гуру
05.11.13
10:34
(44) нет
46 LivingStar
 
05.11.13
10:35
(42) ну или нормально да? нужно больше тестирования проводить и более точно рассматривать результат

(45) "нет", это вы про что?
47 1dvd
 
05.11.13
10:36
(46) "нет" - это значит, что считает точно
48 Ненавижу 1С
 
гуру
05.11.13
10:37
(46) нужно мозг включить
49 LivingStar
 
05.11.13
10:37
(47) Ясно!!! Спасибо за формулу, продолжаю тестирование!!! Я вот такую находил функцию, но не обратил сразу внимание что часов то там нет!!!

    Разность = Макс(СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента, СтрПромеж.ДатаПоявленияУПервогоКонтрагента) - Мин(СтрПромеж.ДатаПоявленияУПоследнегоКонтрагента, СтрПромеж.ДатаПоявленияУПервогоКонтрагента);
                КолЧасов  = Цел(Разность / 3600);
                КолМинут  = Цел((Разность % 3600) / 60);
                КолСекунд = Разность % 60;
50 LivingStar
 
05.11.13
10:39
(49+) Опечатался, вот такую:

?// №12 Процедура вычисляет количество лет, месяцев и дней между двумя датами
//
// Параметры
//  Дата1    – дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
//  Дата2    – дата, вторая дата (ранняя дата, с нее начинается "течение" стажа)
//  Лет        – Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
//  Месяцев    – Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
//  Дней    – Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
    Лет     = 0;
    Месяцев = 0;
    Дней    = 0;
    Если Дата1 > Дата2 Тогда
        ВременнаяДата = Дата1;
        Если День(ВременнаяДата) < День(Дата2) Тогда
            Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата, -1)) / 86400;
            ВременнаяДата = ДобавитьМесяц(ВременнаяДата, - 1);
        КонецЕсли;
        Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
            ВременнаяДата = ДобавитьМесяц(ВременнаяДата, - 12);
            Месяцев       = 12;
        КонецЕсли;
        Лет     = Макс(Год(ВременнаяДата)- Год(Дата2),                         0);
        Месяцев = Макс(Месяцев           + Месяц(ВременнаяДата) - Месяц(Дата2),0);
        Дней    = Макс(Дней                 + День(ВременнаяДата)  - День(Дата2), 0);
        // скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах
        Если Дата2 <> (ДобавитьМесяц(Дата1, - Лет * 12 - Месяцев) - Дней * 86400) Тогда
            Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1, - 1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1, - 1))));
        КонецЕсли;
    КонецЕсли;