Как настроить монитор готовности заказов в 1С с миганием и звуковым оповещением?

Программист 1С v8.3 (Обычные формы) Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

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

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

Архитектура решения: Табличный документ против HTML-поля

При проектировании монитора готовности у разработчика 1С есть два основных пути:

  1. Использование классического Табличного документа 1С. Этот способ кажется самым простым, однако он имеет существенный недостаток при реализации анимации. Чтобы заставить ячейку мигать, нам придется запустить обработчик ожидания с интервалом в 0.5–1 секунду. В этом обработчике придется каждый раз обходить строки таблицы, определять новые заказы и программно менять цвет фона или текста. Это создает лишнюю нагрузку на интерфейсный поток 1С и может вызывать неприятное визуальное мерцание всей формы.
  2. Использование Поля HTML документа. Этот вариант является наиболее гибким и современным. Мы можем сформировать красивую HTML-страницу с использованием CSS-стилей и JavaScript. Анимация мигания в этом случае будет выполняться на стороне движка рендеринга веб-страницы, абсолютно не нагружая саму платформу 1С.

Рассмотрим подробнее, как реализовать монитор именно на базе HTML-поля, и разберем сопутствующие технические нюансы.

Решение проблемы совместимости HTML-поля и эмуляции IE

Основная сложность, с которой сталкиваются разработчики при работе с HTML-полями в 1С (особенно на платформе 8.2 или старых релизах 8.3) — это режим совместимости. По умолчанию встроенный элемент управления «Поле HTML документа» использует движок Internet Explorer в режиме совместимости с версией IE7. В этом режиме современные CSS3-анимации (такие как @keyframes) и многие методы JavaScript (например, querySelector или getElementsByClassName) попросту не работают.

Чтобы решить эту проблему и заставить встроенный браузер работать в режиме современного рендеринга, выполним следующие действия:

Шаг 1. Добавление метатега в заголовок страницы. В генерируемый HTML-код обязательно нужно первой строкой в секции <head> вставлять специальный метатег совместимости. Он указывает браузеру использовать максимально доступную версию движка:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

Шаг 2. Настройка эмуляции через реестр Windows. Если на компьютере, где запускается монитор, установлен современный Internet Explorer 11, мы можем принудительно заставить 1С использовать его возможности. Для этого необходимо добавить параметры в реестр операционной системы. Создадим файл с расширением .reg и выполним его импорт:


Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"1Cv8.exe"=dword:00002af8
"1Cv8c.exe"=dword:00002af8

Значение 2af8 в шестнадцатеричной системе (или 11000 в десятичной) указывает системе, что для процессов 1С (толстого и тонкого клиентов) необходимо применять полноценный режим рендеринга IE11.

Обратите внимание: в современных версиях платформы 1С:Предприятие (начиная с релиза 8.3.14) фирма «1С» перевела поле HTML-документа на современный движок WebKit (Chromium), поэтому там эти манипуляции с реестром уже не потребуются.

Реализация мигания элементов на JavaScript

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

Поскольку старые версии IE могут некорректно отрабатывать метод document.getElementsByClassName, применим надежный алгоритм обхода всех тегов в документе. Посмотрим на пример кода HTML-страницы с таким скриптом:


<html> 
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>Монитор заказов</title>
    <script type='text/javascript'>
        function runBlinker() {
            var elements = document.getElementsByTagName('*');
            for (var i = 0; i < elements.length; i++) {
                var element = elements[i];
                if (element.className === "blink-element") {
                    // Переключаем цвет между белым и красным
                    if (element.style.color === 'red') {
                        element.style.color = 'black';
                    } else {
                        element.style.color = 'red';
                    }
                }
            }
            // Повторяем вызов каждые 500 миллисекунд
            setTimeout(runBlinker, 500); 
        }
    </script>
</head>
<body onload="runBlinker();">
    <h2>Список готовых заказов:</h2>
    <p>Заказ № 1024 — Готов к выдаче</p>
    <p class="blink-element" style="color: black; font-weight: bold;">Заказ № 1025 — СРОЧНО В ВЫДАЧУ!</p>
    <p>Заказ № 1026 — Готов к выдаче</p>
</body>
</html>

При загрузке этой страницы в поле HTML-документа 1С функция runBlinker запустится автоматически. Она найдет абзац с классом blink-element и начнет циклически переключать его цвет, привлекая внимание клиента в зале ожидания.

Добавление звукового оповещения с помощью встроенных средств Windows

Часто одного лишь визуального мигания на экране недостаточно, и требуется дублировать информацию голосом: например, «Заказ номер 125 готов!». Использовать платные внешние API-сервисы или устанавливать тяжелый сторонний софт не всегда удобно и целесообразно.

Выясним, как решить этот вопрос бесплатно и без установки дополнительного ПО. В операционную систему Windows встроен речевой движок **SAPI (Speech API)**. Мы можем легко запустить его из кода 1С через COM-объект SAPI.SpVoice.

Проанализируем пример кода на стороне 1С, который позволяет озвучить текст асинхронно, не блокируя работу интерфейса программы:


Процедура ОзвучитьТекст(ТекстДляОзвучивания) Экспорт
    Попытка
        // Создаем COM-объект синтеза речи Windows
        Голос = Новый COMОбъект("SAPI.SpVoice");
        
        // Флаг SVSFlagsAsync = 1 указывает, что речь должна воспроизводиться 
        // асинхронно. Это предотвратит зависание сеанса 1С на время проговаривания текста.
        ФлагАсинхронно = 1;
        
        Голос.Speak(ТекстДляОзвучивания, ФлагАсинхронно);
    Исключение
        ЗаписатьЛогОшибок("Не удалось запустить синтез речи SAPI: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Если на компьютере с Windows 10 или 11 установлены стандартные языковые пакеты, система автоматически подберет качественный встроенный русский голос (такой как "Irina" или "Pavel"). Озвучивание происходит локально, полностью бесплатно и не требует подключения к интернету.

Альтернативное воспроизведение звуковых файлов через HTML5

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

Гораздо профессиональнее использовать встроенные возможности HTML5. Мы можем внедрить скрытый аудиоплеер прямо в код нашей страницы монитора и управлять им через JavaScript:


<audio id="notification-sound" src="file:///C:/Sounds/notification.wav" preload="auto"></audio>

<script type="text/javascript">
    function playSound() {
        var sound = document.getElementById('notification-sound');
        if (sound) {
            sound.play();
        }
    }
</script>

Вы можете вызывать JS-функцию playSound() непосредственно из кода 1С при получении новых данных. Для этого в платформе 1С предусмотрен метод поля HTML-документа Документ.parentWindow.eval().

Оптимальный алгоритм обновления данных на экране

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


Процедура ПриОткрытии()
    // Подключаем обновление раз в 30 секунд
    ПодключитьОбработчикОжидания("ОбновитьМониторЗаказов", 30);
    ОбновитьМониторЗаказов();
КонецПроцедуры

Процедура ОбновитьМониторЗаказов()
    // Получаем таблицу актуальных заказов из базы данных
    ТаблицаЗаказов = ПолучитьТаблицуГотовыхЗаказов();
    
    // Формируем HTML-код динамически
    HTMLКод = СформироватьHTMLСтраницу(ТаблицаЗаказов);
    
    // Записываем HTML в элемент управления на форме
    ЭлементыФормы.ПолеHTMLМонитора.УстановитьТекст(HTMLКод);
КонецПроцедуры

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

← На главную