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

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

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

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

Комментарии
Избранное Подписка Сортировка: Древо
1. dj_serega 365 15.07.16 09:23 Сейчас в теме
Хотя бы с оформлением "поигрались". Непонятно же. А вчитываться не хочется ибо не красиво :)
7. azhilichev 15.07.16 11:40 Сейчас в теме
(1) dj_serega, спасибо за замечание. Действительно, я не заметил, что из-за табов поехал текст запроса.
2. ardn 94 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 112 15.07.16 10:57 Сейчас в теме
(4) v3rter, потестил на разных датах, мой вариант точно не подходит, там специфично разница в часах и минутах считается (не округление).
6. ardn 94 15.07.16 11:31 Сейчас в теме
(4) v3rter,
Как программист я понимаю, откуда взялась лишняя :01
Но для пользователя это непонятно.
8. azhilichev 15.07.16 11:46 Сейчас в теме
(2) ardn, (6) ardn, Да, вы правы. Визуально погрешность есть. Но в целом цифры верные. Я сейчас добавил в статью информацию об этом. Соответственно, заказчика я оповестил, что есть такой нюанс. Думаю и те, кто используют код из статьи, последуют тому же примеру.
3. marat_n 112 15.07.16 10:10 Сейчас в теме
А так не пробовал?

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

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

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

Данный прием хорошо работает, если длительность периода не превышает 31 день.
10. ildarovich 6480 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 153 25.07.16 06:34 Сейчас в теме
(10) ildarovich,
Вот тут
МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах))


если ДлительностьВСекундах будет 119, тогда результат будет 1 минута.
Чисто технически это верно, но для клиента это 2 минуты.
Ну и если он сложит несколько таких строк на пальцах или в отчете, тогда потери будут несколько минут.
Или я не прав?
18. ildarovich 6480 25.07.16 11:14 Сейчас в теме
(17) Makushimo, правы, но тут все зависит от целей. Если это важно, то можно: 1) выводить время с секундами; 2) получать минуты по принципам округления (в формулу к секундам + 30 добавить); 3) складывать исходные секунды, чтобы не набегала ошибка.
Но наличие часов в результате как бы намекает, что среднее время выполнения работ - это не минуты, поэтому относительная погрешность при отбрасывании не полных минут будет невелика.
12. wolfsoft 2422 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 2384 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;

Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
Полный день

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

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству

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

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