Как я делал таймер обратного отсчета в динамическом списке на старой платформе

Программирование - Практика программирования

Обратный отсчет РазностьДат динамический список

6
В данной статье пойдет речь о том, как на практике я реализовал колонку с обратным отсчетом времени без использования обработчика "ПриПолученииДанныхНаСервере". Платформа в режиме совместимости 8.3.1, управляемые формы (не Такси).

Выражаю безмерную благодарность автору публикации

//partner.mykib.org/public/331805/

Итак, задача тривиальная - сделать счетчик обратного отсчета времени от текущей до указанной даты вида "2д. 8ч. 43 мин."

Но в силу обстоятельств конфигурация, в которой осуществлялась доработка, не функциональна при переходе на платформу 8.3.8 и выше, где появилась возможность использовать обработчик ПриПолученииДанныхНаСервере.

Поэтому мы пошли дорогой проктолога другим путем.

Этап первый - получить разницу в днях, минутах и часах в отдельные поля запроса. Чтобы не превращать текст запроса в "простыню", я вынес отдельные фрагменты текста запроса в функции, и далее динамически собирал запрос.

1. Получим разницу в секундах

ВЫБОР
    КОГДА РАЗНОСТЬДАТ(&ТекущаяДата, &КрайнийСрок, СЕКУНДА) > 0
    ТОГДА РАЗНОСТЬДАТ(&ТекущаяДата, &КрайнийСрок, СЕКУНДА)
    ИНАЧЕ 0
КОНЕЦ

Как вы, должно быть, знаете, получить целое число в запросе можно, используя метод "Выразить". Чтобы округлить вниз, отнимем 0.5. Но для того, чтобы не получить отрицательных значений, если разница отсутствует, добавим условие, что наше выражение больше 0.5.

 
Получим вот такой фрагмент:

Аналогично Вынесем фрагменты для часов и минут.

 
Логика расчета часов: Получаем полную разность в часах и целую часть разницы в днях*24
 
 Логика расчета минут: Получаем полную разность в минутах и целую часть разницы в часах*60

Далее приведем все числа к строкам. При этом, для часов и минут строка всегда будет длиной 2 символа, а для дней нужно рассчитывать в зависимости числа дней, чтобы не выводить ненужные лидирующие нули.

 
 Итоговая процедура, где происходит самое интересное

 Если писать запрос "в лоб", текст получится очень и очень длинным, но благодаря повторному использованию кода, удалось и сократить время кодирования, и не потерять читаемость.

Финальный аккорд - повесить обработчик ожидания на установку параметра динамического списка &ТекущаяДата.

Если кому-то публикация будет полезна, буду рад. Ну а нет - прошу сильно не пинать :)

6

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. pm74 128 08.11.18 10:34 Сейчас в теме
если не нужно отображать дни и месяцы то можно сделать так
 ВЫБОР
КОГДА РАЗНОСТЬДАТ(&ТекущаяДата, ДОБАВИТЬКДАТЕ(НачалоОтсчета, СЕКУНДА, ПланВремяМинут* 60), СЕКУНДА) > 0 ТОГДА 
 ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), СЕКУНДА, РАЗНОСТЬДАТ(&ТекущаяДата, ДОБАВИТЬКДАТЕ(НачалоОтсчета, СЕКУНДА, ПланВремяМинут* 60), СЕКУНДА))
ИНАЧЕ
 ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
КОНЕЦ

в поле даты дин. списка настроить формат ДФ='"осталось: " HH" ч." mm" м." ss" с."'
axelerleo; +1 Ответить
2. sanek_gk 89 09.11.18 16:30 Сейчас в теме
(1) Да даже если и с днями, вычислять два поля, но одно уменьшить к примеру на 86400 ,а в условном оформлении прописать если период1 больше одного дня то условное оформление с днями часама и т.д. для второй даты уменьшенной на сутки, а если меньше 1 дня то условное оформление для второй даты но только с часами ... вообщем можно не особо изворачиваться со сложными преобразованиями
3. pm74 128 10.11.18 22:11 Сейчас в теме
(2) не задумывался , не было такой необходимости
наверное рабочее решение
Оставьте свое сообщение