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

07.11.18

Разработка - Механизмы платформы 1С

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

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

//infostart.ru/public/331805/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Механизмы платформы 1С Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    7198    bayselonarrend    126    

61

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    10089    dsdred    62    

111

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    14313    bayselonarrend    21    

164

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    8545    dsdred    18    

82

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    31172    YA_418728146    33    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pm74 203 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 104 09.11.18 16:30 Сейчас в теме
(1) Да даже если и с днями, вычислять два поля, но одно уменьшить к примеру на 86400 ,а в условном оформлении прописать если период1 больше одного дня то условное оформление с днями часама и т.д. для второй даты уменьшенной на сутки, а если меньше 1 дня то условное оформление для второй даты но только с часами ... вообщем можно не особо изворачиваться со сложными преобразованиями
3. pm74 203 10.11.18 22:11 Сейчас в теме
(2) не задумывался , не было такой необходимости
наверное рабочее решение
4. user1909675 27.03.23 15:13 Сейчас в теме
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    //Вставить содержимое обработчика
    ПодключитьОбработчикОжидания("Отсчет",1);
КонецПроцедуры

&НаКлиенте
Процедура Отсчет()
	
	НовыйГод = Дата("24.12.2023 00:00:00");  
	Часов = НачалоДня(текущаяДата()) - ТекущаяДата();
	Осталось = ТекущаяДата() - НовыйГод;
	Текст = Цел((Осталось / (3600 * 24) * (-1))) ; 
    Текст1 = Окр(24 - (Часов / 3600 * (-1)),0,1) ;
	Текст2 = Окр(((24 - (Часов / 3600 * (-1)) - Текст1) * 60),0,1) ;
 

    Элементы.Надпись.Заголовок = "До Нового года: осталось " + Текст + " дней " + Текст1 + " часов " + Текст2 + " минут " ;    

КонецПроцедуры


&НаКлиенте
Процедура ПередЗакрытием1(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	 ОтключитьОбработчикОжидания("Отсчет");
КонецПроцедуры
Показать
Оставьте свое сообщение