[Механизм интерфейса] Часы

Добавляем цифровые часы на форму, как бонус рассмотрим вариант и с аналоговыми.

Добрый день, Коллеги!

 

Задача

Необходимо на терминал вывести в заголовок "цифровые часы".

 

Проблема

Для реализации использовал реквизит формы «Время» (состав даты – время) и обработчик ожидания, который раз в секунду обновлял время. Программный код ниже.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Время = ТекущаяДата();

ПодключитьОбработчикОжидания("ОбновитьВремя", 1);

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



&НаКлиенте

Процедура ОбновитьВремя()

Время = ТекущаяДата();

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

Но так как на терминале используются поля для ввода данных, при попытке что-либо в них написать наблюдалось странное поведение – вводимые данные не сохранялись, и неожиданно обнулялась вводимая информация.

 

Решение

Причина была в обработчике ожидания. Решением проблемы является использование поля HTML и вывода времени в него. Демонстрация ниже.

 

Разработка

Алгоритм вывода времени

 //infostart.ru/upload/iblock/c60/c60641c5caab5b8a59cccc4433dad40f.jpgСоздаем реквизит «ВремяХТМЛ» тип строка (0). //infostart.ru/upload/iblock/c60/c60641c5caab5b8a59cccc4433dad40f.jpgПереносим его на форму и настраиваем //infostart.ru/upload/iblock/c60/c60641c5caab5b8a59cccc4433dad40f.jpg. Необходимо указать вид, отключить заголовок и цвет рамочки для красоты сделать схожим с цветом формы, а вертикальную полосу прокрутки уберём позже.

Реквизит и элемент формы готовы //infostart.ru/upload/iblock/c60/c60641c5caab5b8a59cccc4433dad40f.jpg. Теперь необходим алгоритм. В интернете не сложно найти готовый javascript, останется только настроить css стили.

Определяем при старте формы вызов функции по формированию времени:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

УстановитьВремяХТМЛ();

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

Формируем html-код страницы (уже здесь и пропишем скрытие вертикальной полосы прокрутки):

 

 Код функции "УстановитьВремяХТМЛ"

Цвет часов вынесен отдельно и мы можем привести заголовок к общему стилю.

 

 Немного о цвете…

 

PS:

Так же можно вывести на форму аналоговые часы. Практически готовый алгоритм html-страницы можно взять на сайте https://codepen.io/, демонстрация одного из алгоритмов ниже.

 

 Текст HTML-страницы "Аналоговые часы в 1С"

 

Всем удачного кодинга!

