К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как сделать часы в 1С: практическое руководство

Как сделать часы в 1С: вывод текущего времени в форме, обработчик ожидания, ТекущаяДатаСеанса, часы в отчётах и на рабочем столе. Примеры кода и ошибки.

Под задачей «сделать часы в 1С» обычно понимают одно из трёх: вывести текущее время в управляемой форме с автообновлением, показать время в отчёте или печатной форме, либо использовать дату и время в коде для расчётов. Все три сценария решаются штатными средствами платформы 1С:Предприятие без внешних компонентов.

Ключевой момент — понимать, откуда платформа берёт время. Функция ТекущаяДатаСеанса() возвращает дату и время сервера 1С (в файловом режиме — компьютера пользователя), а не «часы» как отдельный объект. Часы в форме — это просто реквизит или надпись, значение которой периодически обновляется обработчиком ожидания.

Ниже разобраны рабочие способы: от простейшего вывода времени при открытии формы до «живых» часов с обновлением каждую секунду, а также типичные ошибки, из-за которых время отображается неверно или не обновляется.

Откуда 1С берёт текущее время

Во встроенном языке есть несколько функций работы с датой и временем, и их часто путают. Основная — ТекущаяДатаСеанса(): она возвращает дату и время с точностью до секунды, причём в клиент-серверном режиме это время сервера, а не компьютера пользователя. Это важно, когда пользователи работают в разных часовых поясах.

Устаревшая функция ТекущаяДата() на клиенте возвращает локальное время компьютера пользователя. В современных конфигурациях её использовать не рекомендуется: если на клиентской машине сбиты часы, в документы и регистры попадут неверные значения. Для служебных меток времени есть также ТекущаяУниверсальнаяДата() — время UTC без привязки к поясу.

Простой вывод времени в форме

Если нужно показать время один раз — например, дату и время формирования документа в заголовке обработки — обработчик ожидания не требуется. Достаточно реквизита формы типа «Строка» или «Дата» и заполнения его при создании формы.

Минимальный код в модуле формы:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ВремяНаФорме = Формат(ТекущаяДатаСеанса(), "ДЛФ=T");

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

Реквизит ВремяНаФорме добавляется в дерево реквизитов формы в конфигураторе, затем перетаскивается в дерево элементов формы. Форматная строка ДЛФ=T выводит только время (часы, минуты, секунды); для даты и времени вместе используйте ДЛФ=DT.

Такой вариант подходит для печатных форм, заголовков отчётов и информационных надписей, где время фиксируется на момент открытия и меняться не должно.

Живые часы с обновлением каждую секунду

Чтобы часы «шли», значение реквизита нужно периодически обновлять. Для этого при открытии формы подключается обработчик ожидания, а при закрытии — отключается. Интервал задаётся в секундах.

Порядок создания часов в форме
  1. 1
    Добавьте реквизит формы, например ТекущееВремя, тип Строка
  2. 2
    Перетащите реквизит в элементы формы и настройте оформление (шрифт, размер)
  3. 3
    В ПриСозданииНаСервере заполните реквизит начальным значением
  4. 4
    В ПриОткрытии подключите обработчик ожидания с интервалом 1 секунда
  5. 5
    Создайте клиентскую процедуру-обработчик, которая обновляет реквизит
  6. 6
    В ПриЗакрытии отключите обработчик ожидания
  7. 7
    Проверьте работу: часы должны обновляться без мерцания формы

Полный пример кода модуля формы:

&НаКлиенте

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

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

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

&НаКлиенте

Процедура ОбновитьЧасы()

ТекущееВремя = Формат(ПолучитьВремяСеанса(), "ДЛФ=T");

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

&НаСервереБезКонтекста

Функция ПолучитьВремяСеанса()

Возврат ТекущаяДатаСеанса();

КонецФункции

&НаКлиенте

Процедура ПриЗакрытии(ЗавершениеРаботы)

ОтключитьОбработчикОжидания("ОбновитьЧасы");

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

Обратите внимание: получение времени вынесено в серверную функцию, чтобы часы показывали время сервера, а не клиентского компьютера. Если это не критично, можно упростить и вызывать ТекущаяДата() прямо на клиенте без серверного вызова — это снизит нагрузку, так как вызов сервера каждую секунду в клиент-серверном режиме создаёт лишний трафик.

Часы в отчёте или печатной форме

В отчётах и макетах печатных форм часы не «тикают» — выводится фиксированное время формирования. В макете табличного документа добавьте параметр, например [ВремяФормирования], и заполните его при выводе:

ОбластьШапка.Параметры.ВремяФормирования =

Формат(ТекущаяДатаСеанса(), "ДЛФ=DT");

В СКД (системе компоновки данных) текущую дату можно получить через параметр с выражением &ТекущаяДата либо через функцию языка выражений компоновки ТекущаяДатаСеанса() в пользовательских полях. Это удобно для отчётов вида «остатки на текущий момент».

Часы и таймер на рабочем столе и в обработках

Обратная задача — не показать текущее время, а отсчитать интервал: таймер для производственного задания, контроль времени простоя, обратный отсчёт до конца перерыва. Реализуется тем же обработчиком ожидания, но вместо текущего времени вычисляется разность между сохранённым моментом старта и текущей датой сеанса.

&НаКлиенте

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

ПрошлоСекунд = ТекущаяДата() - ВремяСтарта;

Осталось = Длительность - ПрошлоСекунд;

Если Осталось <= 0 Тогда

ОтключитьОбработчикОжидания("ОбновитьТаймер");

ПоказатьПредупреждение(, "Время вышло!");

Иначе

