Разработка и Конфигурация · 10 мин
Как сделать часы в 1С 8: вывод текущего времени в форме и программном коде
Как вывести часы в 1С 8: получение текущего времени в коде, отображение часов на форме, автоматическое обновление через обработчик ожидания и типичные ошибки.
Задача «сделать часы в 1С 8» обычно означает одно из трёх: получить текущее время в программном коде, вывести постоянно обновляющиеся часы на форме или зафиксировать время в документе, справочнике или отчёте. Все три сценария решаются штатными средствами платформы 1С:Предприятие 8.3 без внешних компонентов.
Ключевые инструменты — функции ТекущаяДата() и ТекущаяДатаСеанса(), а также механизм ПодключитьОбработчикОжидания(), который позволяет обновлять время на форме с заданным интервалом. Ниже разобраны готовые примеры кода для управляемых и обычных форм, различия между серверным и клиентским временем и типичные ошибки.
Материал ориентирован на разработчиков и администраторов, работающих с конфигуратором 1С. Примеры приведены на встроенном языке и подходят для большинства типовых и самописных конфигураций на платформе 8.3.
Получение текущего времени в коде 1С
Базовый способ узнать текущее время — встроенная функция ТекущаяДата(). Она возвращает значение типа «Дата», включающее и время с точностью до секунды. Чтобы получить только время в виде строки, используется функция Формат() с форматной строкой:
ТекВремя = ТекущаяДата();
СтрокаВремени = Формат(ТекВремя, "ДФ=ЧЧ:мм:сс");
Сообщить("Сейчас: " + СтрокаВремени);
Форматная строка ДФ=ЧЧ:мм:сс выводит часы, минуты и секунды. Если секунды не нужны, используйте ДФ=ЧЧ:мм. Обратите внимание: ТекущаяДата() на клиенте возвращает время компьютера пользователя, а на сервере — время сервера 1С. При расхождении часовых поясов и настроек это может давать разные результаты.
Для учётных задач (фиксация времени в документах, журналах) рекомендуется ТекущаяДатаСеанса() — она возвращает время, согласованное с сервером и настройками сеанса, и не зависит от часового пояса клиентского компьютера. Это исключает ситуации, когда документы, проведённые с разных рабочих мест, имеют «разъезжающееся» время.
Вывод часов на управляемой форме
Чтобы пользователь видел часы на форме, нужны три элемента: реквизит формы для хранения строки времени, элемент формы, связанный с этим реквизитом, и код обновления. Разберём последовательность для управляемой формы (например, формы обработки).
- 1Откройте форму в конфигураторе и добавьте реквизит формы с именем, например, ТекущееВремя и типом Строка.
- 2Перетащите реквизит в дерево элементов формы; установите вид «Поле надписи», чтобы часы не редактировались.
- 3В модуле формы создайте обработчик ПриСозданииНаСервере и заполните реквизит начальным значением.
- 4Добавьте клиентскую процедуру ОбновитьЧасы() и подключите её через ПодключитьОбработчикОжидания с интервалом 1 секунда.
- 5Сохраните конфигурацию, обновите базу и откройте форму в режиме 1С:Предприятие для проверки.
Пример кода модуля формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекущееВремя = Формат(ТекущаяДатаСеанса(), "ДФ=ЧЧ:мм:сс");
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ОбновитьЧасы", 1);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЧасы()
ТекущееВремя = Формат(ТекущаяДата(), "ДФ=ЧЧ:мм:сс");
КонецПроцедуры
Процедура ОбновитьЧасы выполняется на клиенте и не обращается к серверу, поэтому обновление раз в секунду не создаёт нагрузки на сервер 1С и не блокирует интерфейс. Это важный момент: если делать обновление через серверный вызов, каждый тик часов будет генерировать клиент-серверное обращение, что при большом числе пользователей заметно нагрузит систему.
Часы на обычной форме
В обычных формах (толстый клиент, режим совместимости) подход аналогичен, но реквизит можно не создавать: достаточно надписи на форме и обновления её заголовка. Добавьте на форму элемент «Надпись» с именем НадписьЧасы и в модуле формы напишите:
Процедура ПриОткрытии()
ПодключитьОбработчикОжидания("ОбновитьЧасы", 1);
КонецПроцедуры
Процедура ОбновитьЧасы()
ЭлементыФормы.НадписьЧасы.Заголовок = Формат(ТекущаяДата(), "ДФ=ЧЧ:мм:сс");
КонецПроцедуры
Обычные формы встречаются в старых конфигурациях (например, «Управление торговлей 10.3», «Бухгалтерия 1.6/2.0»). Если конфигурация работает в режиме совместимости, этот вариант остаётся рабочим, но при обновлении платформы стоит планировать перевод форм на управляемый интерфейс.
Фиксация времени в документах и журналах
Если задача — не «живые» часы, а сохранение момента времени (например, время начала и окончания операции, отметка в журнале событий), используйте реквизит типа «Дата» с составом даты «Дата и время». В конфигураторе это задаётся в свойствах реквизита: «Состав даты» → «Дата и время».
При записи объекта время фиксируется программно:
ДокументОбъект.ВремяНачала = ТекущаяДатаСеанса();
ДокументОбъект.Записать();
Для вычисления длительности между двумя моментами времени достаточно вычесть одну дату из другой — результат будет в секундах:
ДлительностьСек = ДатаОкончания - ДатаНачала;
Часов = Цел(ДлительностьСек / 3600);
Минут = Цел((ДлительностьСек - Часов * 3600) / 60);
Тонкости: клиентское и серверное время, часовые пояса
Главный источник путаницы — разница между временем клиента и сервера. В файловой базе на одном компьютере они совпадают, но в клиент-серверном варианте или при работе через веб-клиент из другого часового пояса значения могут отличаться на часы.
Сравнение вариантов
Подходит для «часов на форме» — показывает пользователю его локальное время. Не подходит для учётных данных: зависит от настроек ПК пользователя.
Правильный выбор для документов, журналов, регистров. Единое время для всей базы, не зависит от часового пояса клиента.
Время по UTC. Используется для обмена данными между базами в разных часовых поясах и для синхронизации с внешними системами.
Для часов на форме обычно правильнее показывать локальное время пользователя — ТекущаяДата() на клиенте. Для всего, что сохраняется в базу, — ТекущаяДатаСеанса(). Смешивание этих подходов — частая причина ошибок в отчётах по времени.
Типичные ошибки при реализации часов
Отдельно стоит упомянуть обработчик ожидания: его нужно отключать при закрытии формы, иначе платформа продолжит вызывать процедуру. Добавьте в модуль формы:
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
ОтключитьОбработчикОжидания("ОбновитьЧасы");
КонецПроцедуры
Проверка результата
Как проверить результат
Часы показывают ЧЧ:мм:сс и обновляются каждую секунду без мерцания
Время статично, пустое поле или ошибка «Процедура не обнаружена»
В консоли кластера нет роста серверных вызовов при открытой форме
Каждую секунду идёт обращение к серверу от каждого клиента
После закрытия формы ошибок в журнале нет
Появляются ошибки вызова обработчика после закрытия
Время записи одинаково корректно у всех пользователей независимо от их часового пояса
У части пользователей время «уезжает» на несколько часов
После внедрения откройте форму в режиме 1С:Предприятие и понаблюдайте 1–2 минуты: часы должны идти плавно, без рывков интерфейса. Затем закройте форму и проверьте журнал регистрации (Администрирование → Обслуживание → Журнал регистрации) на предмет ошибок обработчика ожидания.
Что важно запомнить
Часы в 1С 8 строятся на связке ТекущаяДата()/ТекущаяДатаСеанса() + Формат() для вывода и ПодключитьОбработчикОжидания() для автоматического обновления. Обновление делайте на клиенте, учётное время сохраняйте через ТекущаяДатаСеанса(), а обработчик ожидания отключайте при закрытии формы.
Частые вопросы
Можно ли сделать часы в 1С без изменения конфигурации?
Да, если использовать внешнюю обработку (файл .epf) с собственной формой — код часов размещается в ней, конфигурация не меняется. Открывается через Файл → Открыть. Для встраивания часов в существующие формы типовой конфигурации изменения (или расширение конфигурации) не избежать.
Чем расширение конфигурации лучше изменения основной конфигурации?
Расширение не затрагивает типовой код, поэтому конфигурация остаётся на поддержке и обновляется штатно. Для добавления часов на чужую форму расширение — предпочтительный способ: вы добавляете реквизит, элемент и обработчики поверх типовой формы.
Почему часы на форме отстают или «замирают»?
Обработчик ожидания выполняется, только когда клиентское приложение не занято длительной операцией. Если форма выполняет тяжёлый серверный вызов или длинный цикл на клиенте, тики часов пропускаются. После завершения операции обновление возобновится автоматически.
Как показать дату и день недели рядом с часами?
Расширьте форматную строку, например: Формат(ТекущаяДата(), "ДФ='dddd, d MMMM yyyy, ЧЧ:мм:сс'") — выведет день недели, дату и время одной строкой. Отдельные шаблоны можно комбинировать по своему усмотрению.
Работают ли часы в веб-клиенте?
Да, ПодключитьОбработчикОжидания поддерживается в веб-клиенте, и схема с клиентским обновлением реквизита формы работает так же. Учитывайте, что ТекущаяДата() в веб-клиенте вернёт время браузера пользователя, что для отображения локальных часов обычно и требуется.
Как сделать таймер обратного отсчёта вместо часов?
Сохраните в реквизите формы момент окончания (ТекущаяДатаСеанса() + нужное число секунд), а в обработчике ожидания вычисляйте остаток: Осталось = МоментОкончания - ТекущаяДата(). Когда остаток меньше или равен нулю — отключите обработчик и выполните нужное действие.