0. azhilichev 15.07.16 04:19 Сейчас в теме

Как в запросе 1С преобразовать секунды в часы и минуты

Скорее всего, каждый профессиональный разработчик 1С сталкивался с ситуацией, когда заказчик хочет необычное, нестандартное и удобное решение задачи. Ответы на многие вопросы можно найти в Интернете. Но не на все. И иногда для решения задачи приходится мыслить не совсем стандартно. Ну и нахождение решений для подобных задач повышает статус разработчика в глазах заказчика, повышает самооценку самого разработчика, и, самое приятное, позволяет заработать деньги. В этой статье я поделюсь опытом решения одной такой задачи.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. dj_serega 367 15.07.16 09:23 Сейчас в теме
Хотя бы с оформлением "поигрались". Непонятно же. А вчитываться не хочется ибо не красиво :)
7. azhilichev 15.07.16 11:40 Сейчас в теме
(1) dj_serega, спасибо за замечание. Действительно, я не заметил, что из-за табов поехал текст запроса.
2. ardn 95 15.07.16 09:59 Сейчас в теме
На последнем скрине в первом посту 1:00 и 0:01, дали в сумме 1:02.
Этому отчету можно верить?
4. v3rter 15.07.16 10:25 Сейчас в теме
(2) ardn, видимо на входе отчета даты с секундами и в сумме эти секунды дают больше минуты. Интересно было бы посмотреть при ЧДЦ=4
(3) marat_n, а не будет ситуации, когда округление (до минут) суммы не совпадает с суммой округленных?
5. marat_n 110 15.07.16 10:57 Сейчас в теме
(4) v3rter, потестил на разных датах, мой вариант точно не подходит, там специфично разница в часах и минутах считается (не округление).
6. ardn 95 15.07.16 11:31 Сейчас в теме
(4) v3rter,
Как программист я понимаю, откуда взялась лишняя :01
Но для пользователя это непонятно.
8. azhilichev 15.07.16 11:46 Сейчас в теме
(2) ardn, (6) ardn, Да, вы правы. Визуально погрешность есть. Но в целом цифры верные. Я сейчас добавил в статью информацию об этом. Соответственно, заказчика я оповестил, что есть такой нюанс. Думаю и те, кто используют код из статьи, последуют тому же примеру.
3. marat_n 110 15.07.16 10:10 Сейчас в теме
А так не пробовал?

РАЗНОСТЬДАТ(Событие.НачалоСобытия, Событие.ОкончаниеСобытия, ЧАС) КАК ДлительностьЧасов,
РАЗНОСТЬДАТ(Событие.НачалоСобытия, Событие.ОкончаниеСобытия, МИНУТА)
 -РАЗНОСТЬДАТ(Событие.НачалоСобытия, Событие.ОкончаниеСобытия, ЧАС)*60  КАК ДлительностьМин
9. sdf1979 70 15.07.16 13:12 Сейчас в теме
Я обычно, если требуется последующий вывод на форму или в отчет, длительность времени выражаю везде в секундах.
Вывод времени осуществляю с помощью форматирования даты:
Для длительности меньше часа:
ДФ='мм'' мин'''

Для длительности меньше суток
ДФ='ЧЧ''ч ''мм''мин'''

Для длительности меньше месяца
ДФ='дд''сут ''ЧЧ''ч ''мм''мин'''

Данный прием хорошо работает, если длительность периода не превышает 31 день.
10. ildarovich 6721 15.07.16 13:57 Сейчас в теме
Все же есть гораздо более простое выражение для решения той же задачи:
РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах), ЧАС) 
	+ МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах)) / 100

Вот запрос для проверки:
ВЫБРАТЬ
	&ДлительностьВСекундах,
	РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах), ЧАС) 
	+ МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах)) / 100 КАК ДробноеЧисло
Хитрость в том, что секунды добавляются к началу времен, чтобы минуты и часы были "целыми".
Посмотрите еще Выразить число как строку и дату как строку в запросе. так как этот прием оттуда.
manlak; kare; serg_infostart; h00k; BigClock; Irwin; Yashazz; Dach; ZOMI; kuzyara; METAL; dgolovanov; K_A_O; NeviD; azhilichev; bulpi; +16 Ответить
11. azhilichev 15.07.16 14:38 Сейчас в теме
(10) ildarovich, Действительно, это даже лучше того, что я сделал. Спасибо, если не возражаете, добавлю в тело статьи.
17. Makushimo 154 25.07.16 06:34 Сейчас в теме
(10) ildarovich,
Вот тут
МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах))


