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

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 символа, а для дней нужно рассчитывать в зависимости числа дней, чтобы не выводить ненужные лидирующие нули.

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    37048    TitanLuchs    109    

151

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

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

03.02.2025    20577    bayselonarrend    127    

68

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

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    26315    user2122906    10    

67

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    45343    user2122906    12    

63

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

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

14.01.2025    38091    dsdred    108    

153

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

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

23.06.2024    33248    bayselonarrend    22    

178

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

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

13.03.2024    18272    dsdred    22    

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