Разработчики, работающие с платформой 1С:Предприятие 7.7, часто сталкиваются с проблемой «замирания» интерфейса при выполнении тяжелых отчетов или обработок. Пользователю приходится периодически переключаться на окно программы, чтобы проверить, завершилась ли операция. В этой статье мы разберем универсальные способы создания уведомлений, которые не требуют внесения изменений в каждый отчет или документ вручную.
Одним из самых изящных и эффективных способов является программное изменение формул кнопок в момент открытия формы. Для этого нам понадобится внешняя компонента FormEx. Суть метода заключается в том, чтобы перехватить событие открытия любой формы и «дописать» к формуле основной кнопки (например, «Сформировать») вызов нашей глобальной функции уведомления.
Рассмотрим, как это реализовать в глобальном модуле. Проанализируем примерный алгоритм в процедуре ПослеОткрытияОбъекта:
Процедура ПослеОткрытия(Контекст)
// Перебираем все атрибуты формы
Для Ном = 0 По Контекст.КоличествоАтрибутов() - 1 Цикл
ТипАтр = "";
ИмяАтр = Контекст.ПолучитьАтрибут(Ном, ТипАтр);
// Если это кнопка, пробуем изменить её формулу
Если ТипАтр = "Кнопка" Тогда
ТекущаяФормула = Контекст.Формула(ИмяАтр);
Если ПустаяСтрока(ТекущаяФормула) = 0 Тогда
// Добавляем вызов нашей функции в конец стандартной формулы
НоваяФормула = ТекущаяФормула + "; глУведомитьОЗавершении()";
Контекст.Формула(ИмяАтр, НоваяФормула);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важно помнить, что при использовании ПолучитьАтрибут в FormEx индексация может начинаться с нуля. Обязательно проверяйте документацию к вашей версии компоненты, чтобы избежать падения системы (Runtime Error).
Если мы не хотим вмешиваться в формулы кнопок, мы можем использовать механизм мониторинга состояния системы. Часто длительная операция заканчивается выводом печатной формы (таблицы). Мы можем использовать обработку ожидания, которая будет проверять, не стал ли текущий активный контекст типом Таблица.
Разберем, как реализовать проверку через функцию АктивныйКонтекст():
Рассмотрим пример кода для такого мониторинга:
Процедура глПроверитьЗавершение()
Перем ТекКонтекст, ТипКонт;
ТекКонтекст = СоздатьОбъект("РасширениеФормы");
ТипКонт = ТекКонтекст.ТипАктивногоКонтекста(); // Используем возможности FormEx
Если ТипКонт = 2 Тогда // Например, 2 соответствует табличному документу
// Если окно стало активным и это таблица - выводим 1С на передний план
Сервис = СоздатьОбъект("Сервис");
Сервис.НаПереднийПлан();
Сообщить("Операция завершена: " + ТекущееВремя());
КонецЕсли;
КонецПроцедуры
Проанализируем еще один интересный подход — использование метода ПолучитьВремяПростояСистемы. Когда 1С 7.7 выполняет код, поток интерфейса занят, и система фиксирует это состояние. Как только выполнение кода завершается, управление возвращается в главный цикл сообщений Windows.
Мы можем создать внешнюю обработку или использовать таймер в FormEx, который будет следить за тем, когда система «освободится». Если время выполнения было значительным (например, более 10 секунд), и после этого система перешла в режим ожидания (Idle), мы можем воспроизвести звуковой сигнал или отправить уведомление.
В современных условиях простого Сообщить() в окне 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();
Исключение
// Ошибка сети или блокировка доступа
КонецПопытки;
КонецПроцедуры
Эту функцию можно вызывать в конце любой длительной процедуры или интегрировать в метод с подменой формул кнопок, описанный выше. Главное преимущество такого подхода — мобильность: вы получите уведомление на телефон, даже если база работает на удаленном сервере.
При реализации универсального механизма придерживайтесь следующих правил:
WinHttp.Выяснив причину неудобства пользователей, мы увидели, что даже в такой почтенной платформе, как 1С 7.7, существуют технические возможности для реализации современного функционала. Выбор конкретного метода зависит от вашей инфраструктуры и готовности использовать сторонние библиотеки.