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

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

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

 

Задача

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

 

Проблема

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

&НаКлиенте

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

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

ПодключитьОбработчикОжидания("ОбновитьВремя", 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 не будет опубликован. Обязательные поля помечены *