[Механизм интерфейса] Часы
Разработка - Работа с интерфейсом
Добрый день, Коллеги!
Задача
Необходимо на терминал вывести в заголовок "цифровые часы".
Проблема
Для реализации использовал реквизит формы «Время» (состав даты – время) и обработчик ожидания, который раз в секунду обновлял время. Программный код ниже.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Время = ТекущаяДата();
ПодключитьОбработчикОжидания("ОбновитьВремя", 1);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьВремя()
Время = ТекущаяДата();
КонецПроцедуры
Но так как на терминале используются поля для ввода данных, при попытке что-либо в них написать наблюдалось странное поведение – вводимые данные не сохранялись, и неожиданно обнулялась вводимая информация.
Решение
Причина была в обработчике ожидания. Решением проблемы является использование поля HTML и вывода времени в него. Демонстрация ниже.
Разработка
Алгоритм вывода времени
Создаем реквизит «ВремяХТМЛ» тип строка (0).
Переносим его на форму и настраиваем
. Необходимо указать вид, отключить заголовок и цвет рамочки для красоты сделать схожим с цветом формы, а вертикальную полосу прокрутки уберём позже.
Реквизит и элемент формы готовы
. Теперь необходим алгоритм. В интернете не сложно найти готовый javascript, останется только настроить css стили.
Определяем при старте формы вызов функции по формированию времени:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УстановитьВремяХТМЛ();
КонецПроцедуры
Формируем html-код страницы (уже здесь и пропишем скрытие вертикальной полосы прокрутки):
&НаКлиенте
Процедура УстановитьВремяХТМЛ()
тЦвет = "0,150,70";
ВремяХТМЛ = "<html>
|<head>
|<style>
|p {
|font-family: Arial;
|font-size: 20pt; /* Размер шрифта в пунктах */
|color: rgb(" + тЦвет + "); /* Цвет шрифта */
|}
|html { overflow: hidden; } /* Скрываем вертикальную полосу прокрутки*/
|</style>
|<script 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;
|}
|</script>
|</head>
|<body>
|<p id=""txt""></p>
|</body>
|</html>";
КонецПроцедуры
Цвет часов вынесен отдельно и мы можем привести заголовок к общему стилю.
Вот тут я конечно удивился. У псевдозаголовка установлен цвет из набора стилей (ЦветАкцента), оказывается из данного стиля вытащить палитру не так просто. Была найдена функция «ПолучитьАбсолютныйЦвет». Она оказалось не до конца рабочей. Главная причина она возвращает оттенок схожий, но не тот. К примеру цвет в стиле (0,150,70), цвет возвращаемый функцией (0,128,0). Неприятный момент.

&НаСервере
Функция ПолучитьАбсолютныйЦвет(ИсходныйЦвет) Экспорт
Если ИсходныйЦвет.Вид = ВидЦвета.Абсолютный Тогда
Возврат ИсходныйЦвет;
КонецЕсли;
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область("R1C1").ЦветФона = ИсходныйЦвет;
ВФ = ПолучитьИмяВременногоФайла("mxl");
ТабДок.Записать(ВФ, ТипФайлаТабличногоДокумента.MXL7);
ТабДок.Прочитать(ВФ);
АЦвет = ТабДок.Область("R1C1").ЦветФона;
ТабДок = Неопределено;
УдалитьФайлы(ВФ);
Возврат АЦвет;
КонецФункции
Была найдена вторая функция - «ПолучитьRGBЦвет», у меня она тоже не взлетела, вместо зеленого возвращает голубой. Но в комментарии привлек внимание код, который тоже не заработал. Но интуитивно добавил вторую строчку... и тут просто произошел парадокс. В комментарии отмечено назначение цвета фону, я добавил ещё строчку с "ЦветТекста" и именно тексту цвет установился, убрал строчку с "ЦветФона" и цвет тексту присваивается "Авто". Фича платформы? Код функции ниже (может работать как на сервере, так и на клиенте, установите нужную директиву, в примере &НаКлиенте).
&НаКлиенте
Функция ПолучитьЦвет(ЦветСтиля)
ТекстХТМЛДокумента = "";
ФорматированныйДокумент = Новый ФорматированныйДокумент;
ФорматированныйДокумент.Добавить("ОпределениеЦвета", Тип("ТекстФорматированногоДокумента"));
ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветФона = ЦветСтиля; //Не устанавливается хз почему, но если убрать, то и в ЦветТекста не встанет
ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветТекста = ЦветСтиля; //Устанавливается :)
ФорматированныйДокумент.ПолучитьHTML(ТекстХТМЛДокумента, Новый Структура);
ФорматированныйДокумент.УстановитьHTML(ТекстХТМЛДокумента, Новый Структура);
Возврат ФорматированныйДокумент.Элементы[0].Элементы[0].ЦветТекста;
КонецФункции