31 Comments

  1. greenLiss

    Я наверное глупость скажу, но…

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания(«УстановитьВремя»,1);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура УстановитьВремя()
    ЭтаФорма.Заголовок = «Заголовок «+Строка(Формат(ТекущаяДата(),»ДЛФ=T»)); //Заголовок формы
    Элементы.Часы.Заголовок = «Заголовок «+Строка(Формат(ТекущаяДата(),»ДЛФ=T»)); //Декорация-надпись
    КонецПроцедуры
    

    Показать

    Reply
  2. 🅵🅾️🆇

    (1) Сам собрался написать про обработчик ожидания)

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

    Reply
  3. greenLiss

    (2) ну там вроде проблема была, что при срабатывании обработчика ожидания введенный текст сбрасывался… Но если изменять не реквизит формы, а элемент формы или заголовок, то всё норм.

    Reply
  4. Tria

    (1) Вообще-то в начале статьи автор как раз и описал решение с обработчиком ожидания и проблемы такого решения.

    Reply
  5. greenLiss

    (4) Так в том-то и проблема, что нет проблемы…

    Reply
  6. spacecraft

    (1) И? Как я понял статью, там упор делался решение проблемы: сброс вводимого текста в поле ввода при подключаемом обработчике ожидания.

    Ваш код так же сбрасывает вводимый текст при установке «времени». Форма обновляется и вводимый текст сбрасывается.

    Reply
  7. greenLiss

    (6) Я проверил, не сбрасывается, обработка прикреплена к первому комментарию, можете скачать и тоже проверить.

    Reply
  8. spacecraft

    (7) так я ее и проверил. Сбрасывается. 1С:Предприятие 8.3 (8.3.13.1690)

    Reply
  9. greenLiss

    (8) Я делал на 1С:Предприятие 8.3 (8.3.15.1489), может позже гляну на 13, даже интересно.

    Reply
  10. greenLiss

    (8) Нашел установленную 13 версию, и правда, сбрасывается…

    Ну что можно сказать, тут только словами Фирмы 1С, «Попробуйте обновить платформу до актуального релиза» XD

    Reply
  11. rpgshnik

    (8) всё верно, именно на этой платформе и веду разработку

    Reply
  12. rpgshnik

    В публикации демонстрируется функционал цифровых часов на платформе 8.3.13.1690. Функционал аналоговых на платформе 8.3.15.1534 (причина новый движок для HTML).

    Проверил вариант комментария (1), на нескольких боевых платформах и тестовой (15-й). Поведение странное. Назовём мой первоначальный вариант — «Реквизит», а предложенный «Декорация».

    Результат:

    8.3.13.1690

    Реквизит — Обнуляет поле ввода

    Декорация — Обнуляет поле ввода

    8.3.14.1694

    Реквизит — Обнуляет поле ввода

    Декорация — Обнуляет поле ввода

    8.3.15.1534

    Реквизит — Обнуляет поле ввода

    Декорация — Работает

    Забавно, ну ок. Пока нет боевой платформы 8.3.15.

    Файл обработки прилагаю

    Reply
  13. CSiER

    Дело в фокусе — чтобы решить проблему, нужно в обработчик добавить Элементы.Текст1.ВыделенныйТекст = «»;

    Reply
  14. rpgshnik

    (14)

    Элементы.Текст1.ВыделенныйТекст = «»;

    Вариант, для декорации. При использование реквизита для времени, поведение поля ввода остается не менее странным.

    Reply
  15. BigB

    (13) Проверил на платформе 8.3.15.1565 — обнуляется в обоих случаях!

    Reply
  16. BigB

    (14) На платформе 8.3.15.1565 работает правильно.

    Reply
  17. BigB

    (15) На платформе 8.3.15.1565 в режиме «Реквизит» вводил последовательно числа 1234567890. В результате получил хрень какую-то 8907564231.

    В режиме «Декорация» работает правильно!

    Reply
  18. shard

    (14) главное — не выделять текст вручную

    Reply
  19. rpgshnik

    (18) век учись, спасибо 👍

    Reply
  20. rpgshnik

    (18) проверил — не работает, текст удаляет при его выделение

    Reply
  21. rpgshnik

    (18) комментарий жалко нельзя редактировать 🙂 по этому гифка поведения прилагается отдельно, что ещё можно включить?

    Reply
  22. spacecraft

    (22) все работает правильно. Может не убран код из (15)?

    Reply
  23. rpgshnik

    (25) Точно 🙂 запутался

    Reply
  24. Anchoret

    (18) Который раз убеждаюсь, что практически на каждый велосипед, можно найти «галку» в свойствах

    Reply
  25. rpgshnik

    (27) ещё немного прокачался в HTML 🙂 и аналоговые часы выводить намного приятнее именно в HTML. Так же всегда думал, что обработчик ожидания это не асинхронный вызов.

    Reply
  26. oafan

    Некорректно выводит в поле часы. Есть варианты?

    Reply
  27. oafan

    Почему -то данный код не заработал для цифровых часов использовал

    <html>

    <script type=»text/javascript»>

    setInterval(function () {

    date = new Date(),

    h = date.getHours(),

    m = date.getMinutes(),

    s = date.getSeconds(),

    h = (h < 10) ? ‘0’ + h : h,

    m = (m < 10) ? ‘0’ + m : m,

    s = (s < 10) ? ‘0’ + s : s,

    document.getElementById(‘time’).innerHTML = h + ‘:’ + m + ‘:’ + s;

    }, 1000);

    </script>

    <span id=»time»>00:00:00</span>

    </span>

    Reply
  28. rpgshnik

    (29) можно высоту увеличить поля на форме… я думаю, что тут нужно с css стилями поиграть, но сам не силён, как под самый «потолок» вывести время.

    Reply
  29. rpgshnik

    (30) что-то я намудрил… позже гляну код в конфиге где это применяю… Пока можете вот это использовать:

    &НаКлиенте
    Процедура УстановитьВремяХТМЛ()
    ВремяХТМЛ = «<ht ml>
    |<head>
    |<st yle>
    |p {
    |font-family: Arial;
    |font-size: 20pt; /* Размер шрифта в пунктах */
    |color: #009646; /* Цвет шрифта */
    |}
    |html { overflow:  hidden; } /* Скрываем вертикальную полосу прокрутки*/
    |</style>
    |<sc ript type=»»text/javascript»»>
    |function startTime()
    |{
    |var tm=new Date();
    |var h=tm.getHours();
    |var m=tm.getMinutes();
    |var s=tm.getSeconds();
    |m=checkTime(m);
    |s=checkTime(s);
    |document.getElementById(‘txt’).innerHTML=h+»»:»»+m+»»:»»+s;
    |t=setTimeout(‘startTime()’,500);
    |}
    |function checkTime(i)
    |{
    |if (i<10)
    |{
    |i=»»0″» + i;
    |}
    |return i;
    |}
    |</sc ript>
    |</head>
    |<body on load=»»startTime()»»>
    |<p id=»»txt»»></p>
    |</body>
    |</html>»;
    КонецПроцедуры
    

    Показать

    Ещё возможно что код как-то криво копирует и транслируется… заметил что местами появляются пробелы, возьмите код из обработки ниже

    Reply
  30. rpgshnik

    (30) так же если интересно обработка с кодом аналоговых часов

    Reply
  31. SlavaKron

    (33)

    :nth-child

    Вот это не взлетит на платформах 1С до 8.3.14, если на компьютере IE8 или ниже. http://htmlbook.ru/css/nth-child

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *