Как реализовать таймер на форме в 1С: разбираем все доступные способы

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Задачу по созданию таймера на форме часто ставят перед разработчиками 1С, когда необходимо визуализировать обратный отсчет, время сессии пользователя или длительность выполнения процесса. Несмотря на кажущуюся простоту, выбор правильного механизма реализации критически важен для стабильности интерфейса. В этой статье мы подробно проанализируем различные подходы — от классических методов до современных альтернатив с использованием веб-технологий.

Метод 1: Использование стандартного обработчика ожидания

Это самый «законный» и документированный метод в среде 1С. Мы используем процедуру ПодключитьОбработчикОжидания, которая позволяет платформе вызывать определенный программный код через заданный интервал времени.

Рассмотрим пример реализации, который часто встречается в практике. Для этого нам понадобятся переменные для хранения состояния таймера и сама процедура, которая будет обновлять данные на форме. Разберем по шагам код, предложенный в обсуждении:


Перем мВремя; 
Перем мФлагТаймера; 

Процедура КнопкаСтартСтопНажатие(Кнопка) 
    // Инвертируем флаг состояния таймера
    мФлагТаймера = Не мФлагТаймера; 
    
    Если мФлагТаймера Тогда 
        // Подключаем обработчик. 
        // Параметры: ИмяПроцедуры, ИнтервалВСекундах, Однократно
        ПодключитьОбработчикОжидания("ПроцедураТаймера", 1, Ложь); 
    Иначе 
        // Отключаем обработчик, если таймер остановлен
        ОтключитьОбработчикОжидания("ПроцедураТаймера"); 
    КонецЕсли; 
КонецПроцедуры 

Процедура ПроцедураТаймера() Экспорт
    // Инкрементируем время (например, в секундах)
    мВремя = мВремя + 1; 
    
    // Выводим значение на форму (предположим, у нас есть реквизит ТекущееВремя)
    ЭтаФорма.ЭлементыФормы.НадписьТаймер.Заголовок = Строка(мВремя); 
КонецПроцедуры 

мФлагТаймера = Ложь; 
мВремя = 0;

Важный нюанс: Обратите внимание, что процедура, вызываемая обработчиком, должна быть объявлена с ключевым словом Экспорт, если она находится в модуле формы или другом контексте, требующем внешней видимости. В обычных формах интервал задается в секундах, и минимальное значение составляет 1 секунду. Если вам нужна большая точность (например, десятые доли секунды), стандартный метод может не подойти.

Метод 2: Экспериментальный подход через «ОбновлениеОтображения»

Иногда разработчики пытаются обойти ограничения стандартного обработчика, используя событие формы ОбновлениеОтображения. Суть метода заключается в том, что это событие срабатывает крайне часто при любых манипуляциях с формой.

Проанализируем этот алгоритм:

  1. Создается реквизит формы для хранения времени.
  2. В обработчике ОбновлениеОтображения пишется код, который проверяет текущее системное время.
  3. Если прошла необходимая дельта времени, обновляется текст на форме.

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

Метод 3: Использование HTML-документа и JavaScript (Современный подход)

Если нам нужна высокая плавность (например, миллисекундный отсчет) без нагрузки на сервер 1С, мы можем использовать поле HTML-документа. Это отличный способ разгрузить основной поток платформы, используя возможности поля HTML документ для создания кастомных элементов управления.

Выясним причину эффективности этого метода: JavaScript внутри встроенного браузера работает в собственном потоке. Подобный алхимический способ выполнения произвольного кода позволяет реализовать сложную логику даже под WEB и мобильным клиентами. Рассмотрим алгоритм реализации:

  1. Добавляем на форму элемент типа ПолеHTMLДокумента.
  2. Загружаем в него простейшую HTML-страницу с JS-скриптом.
  3. Используем функцию setInterval в JavaScript для обновления текста.

Пример простейшего скрипта для загрузки в поле:


<html>
<body>
    <div id="timer" style="font-size: 20px; font-weight: bold;">0</div>
    <script>
        var count = 0;
        setInterval(function() {
            count++;
            document.getElementById('timer').innerHTML = count;
        }, 1000);
    </script>
</body>
</html>

Чтобы передать данные из этого таймера обратно в 1С, можно использовать событие ПриНажатии в поле HTML-документа. В более продвинутых решениях, где требуется постоянный обмен данными в реальном времени, разработчики часто внедряют управление WebSocket-соединениями.

Метод 4: Использование внешних компонент

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

Рассмотрим, как это работает:

Это самый сложный в реализации, но и самый профессиональный способ, так как он полностью асинхронен.

Метод 5: Фоновые задания для длительных процессов

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

Разберем по шагам:

  1. Запускаем фоновое задание через ФоновыеЗадания.Выполнить().
  2. На форме подключаем стандартный ПодключитьОбработчикОжидания с интервалом в 2-3 секунды.
  3. В обработчике проверяем статус задания.
  4. Как только задание завершено или обновило свой статус в хранилище, выводим информацию пользователю и отключаем обработчик.

Резюме и рекомендации

Проанализировав все способы, мы можем сделать следующие выводы:

  1. Если вам нужен обычный таймер с секундным интервалом — используйте ПодключитьОбработчикОжидания. Это надежно и просто.
  2. Если вы создаете сложный интерфейс, например, визуализацию технологического процесса на мониторе в цеху (для этого подойдёт конструктор адаптивных рабочих столов и интерфейсов 1С) — посмотрите в сторону HTML + JavaScript. Это даст максимальную плавность и эстетичность.
  3. Никогда не используйте циклы с паузами внутри событий ОбновлениеОтображения или ПриОткрытии, так как это блокирует работу пользователя.

Помните, что любой таймер — это дополнительная нагрузка на клиентское приложение. Старайтесь оптимизировать код внутри обработчика таймера, чтобы он выполнялся максимально быстро и не вызывал лишних серверных вызовов без необходимости.

← На главную