В процессе сопровождения конфигурации 1С:Управление нашей фирмой (УНФ) часто возникает необходимость дисциплинировать пользователей, напоминая им о выполнении определенных действий. Одной из типовых задач является вывод всплывающего окна (напоминания), которое должно появляться с определенной периодичностью (например, каждые 10 минут) до тех пор, пока пользователь не выполнит требуемое действие — например, не запустит определенную внешнюю обработку.
В этой статье мы подробно разберем, как реализовать такой механизм на платформе 8.3.17, используя как стандартные возможности встроенного языка, так и функционал Библиотеки стандартных подсистем (БСП), на которой построена УНФ.
Для реализации задачи нам необходимо решить три подзадачи:
Проанализируем способы реализации каждой из этих частей.
Это классический метод, который подходит для большинства конфигураций. Основная идея заключается в использовании метода ПодключитьОбработчикОжидания.
Шаг 1. Инициализация при старте системы
Нам нужно подключить проверку сразу после того, как пользователь вошел в программу. Для этого перейдем в Модуль управляемого приложения и найдем (или создадим) процедуру ПриНачалеРаботыСистемы. Добавим в нее код подключения обработчика:
Процедура ПриНачалеРаботыСистемы()
// Интервал задается в секундах. 10 минут = 600 секунд.
// Имя процедуры должно соответствовать экспортной процедуре в общем модуле.
ПодключитьОбработчикОжидания("ПроверитьНеобходимостьОповещения", 600, Ложь);
КонецПроцедуры
Шаг 2. Создание процедуры проверки
Рассмотрим, где разместить саму логику. Нам потребуется общий модуль, у которого установлены флаги Клиент (управляемое приложение) и Глобальный (или вызывать через имя модуля, если он не глобальный). Назовем процедуру ПроверитьНеобходимостьОповещения.
Процедура ПроверитьНеобходимостьОповещения() Экспорт
// 1. Проверяем, запускалась ли обработка сегодня
Если ОбработкаУжеЗапускаласьСегодня() Тогда
Возврат;
КонецЕсли;
// 2. Если не запускалась - выводим оповещение
ТекстЗаголовка = "Внимание!";
ТекстОповещения = "Вы еще не запускали обязательную обработку. Пожалуйста, сделайте это сейчас.";
ПоказатьОповещениеПользователя(ТекстЗаголовка, , ТекстОповещения, БиблиотекаКартинок.Важно);
КонецПроцедуры
Шаг 3. Фиксация факта запуска обработки
Выясним, как программа узнает, что запуск состоялся. Самый надежный способ — записывать текущую дату в настройки пользователя. В самой внешней обработке, в модуле формы, в процедуре ПриОткрытии (или при выполнении основного действия), добавим код сохранения:
// В модуле формы внешней обработки
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СохранитьФактЗапуска();
КонецПроцедуры
&НаСервере
Процедура СохранитьФактЗапуска()
// Используем ХранилищеОбщихНастроек для надежности
КлючОбъекта = "КонтрольЗапускаОбработок";
КлючНастройки = "ДатаПоследнегоЗапуска_МояОбработка";
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастройки, НачалоДня(ТекущаяДатаСеанса()));
КонецПроцедуры
Теперь функция ОбработкаУжеЗапускаласьСегодня() в общем модуле будет просто считывать это значение и сравнивать с началом текущего дня.
Поскольку УНФ 1.6 активно использует Библиотеку стандартных подсистем, мы можем задействовать штатный механизм напоминаний. Это гораздо удобнее для пользователя, так как он сможет сам нажать кнопку "Отложить на 15 минут", и система не будет его "спамить" жестко каждые 10 минут.
Рассмотрим, как программно создать напоминание через БСП. Проанализируем метод НапоминанияПользователя.УстановитьНапоминание(). Вместо того чтобы писать свой обработчик ожидания, мы один раз при старте системы проверяем условие и, если оно не выполнено, создаем запись в регистре сведений НапоминанияПользователя.
Преимущества использования БСП:
Модуле управляемого приложения.Если ваша база работает в клиент-серверном варианте и подключена к Системе взаимодействия (через бесплатный сервис 1С или свой сервер), мы можем использовать еще более современный подход. Выясним, как это работает: Программный код может отправить сообщение пользователю от лица "Системы". Это сообщение появится в правой панели и будет висеть там до тех пор, пока пользователь не прочитает его или не закроет чат. Это менее навязчиво, чем всплывающее окно по центру экрана, но более информативно.
Проанализируем ситуацию: если мы используем обработчик ожидания (Вариант 1), он будет срабатывать каждые 10 минут у каждого пользователя. Если процедура проверки будет "тяжелой" (например, делать запрос к большой таблице или искать файл на сервере), это может привести к кратковременным подвисаниям интерфейса ("микро-фризам").
Рассмотрим правила оптимизации:
ОтключитьОбработчикОжидания("ПроверитьНеобходимостьОповещения").ПоказатьОповещениеПользователя передавать навигационную ссылку. Если пользователь кликнет по всплывающему окну, система может автоматически открыть ту самую внешнюю обработку. Это значительно повысит лояльность пользователей к вашим "напоминалкам".Мы рассмотрели несколько способов реализации системы оповещений. Для быстрой реализации "на коленке" идеально подходит обработчик ожидания. Однако для качественного внедрения в 1С:УНФ рекомендуется использовать подсистему Напоминаний БСП, так как она предоставляет пользователю больше контроля и выглядит как органичная часть интерфейса программы.
Не забывайте фиксировать факт выполнения действия внутри самой обработки, иначе механизм напоминаний не узнает о том, что его миссия выполнена.