Добрый день, Коллеги!
Задача
Необходимо на терминал вывести в заголовок "цифровые часы".
Проблема
Для реализации использовал реквизит формы «Время» (состав даты – время) и обработчик ожидания, который раз в секунду обновлял время. Программный код ниже.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Время = ТекущаяДата();
ПодключитьОбработчикОжидания("ОбновитьВремя", 1);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьВремя()
Время = ТекущаяДата();
КонецПроцедуры
Но так как на терминале используются поля для ввода данных, при попытке что-либо в них написать наблюдалось странное поведение – вводимые данные не сохранялись, и неожиданно обнулялась вводимая информация.
Решение
Причина была в обработчике ожидания. Решением проблемы является использование поля HTML и вывода времени в него. Демонстрация ниже.
Разработка
Алгоритм вывода времени
Создаем реквизит «ВремяХТМЛ» тип строка (0). Переносим его на форму и настраиваем . Необходимо указать вид, отключить заголовок и цвет рамочки для красоты сделать схожим с цветом формы, а вертикальную полосу прокрутки уберём позже.
Реквизит и элемент формы готовы . Теперь необходим алгоритм. В интернете не сложно найти готовый javascript, останется только настроить css стили.
Определяем при старте формы вызов функции по формированию времени:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УстановитьВремяХТМЛ();
КонецПроцедуры
Формируем html-код страницы (уже здесь и пропишем скрытие вертикальной полосы прокрутки):
Код функции "УстановитьВремяХТМЛ"
Цвет часов вынесен отдельно и мы можем привести заголовок к общему стилю.
Немного о цвете…
PS:
Так же можно вывести на форму аналоговые часы. Практически готовый алгоритм html-страницы можно взять на сайте https://codepen.io/, демонстрация одного из алгоритмов ниже.
Текст HTML-страницы "Аналоговые часы в 1С"
Всем удачного кодинга!
Я наверное глупость скажу, но…
Показать
(1) Сам собрался написать про обработчик ожидания)
Алсо, с таймаутами и подписками жабьегоскрипта надо быть поаккуратнее, зачастую они не умирают вместе со смертью пользовательского сеанса и висят на сервере мертвым грузом, постепенно накапливая свое число.
(2) ну там вроде проблема была, что при срабатывании обработчика ожидания введенный текст сбрасывался… Но если изменять не реквизит формы, а элемент формы или заголовок, то всё норм.
(1) Вообще-то в начале статьи автор как раз и описал решение с обработчиком ожидания и проблемы такого решения.
(4) Так в том-то и проблема, что нет проблемы…
(1) И? Как я понял статью, там упор делался решение проблемы: сброс вводимого текста в поле ввода при подключаемом обработчике ожидания.
Ваш код так же сбрасывает вводимый текст при установке «времени». Форма обновляется и вводимый текст сбрасывается.
(6) Я проверил, не сбрасывается, обработка прикреплена к первому комментарию, можете скачать и тоже проверить.
(7) так я ее и проверил. Сбрасывается. 1С:Предприятие 8.3 (8.3.13.1690)
(8) Я делал на 1С:Предприятие 8.3 (8.3.15.1489), может позже гляну на 13, даже интересно.
(8) Нашел установленную 13 версию, и правда, сбрасывается…
Ну что можно сказать, тут только словами Фирмы 1С, «Попробуйте обновить платформу до актуального релиза» XD
(8) всё верно, именно на этой платформе и веду разработку
В публикации демонстрируется функционал цифровых часов на платформе 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.
Файл обработки прилагаю
Дело в фокусе — чтобы решить проблему, нужно в обработчик добавить Элементы.Текст1.ВыделенныйТекст = «»;
(14)
Вариант, для декорации. При использование реквизита для времени, поведение поля ввода остается не менее странным.
(13) Проверил на платформе 8.3.15.1565 — обнуляется в обоих случаях!
(14) На платформе 8.3.15.1565 работает правильно.
(15) На платформе 8.3.15.1565 в режиме «Реквизит» вводил последовательно числа 1234567890. В результате получил хрень какую-то 8907564231.
В режиме «Декорация» работает правильно!
(14) главное — не выделять текст вручную
(18) век учись, спасибо 👍
(18) проверил — не работает, текст удаляет при его выделение
(18) комментарий жалко нельзя редактировать 🙂 по этому гифка поведения прилагается отдельно, что ещё можно включить?
(22) все работает правильно. Может не убран код из (15)?
(25) Точно 🙂 запутался
(18) Который раз убеждаюсь, что практически на каждый велосипед, можно найти «галку» в свойствах
(27) ещё немного прокачался в HTML 🙂 и аналоговые часы выводить намного приятнее именно в HTML. Так же всегда думал, что обработчик ожидания это не асинхронный вызов.
Некорректно выводит в поле часы. Есть варианты?
Почему -то данный код не заработал для цифровых часов использовал
<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>
(29) можно высоту увеличить поля на форме… я думаю, что тут нужно с css стилями поиграть, но сам не силён, как под самый «потолок» вывести время.
(30) что-то я намудрил… позже гляну код в конфиге где это применяю… Пока можете вот это использовать:
Показать
Ещё возможно что код как-то криво копирует и транслируется… заметил что местами появляются пробелы, возьмите код из обработки ниже
(30) так же если интересно обработка с кодом аналоговых часов
(33)
Вот это не взлетит на платформах 1С до 8.3.14, если на компьютере IE8 или ниже.http://htmlbook.ru/css/nth-child