если ДлительностьВСекундах будет 119, тогда результат будет 1 минута.
Чисто технически это верно, но для клиента это 2 минуты.
Ну и если он сложит несколько таких строк на пальцах или в отчете, тогда потери будут несколько минут.
Или я не прав?
18. ildarovich 6721 25.07.16 11:14 Сейчас в теме
(17) Makushimo, правы, но тут все зависит от целей. Если это важно, то можно: 1) выводить время с секундами; 2) получать минуты по принципам округления (в формулу к секундам + 30 добавить); 3) складывать исходные секунды, чтобы не набегала ошибка.
Но наличие часов в результате как бы намекает, что среднее время выполнения работ - это не минуты, поэтому относительная погрешность при отбрасывании не полных минут будет невелика.
12. wolfsoft 2420 20.07.16 07:49 Сейчас в теме
А так не проще?

ДобавитьКДате(ДатаВремя(1, 1, 1), Секунда, РАЗНОСТЬДАТ(<Дата1>, <Дата2>, Секунда))

Плюс формат вывода значения в ячейке "Ч:мм".
14. azhilichev 20.07.16 15:46 Сейчас в теме
(12) wolfsoft, не проще. Часов у вас может быть больше 24. А ДобавитьКДате() будет в дни их преобразовывать. Представьте. 10 постов по 12 рабочих часов каждый. Общее время 120 часов. Это в сутки норма времени на все посты. Сами понимаете, что формат даты такого не даст сделать.
19. Sobol007 17 11.05.18 12:24 Сейчас в теме
(12)
ДобавитьКДате(ДатаВремя(1, 1, 1), Секунда, РАЗНОСТЬДАТ(, , Секунда))


Вроде простой и понятный вариант, но показывает время в СКД неверное:

Время начала: 26.04.2018 13:29:57 - Время завершения: 26.04.2018 13:35:51

Разность дат дает: 354 секунды.

СКД показывает результат 00:01:24, хотя если поделить на 60 получится 5,9 минут
20. spacecraft 11.05.18 12:42 Сейчас в теме
(19) это точно не проблема СКД. Все правильно считается.
Прикрепленные файлы:
13. serega_new 20.07.16 09:18 Сейчас в теме
не понял весь дзен этой статьи, ну провел он посту 40 минут, ну 30 минут еще дополнительных работ, ну зафиксировали 70 минут и показали в отчете 1:10, хоть на скд, хоть просто выводом в табл. документ...
15. Yashazz 2854 22.07.16 13:03 Сейчас в теме
Во, наконец-то пришёл Ильдарович и показал, как надо)
16. ka3a4ok 23.07.16 22:59 Сейчас в теме
хм... я бы сделал так:

ВЫБРАТЬ
ВЫРАЗИТЬ(ВЫРАЗИТЬ(&КоличествоСекунд / 60 КАК Число(15,0)) / 60 - 0.5 КАК Число(15, 0)) + (ВЫРАЗИТЬ(&КоличествоСекунд / 60 КАК Число(15,0)) / 60 - ВЫРАЗИТЬ(ВЫРАЗИТЬ(&КоличествоСекунд / 60 КАК Число(15,0)) / 60 - 0.5 КАК Число(15, 0))) / 100 * 60 КАК ЧасыМинуты


аналогичный код:

КолМин = Окр(КоличествоСекунд / 60);
ЧасыМинуты = Цел(КолМин / 60) + (КолМин / 60 - Цел(КолМин / 60)) / 100 * 60;

21. Sergey_Borisovi4 06.08.19 20:00 Сейчас в теме
Если отчет на СКД, то еще проще в ресурсах указать в выражении:
Формат(Сумма(Часов)-ВЫБОР КОГДА Сумма(Часов) > 0 ТОГДА 0.5 ИНАЧЕ 0 КОНЕЦ,"ЧН=0; ЧДЦ=0")+":"+Формат((Сумма(Часов)-выразить(Сумма(Часов)-ВЫБОР КОГДА Сумма(Часов) > 0 ТОГДА 0.5 ИНАЧЕ 0 КОНЕЦ,"Число(10,0)")) * 60,"ЧЦ=2; ЧН=00; ЧВН=")
megaZ; DMak; +2 Ответить
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Нижний Новгород
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день