НадписьТаймер = Формат(Дата(1,1,1) + Осталось, "ДЛФ=T");

КонецЕсли;

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

Приём Дата(1,1,1) + Осталось превращает количество секунд в значение типа «Дата», которое удобно форматировать как время. Учтите, что такой таймер на клиенте «засыпает» вместе с сеансом и не переживает перезапуск программы — для долгих интервалов храните время старта и окончания в базе (регистр сведений, константа) и вычисляйте остаток от серверного времени.

Сравнение подходов

Статичная надпись при открытии

Подходит для печатных форм и заголовков. Не обновляется, нагрузки не создаёт.

Обработчик ожидания на клиенте

Живые часы без вызова сервера. Показывает время клиентской машины — может расходиться с серверным.

Обработчик с серверным вызовом

Точное время сервера, но нагрузка при коротком интервале. Разумный компромисс — интервал 30–60 секунд.

Вычисление в СКД или макете

Для отчётов. Время фиксируется на момент формирования, обновление — только переформированием отчёта.

Часовые пояса и расхождение времени

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

Простой рецепт: храните и сравнивайте все даты в базе в едином времени (обычно серверном), а для отображения пользователю приводите к его поясу через МестноеВремя(ТекущаяУниверсальнаяДата(), ЧасовойПоясПользователя). Часовой пояс пользователя можно хранить в его настройках.

Типичные ошибки при создании часов

Типичные ошибки
01
Имя обработчика в ПодключитьОбработчикОжидания указано с опечаткой — часы молча не обновляются, ошибки нет. Сверяйте строку с именем процедуры посимвольно.
02
Обработчик не отключён при закрытии формы — платформа продолжает вызывать несуществующий контекст, в журнале растут ошибки.
03
Серверный вызов каждую секунду в клиент-серверной базе — лишняя нагрузка и подтормаживание формы.
04
Использование ТекущаяДата() на клиенте для записи данных в базу — при сбитых часах пользователя в документах появляется неверное время.
05
Реквизит типа Дата с форматом ДЛФ=D — время обрезается до даты, часы не видны. Нужен формат ДЛФ=T или DT.

Ещё одна тонкость: обработчик ожидания не гарантирует точность до миллисекунд. Фактический интервал может «плавать» на доли секунды, поэтому не стройте на нём точные измерения — для измерения длительности операций используйте ТекущаяУниверсальнаяДатаВМиллисекундах().

Контрольные точки

Как проверить результат

Обновление значения
Норма

Время на форме меняется каждую секунду без мерцания и перерисовки всей формы

Тревожный признак

Значение статично — обработчик не подключён или имя не совпадает

Источник времени
Норма

Время совпадает с серверным (проверьте на копии, сравнив с часами сервера)

Тревожный признак

Время совпадает с клиентским ПК при расхождении с сервером

Закрытие формы
Норма

После закрытия в журнале нет ошибок вызова обработчика

Тревожный признак

Ошибки «процедура не обнаружена» — обработчик не отключён

Нагрузка
Норма

Форма работает плавно, другие пользователи не жалуются

Тревожный признак

Форма подтормаживает, растёт число вызовов сервера в техножурнале

FAQ

Можно ли сделать часы в 1С без программирования?

Нет, полностью без кода не обойтись: нужно как минимум заполнить реквизит формы и подключить обработчик ожидания. Однако объём кода минимален — 10–15 строк в модуле формы, шаблон приведён выше. В типовых конфигурациях без снятия с поддержки изменить форму можно через механизм расширений, не трогая саму конфигурацию.

Почему часы в форме показывают не то время, что на компьютере?

Потому что ТекущаяДатаСеанса() в клиент-серверном режиме возвращает время сервера 1С, а оно может отличаться от времени вашего ПК. Проверьте часы на сервере. Если нужно именно локальное время пользователя — используйте ТекущаяДата() на клиенте, но не записывайте это значение в базу.

Как вывести время в формате «14:05» без секунд?

Используйте произвольную форматную строку: Формат(ТекущаяДатаСеанса(), "ДФ=HH:mm"). Конструктор ДФ позволяет собрать любой шаблон: часы, минуты, секунды, разделители. При этом обновление раз в минуту достаточно — интервал обработчика можно увеличить до 10–30 секунд.

Будут ли часы работать в веб-клиенте и тонком клиенте?

Да, обработчик ожидания и функции даты работают во всех клиентах: толстом, тонком и веб-клиенте. Ограничение одно — в веб-клиенте серверные вызовы ощутимее из-за сетевой задержки, поэтому предпочтителен вариант с обновлением на клиенте без обращения к серверу.

Как сделать таймер, который продолжает идти после перезапуска программы?

Сохраните момент старта и плановую длительность в базе (константа, регистр сведений или реквизит объекта). При открытии формы вычисляйте остаток как разность между сохранённым временем окончания и ТекущаяДатаСеанса(). Тогда таймер корректно покажет остаток даже после выключения компьютера.

Можно ли вывести часы на начальную страницу (рабочий стол)?

Да, через внешнюю обработку или расширение, форму которого добавляют в настройку начальной страницы (раздел «Администрирование — Настройка начальной страницы» в типовых). Форма с часами размещается в одной из колонок рабочего стола и обновляется тем же обработчиком ожидания.

Итог

Что важно запомнить

Часы в 1С — это реквизит формы, обновляемый обработчиком ожидания; источник времени — ТекущаяДатаСеанса(). Избегайте ежесекундных серверных вызовов, всегда отключайте обработчик при закрытии формы, а для записи в базу используйте только серверное время. Тестируйте манипуляции со временем на копии базы.