Как реализовать универсальное уведомление о завершении длительных операций в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Метод 1: Динамическая подмена формул кнопок через FormEx

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

Рассмотрим, как это реализовать в глобальном модуле. Проанализируем примерный алгоритм в процедуре ПослеОткрытияОбъекта:


Процедура ПослеОткрытия(Контекст)
    // Перебираем все атрибуты формы
    Для Ном = 0 По Контекст.КоличествоАтрибутов() - 1 Цикл
        ТипАтр = "";
        ИмяАтр = Контекст.ПолучитьАтрибут(Ном, ТипАтр);
        
        // Если это кнопка, пробуем изменить её формулу
        Если ТипАтр = "Кнопка" Тогда
            ТекущаяФормула = Контекст.Формула(ИмяАтр);
            Если ПустаяСтрока(ТекущаяФормула) = 0 Тогда
                // Добавляем вызов нашей функции в конец стандартной формулы
                НоваяФормула = ТекущаяФормула + "; глУведомитьОЗавершении()";
                Контекст.Формула(ИмяАтр, НоваяФормула);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важно помнить, что при использовании ПолучитьАтрибут в FormEx индексация может начинаться с нуля. Обязательно проверяйте документацию к вашей версии компоненты, чтобы избежать падения системы (Runtime Error).

Метод 2: Отслеживание изменения активного контекста

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

Разберем, как реализовать проверку через функцию АктивныйКонтекст():

  1. В глобальном модуле запускаем обработку ожидания с небольшим интервалом.
  2. Внутри обработчика проверяем тип текущего окна.
  3. Если предыдущее состояние было «Форма», а текущее стало «Таблица», и прошло достаточно времени — сигнализируем пользователю.

Рассмотрим пример кода для такого мониторинга:


Процедура глПроверитьЗавершение()
    Перем ТекКонтекст, ТипКонт;
    ТекКонтекст = СоздатьОбъект("РасширениеФормы");
    ТипКонт = ТекКонтекст.ТипАктивногоКонтекста(); // Используем возможности FormEx
    
    Если ТипКонт = 2 Тогда // Например, 2 соответствует табличному документу
        // Если окно стало активным и это таблица - выводим 1С на передний план
        Сервис = СоздатьОбъект("Сервис");
        Сервис.НаПереднийПлан();
        Сообщить("Операция завершена: " + ТекущееВремя());
    КонецЕсли;
КонецПроцедуры

Метод 3: Использование времени простоя системы

Проанализируем еще один интересный подход — использование метода ПолучитьВремяПростояСистемы. Когда 1С 7.7 выполняет код, поток интерфейса занят, и система фиксирует это состояние. Как только выполнение кода завершается, управление возвращается в главный цикл сообщений Windows.

Мы можем создать внешнюю обработку или использовать таймер в FormEx, который будет следить за тем, когда система «освободится». Если время выполнения было значительным (например, более 10 секунд), и после этого система перешла в режим ожидания (Idle), мы можем воспроизвести звуковой сигнал или отправить уведомление.

Метод 4: Современные уведомления через Telegram (WinHTTP)

В современных условиях простого Сообщить() в окне 1С бывает недостаточно, особенно если программист отошел от рабочего места. Мы можем использовать объект WinHttp.WinHttpRequest для отправки сообщения в Telegram. Это работает даже в старой «семерке» без установки тяжелых внешних компонент.

Посмотрим на пример функции для отправки уведомления:


Процедура глОтправитьВТелеграм(ТекстСообщения)
    Попытка
        Http = СоздатьОбъект("ActiveX.WinHttp.WinHttpRequest.5.1");
        Token = "ВАШ_ТОКЕН_БОТА";
        ChatID = "ВАШ_CHAT_ID";
        URL = "https://api.telegram.org/bot" + Token + "/sendMessage?chat_id=" + ChatID + "&text=" + ТекстСообщения;
        
        Http.Open("GET", URL, 0);
        Http.Send();
    Исключение
        // Ошибка сети или блокировка доступа
    КонецПопытки;
КонецПроцедуры

Эту функцию можно вызывать в конце любой длительной процедуры или интегрировать в метод с подменой формул кнопок, описанный выше. Главное преимущество такого подхода — мобильность: вы получите уведомление на телефон, даже если база работает на удаленном сервере.

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

При реализации универсального механизма придерживайтесь следующих правил:

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

← На главную