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

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 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    7522    bayselonarrend    20    

154

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

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

13.03.2024    5970    dsdred    16    

80

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

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

24.01.2024    17827    YA_418728146    26    

71

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23789    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14787    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	 ОтключитьОбработчикОжидания("Отсчет");
КонецПроцедуры
Показать
Оставьте свое сообщение