Теперь мы можем назначить цвет часам такой же как у псевдозаголовка. Для этого необходимо переписать строчку с назначением переменной "тЦвет" значения.
тЦвет = ПолучитьЦвет(ЦветаСтиля.ЦветАкцента); //Если мы знаем стиль
//ИЛИ
тЦвет = ПолучитьЦвет(Элементы.НадписьЗаголовок.ЦветТекста); //Если мы не знаем стиль :)
//Где элемент "НадписьЗаголовок" - тот самый псевдозаголовок тип элемента "Декорация-Надпись"
В будущем изменение корпоративного стиля отразится и на псевдозаголовке.
Если потребуется обратная функция, возвращаемое значение стиля по RGB-строке:
&НаСервере
Функция СформироватьСтиль(аЦвет)
аЦвет = СтрЗаменить(аЦвет," ","");
Разделитель1 = Найти(аЦвет, ",");
R = Лев(аЦвет, Разделитель1-1);
GB = Прав(аЦвет, СтрДлина(аЦвет)-Разделитель1);
Разделитель2 = Найти(GB, ",");
G = Лев(GB, Разделитель2-1);
B = Прав(GB, СтрДлина(GB) - Разделитель2);
СтильЦвет = Новый Цвет(R,G,B);
Возврат СтильЦвет;
КонецФункции
PS:
Так же можно вывести на форму аналоговые часы. Практически готовый алгоритм html-страницы можно взять на сайте https://codepen.io/, демонстрация одного из алгоритмов ниже.
<html><head>
<style>
body {
background: #282e3a;
color: #f9f9f9;
font: 100%/1.5em "Droid Sans", sans-serif;
margin: 0;
}
p { margin: 0; }
ul {
list-style: none;
margin: 0;
padding: 0;
}
/* ---------- GENERAL-CLASSES ---------- */
.container {
height: 228px;
left: 50%;
margin: -124px 0 0 -100px;
position: absolute;
top: 50%;
width: 200px;
}
/* ---------- APP ---------- */
.app {
text-align: center;
}
.app-title {
font-size: 24px;
font-weight: bold;
text-shadow: 0 5px #15181f;
}
.clock {
background: #1a1d24;
border-radius: 35px;
-webkit-box-shadow: 0 8px 0 #15181f;
box-shadow: 0 8px 0 #15181f;
height: 200px;
margin-bottom: 24px;
position: relative;
width: 200px;
}
.clock-inner {
background: #f9f9f9;
border-radius: 50%;
height: 160px;
left: 50%;
margin: -80px 0 0 -80px;
position: absolute;
top: 50%;
width: 160px;
}
.clock-center,
#clock-seconds,
#clock-minutes,
#clock-hours {
left: 50%;
position: absolute;
top: 50%;
}
.clock-center {
background: #1a1d24;
border-radius: 50%;
height: 12px;
margin: -6px 0 0 -6px;
width: 12px;
z-index: 4;
}
#clock-seconds {
background: #c40206;
border-radius: 2px;
height: 60px;
margin: -60px 0 0 -1px;
-webkit-transform-origin: 1px 60px;
-moz-transform-origin: 1px 60px;
-ms-transform-origin: 1px 60px;
-o-transform-origin: 1px 60px;
transform-origin: 1px 60px;
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
width: 2px;
z-index: 3;
}
#clock-minutes {
background: #aaa;
border-radius: 4px;
height: 50px;
margin: -50px 0 0 -2px;
-webkit-transform-origin: 2px 50px;
-moz-transform-origin: 2px 50px;
-ms-transform-origin: 2px 50px;
-o-transform-origin: 2px 50px;
transform-origin: 2px 50px;
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
width: 4px;
z-index: 2;
}
#clock-hours {
background: #1a1d24;
border-radius: 4px;
height: 40px;
margin: -40px 0 0 -2px;
-webkit-transform-origin: 2px 40px;
-moz-transform-origin: 2px 40px;
-ms-transform-origin: 2px 40px;
-o-transform-origin: 2px 40px;
transform-origin: 2px 40px;
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
width: 4px;
z-index: 1;
}
.clock-numbers {
color: #888;
display: block;
font-size: 16px;
font-weight: bold;
height: 120px;
margin: -60px 0 0 -60px;
left: 50%;
position: absolute;
top: 50%;
width: 120px;
}
.clock-numbers li {
height: 20px;
line-height: 20px;
margin: -10px;
position: absolute;
text-align: center;
width: 20px;
}
.clock-numbers li:nth-child(1) {
left: 50%;
top: 0;
}
.clock-numbers li:nth-child(2) {
right: 0;
top: 50%;
}
.clock-numbers li:nth-child(3) {
bottom: 0;
left: 50%;
}
.clock-numbers li:nth-child(4) {
left: 0;
top: 50%;
}
</style>
<script>
function startTime()
{
var clockSeconds = document.getElementById("clock-seconds"),
clockMinutes = document.getElementById("clock-minutes"),
clockHours = document.getElementById("clock-hours");
function getTime() {
var date = new Date(),
seconds = date.getSeconds(),
minutes = date.getMinutes(),
hours = date.getHours(),
degSeconds = seconds * 360 / 60,
degMinutes = (minutes + seconds / 60) * 360 / 60,
degHours = (hours + minutes / 60 + seconds / 60 / 60) * 360 / 12;
clockSeconds.setAttribute('style', '-webkit-transform: rotate(' + degSeconds + 'deg); -moz-transform: rotate(' + degSeconds + 'deg); -ms-transform: rotate(' + degSeconds + 'deg); -o-transform: rotate(' + degSeconds + 'deg); transform: rotate(' + degSeconds + 'deg);');
clockMinutes.setAttribute('style', '-webkit-transform: rotate(' + degMinutes + 'deg); -moz-transform: rotate(' + degMinutes + 'deg); -ms-transform: rotate(' + degMinutes + 'deg); -o-transform: rotate(' + degMinutes + 'deg); transform: rotate(' + degMinutes + 'deg);');
clockHours.setAttribute('style', '-webkit-transform: rotate(' + degHours + 'deg); -moz-transform: rotate(' + degHours + 'deg); -ms-transform: rotate(' + degHours + 'deg); -o-transform: rotate(' + degHours + 'deg); transform: rotate(' + degHours + 'deg);');
}
setInterval(getTime, 1000);
getTime();
}
</script>
<title></title>
<meta charset="UTF-8">
<title>Clock App Icon</title>
<link rel="stylesheet" href="/redirect.php?url=aHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NhbnM6NDAwLDcwMA==">
</head>
<body
<div class="container">
<div class="app">
<div class="clock">
<div class="clock-inner">
<div class="clock-center"></div>
<div id="clock-seconds"></div>
<div id="clock-minutes"></div>
<div id="clock-hours"></div>
<ul class="clock-numbers">
<li>12</li>
<li>3</li>
<li>6</li>
<li>9</li>
</ul>
</div> <!-- end clock-inner -->
</div> <!-- end clock -->
<p class="app-title">Аналоговые часы в 1С</p>
</div> <!-- end app -->
</div> <!-- end container -->
</body>
</html>
Всем удачного кодинга!
//+++ Обновление публикации от 31.08.2020 г.
// Посмотрите новую статью "Динамическое формирование интерфейса"
//--- Обновление публикации от 31.08.2020 г.
Вступайте в нашу телеграмм-группу Инфостарт
часы аналоговые цифровые время абсолютный цвет цвета ui ux дизайн
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)
Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!
31720 руб.
27.03.2025 92203 69 44
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3630 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10297 2 2
Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна
20.08.2024 57304 mrXoxot 44
Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.
27.05.2024 29959 smielka 39
Инструментарий разработчика Работа с интерфейсом Разработчик 1С 8.3 Абонемент ($m)
Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.
1 стартмани
10.04.2023 19415 190 acces969 31
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Питничная фантазия на возможности в разработке интерфейсов формы с помощью Платформы 1С - делаем свою подсказку. Публикация содержит готовую библиотеку программного формирования данной подсказки.
12.08.2022 16904 top_1c 39
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.
1 стартмани
05.07.2022 17925 kalyaka 8
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("УстановитьВремя",1);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВремя()
ЭтаФорма.Заголовок = "Заголовок "+Строка(Формат(ТекущаяДата(),"ДЛФ=T")); //Заголовок формы
Элементы.Часы.Заголовок = "Заголовок "+Строка(Формат(ТекущаяДата(),"ДЛФ=T")); //Декорация-надпись
КонецПроцедуры
ПоказатьАлсо, с таймаутами и подписками жабьегоскрипта надо быть поаккуратнее, зачастую они не умирают вместе со смертью пользовательского сеанса и висят на сервере мертвым грузом, постепенно накапливая свое число.
Ваш код так же сбрасывает вводимый текст при установке "времени". Форма обновляется и вводимый текст сбрасывается.
Ну что можно сказать, тут только словами Фирмы 1С, "Попробуйте обновить платформу до актуального релиза" XD
Проверил вариант комментария (1), на нескольких боевых платформах и тестовой (15-й). Поведение странное. Назовём мой первоначальный вариант - "Реквизит", а предложенный "Декорация".
Результат:
8.3.13.1690
Реквизит - Обнуляет поле ввода
Декорация - Обнуляет поле ввода
8.3.14.1694
Реквизит - Обнуляет поле ввода
Декорация - Обнуляет поле ввода
8.3.15.1534
Реквизит - Обнуляет поле ввода
Декорация - Работает
Забавно, ну ок. Пока нет боевой платформы 8.3.15.
Файл обработки прилагаю
Вариант, для декорации. При использование реквизита для времени, поведение поля ввода остается не менее странным.
<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>
&НаКлиенте
Процедура УстановитьВремяХТМЛ()
ВремяХТМЛ = "<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>";
КонецПроцедуры
ПоказатьЕщё возможно что код как-то криво копирует и транслируется... заметил что местами появляются пробелы, возьмите код из обработки ниже
function startTime()
{
document.getElementById('txt').innerHTML=new Date().toLocaleTimeString();
setTimeout('startTime()',500);
}
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1112550
Создание 26.08.19 11:00
Обновление 31.08.20 04:49
Просмотры 20310
Загрузки 0
Рейтинг
71
Комментарии 36
Код открыт Да
Рубрики Работа с интерфейсом
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)



