Разработка и Конфигурация · 11 мин
Как сделать часы в 1С: практическое руководство
Как сделать часы в 1С: вывод текущего времени в форме, обработчик ожидания, ТекущаяДатаСеанса, часы в отчётах и на рабочем столе. Примеры кода и ошибки.
Под задачей «сделать часы в 1С» обычно понимают одно из трёх: вывести текущее время в управляемой форме с автообновлением, показать время в отчёте или печатной форме, либо использовать дату и время в коде для расчётов. Все три сценария решаются штатными средствами платформы 1С:Предприятие без внешних компонентов.
Ключевой момент — понимать, откуда платформа берёт время. Функция ТекущаяДатаСеанса() возвращает дату и время сервера 1С (в файловом режиме — компьютера пользователя), а не «часы» как отдельный объект. Часы в форме — это просто реквизит или надпись, значение которой периодически обновляется обработчиком ожидания.
Ниже разобраны рабочие способы: от простейшего вывода времени при открытии формы до «живых» часов с обновлением каждую секунду, а также типичные ошибки, из-за которых время отображается неверно или не обновляется.
Откуда 1С берёт текущее время
Во встроенном языке есть несколько функций работы с датой и временем, и их часто путают. Основная — ТекущаяДатаСеанса(): она возвращает дату и время с точностью до секунды, причём в клиент-серверном режиме это время сервера, а не компьютера пользователя. Это важно, когда пользователи работают в разных часовых поясах.
Устаревшая функция ТекущаяДата() на клиенте возвращает локальное время компьютера пользователя. В современных конфигурациях её использовать не рекомендуется: если на клиентской машине сбиты часы, в документы и регистры попадут неверные значения. Для служебных меток времени есть также ТекущаяУниверсальнаяДата() — время UTC без привязки к поясу.
Простой вывод времени в форме
Если нужно показать время один раз — например, дату и время формирования документа в заголовке обработки — обработчик ожидания не требуется. Достаточно реквизита формы типа «Строка» или «Дата» и заполнения его при создании формы.
Минимальный код в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ВремяНаФорме = Формат(ТекущаяДатаСеанса(), "ДЛФ=T");
КонецПроцедуры
Реквизит ВремяНаФорме добавляется в дерево реквизитов формы в конфигураторе, затем перетаскивается в дерево элементов формы. Форматная строка ДЛФ=T выводит только время (часы, минуты, секунды); для даты и времени вместе используйте ДЛФ=DT.
Такой вариант подходит для печатных форм, заголовков отчётов и информационных надписей, где время фиксируется на момент открытия и меняться не должно.
Живые часы с обновлением каждую секунду
Чтобы часы «шли», значение реквизита нужно периодически обновлять. Для этого при открытии формы подключается обработчик ожидания, а при закрытии — отключается. Интервал задаётся в секундах.
- 1Добавьте реквизит формы, например ТекущееВремя, тип Строка
- 2Перетащите реквизит в элементы формы и настройте оформление (шрифт, размер)
- 3В ПриСозданииНаСервере заполните реквизит начальным значением
- 4В ПриОткрытии подключите обработчик ожидания с интервалом 1 секунда
- 5Создайте клиентскую процедуру-обработчик, которая обновляет реквизит
- 6В ПриЗакрытии отключите обработчик ожидания
- 7Проверьте работу: часы должны обновляться без мерцания формы
Полный пример кода модуля формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ОбновитьЧасы", 1);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЧасы()
ТекущееВремя = Формат(ПолучитьВремяСеанса(), "ДЛФ=T");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьВремяСеанса()
Возврат ТекущаяДатаСеанса();
КонецФункции
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
ОтключитьОбработчикОжидания("ОбновитьЧасы");
КонецПроцедуры
Обратите внимание: получение времени вынесено в серверную функцию, чтобы часы показывали время сервера, а не клиентского компьютера. Если это не критично, можно упростить и вызывать ТекущаяДата() прямо на клиенте без серверного вызова — это снизит нагрузку, так как вызов сервера каждую секунду в клиент-серверном режиме создаёт лишний трафик.
Часы в отчёте или печатной форме
В отчётах и макетах печатных форм часы не «тикают» — выводится фиксированное время формирования. В макете табличного документа добавьте параметр, например [ВремяФормирования], и заполните его при выводе:
ОбластьШапка.Параметры.ВремяФормирования =
Формат(ТекущаяДатаСеанса(), "ДЛФ=DT");
В СКД (системе компоновки данных) текущую дату можно получить через параметр с выражением &ТекущаяДата либо через функцию языка выражений компоновки ТекущаяДатаСеанса() в пользовательских полях. Это удобно для отчётов вида «остатки на текущий момент».
Часы и таймер на рабочем столе и в обработках
Обратная задача — не показать текущее время, а отсчитать интервал: таймер для производственного задания, контроль времени простоя, обратный отсчёт до конца перерыва. Реализуется тем же обработчиком ожидания, но вместо текущего времени вычисляется разность между сохранённым моментом старта и текущей датой сеанса.
&НаКлиенте
Процедура ОбновитьТаймер()
ПрошлоСекунд = ТекущаяДата() - ВремяСтарта;
Осталось = Длительность - ПрошлоСекунд;
Если Осталось <= 0 Тогда
ОтключитьОбработчикОжидания("ОбновитьТаймер");
ПоказатьПредупреждение(, "Время вышло!");
Иначе
НадписьТаймер = Формат(Дата(1,1,1) + Осталось, "ДЛФ=T");
КонецЕсли;
КонецПроцедуры
Приём Дата(1,1,1) + Осталось превращает количество секунд в значение типа «Дата», которое удобно форматировать как время. Учтите, что такой таймер на клиенте «засыпает» вместе с сеансом и не переживает перезапуск программы — для долгих интервалов храните время старта и окончания в базе (регистр сведений, константа) и вычисляйте остаток от серверного времени.
Сравнение подходов
Подходит для печатных форм и заголовков. Не обновляется, нагрузки не создаёт.
Живые часы без вызова сервера. Показывает время клиентской машины — может расходиться с серверным.
Точное время сервера, но нагрузка при коротком интервале. Разумный компромисс — интервал 30–60 секунд.
Для отчётов. Время фиксируется на момент формирования, обновление — только переформированием отчёта.
Часовые пояса и расхождение времени
Если база обслуживает пользователей в разных регионах, единое «серверное» время может сбивать с толку: пользователь во Владивостоке увидит московское время. Для таких случаев платформа предоставляет функции МестноеВремя() и УниверсальноеВремя(), а также работу с часовыми поясами сеанса.
Простой рецепт: храните и сравнивайте все даты в базе в едином времени (обычно серверном), а для отображения пользователю приводите к его поясу через МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПоясПользователя). Часовой пояс пользователя можно хранить в его настройках.
Типичные ошибки при создании часов
Ещё одна тонкость: обработчик ожидания не гарантирует точность до миллисекунд. Фактический интервал может «плавать» на доли секунды, поэтому не стройте на нём точные измерения — для измерения длительности операций используйте ТекущаяУниверсальнаяДатаВМиллисекундах().
Как проверить результат
Время на форме меняется каждую секунду без мерцания и перерисовки всей формы
Значение статично — обработчик не подключён или имя не совпадает
Время совпадает с серверным (проверьте на копии, сравнив с часами сервера)
Время совпадает с клиентским ПК при расхождении с сервером
После закрытия в журнале нет ошибок вызова обработчика
Ошибки «процедура не обнаружена» — обработчик не отключён
Форма работает плавно, другие пользователи не жалуются
Форма подтормаживает, растёт число вызовов сервера в техножурнале
FAQ
Можно ли сделать часы в 1С без программирования?
Нет, полностью без кода не обойтись: нужно как минимум заполнить реквизит формы и подключить обработчик ожидания. Однако объём кода минимален — 10–15 строк в модуле формы, шаблон приведён выше. В типовых конфигурациях без снятия с поддержки изменить форму можно через механизм расширений, не трогая саму конфигурацию.
Почему часы в форме показывают не то время, что на компьютере?
Потому что ТекущаяДатаСеанса() в клиент-серверном режиме возвращает время сервера 1С, а оно может отличаться от времени вашего ПК. Проверьте часы на сервере. Если нужно именно локальное время пользователя — используйте ТекущаяДата() на клиенте, но не записывайте это значение в базу.
Как вывести время в формате «14:05» без секунд?
Используйте произвольную форматную строку: Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm"). Конструктор ДФ позволяет собрать любой шаблон: часы, минуты, секунды, разделители. При этом обновление раз в минуту достаточно — интервал обработчика можно увеличить до 10–30 секунд.
Будут ли часы работать в веб-клиенте и тонком клиенте?
Да, обработчик ожидания и функции даты работают во всех клиентах: толстом, тонком и веб-клиенте. Ограничение одно — в веб-клиенте серверные вызовы ощутимее из-за сетевой задержки, поэтому предпочтителен вариант с обновлением на клиенте без обращения к серверу.
Как сделать таймер, который продолжает идти после перезапуска программы?
Сохраните момент старта и плановую длительность в базе (константа, регистр сведений или реквизит объекта). При открытии формы вычисляйте остаток как разность между сохранённым временем окончания и ТекущаяДатаСеанса(). Тогда таймер корректно покажет остаток даже после выключения компьютера.
Можно ли вывести часы на начальную страницу (рабочий стол)?
Да, через внешнюю обработку или расширение, форму которого добавляют в настройку начальной страницы (раздел «Администрирование — Настройка начальной страницы» в типовых). Форма с часами размещается в одной из колонок рабочего стола и обновляется тем же обработчиком ожидания.
Что важно запомнить
Часы в 1С — это реквизит формы, обновляемый обработчиком ожидания; источник времени — ТекущаяДатаСеанса(). Избегайте ежесекундных серверных вызовов, всегда отключайте обработчик при закрытии формы, а для записи в базу используйте только серверное время. Тестируйте манипуляции со временем на копии базы.