Механизм оповещения базируется на штатном механизме версионирования типовых конфигураций 1С на платформе 8.1.
Разработка велась на сильно измененной версии УПП 1.1, в которую были перенесены механизмы версионирования из УПП 1.2
Ограничения текущей версии
- В рамках одного оповещения анализ условий выполняется только по одному объекту ИБ (элемент справочника, документ);
- Анализируются только шапки документов и элементов справочников (возможна доработка для анализа табличных частей);
- Версия содержит мелкие ошибки при копировании настроек, не мешающие понять работоспособность механизма
Алгоритм работы системы оповещений
В справочнике "Регистрация запросов на оповещения" настраиваются условия, при наступлении которых возникают оповещения.
Оповещение может отрабатываться, только если в конфигурации включен режим версионирования объектов и нужный вид справочника или документа версионируется.
Возможны три варианта оповещений:
- При вводе нового объекта;
- При любом изменении объекта;
- При возникновении ситуации, когда значения реквизитов объекта удовлетворяют заданым условиям.
Анализ возникновения событий производит регламентное задание УстановитьОповещения. Оно считывает все изменения контролируемых системой объектов с момента последнего запуска этого задания, сравнивает их состояния с предыдущим. Выполнение анализа протоколируется в журнале регистрации.
- Если требуется информирование пользователя, в регистр сведений РегистрацияОповещений помещается информация о наступлении события, контролируемого системой оповещений.
- Если у пользователя задан параметр ОткрыватьПриЗапускеСписокОповещений, окно оповещений открывается при запуске (обработка ТекущиеОповещения).
- Если у пользователя задан параметр АвтоматическиОбновлятьСписокОповещений, каждые 10 минут производится анализ регистра сведений РегистрацияОповещений.
- Пользователь может отказаться от дальнейшего показа оповещения, при этом изменяется реквизит БольшеНеНапоминать в регистре сведений РегистрацияОповещений.
Инструкция по внедрению функциональности
Прилагается cf-файл каркасной конфигурации, которую необходимо аккуратно объединить с имеющейся:
- В общем модуле Оповещения необходимо заменить код
//ОтправитьПисьмоSMTPБезУведомлений(СписокАдресов, ТемаСообщения, ТекстСообщения);
на вызов используемой в Вашей конфигурации процедуры отправки почтовых сообщений.
- В план видов характеристик НастройкиПользователей нужно добавить предопределенные элементы
- ОткрыватьПриЗапускеСписокОповещений
- АвтоматическиОбновлятьСписокОповещений
- В модуль приложения в процедуру ПриНачалеРаботыСистемы() добавить
Если ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ОткрыватьПриЗапускеСписокОповещений") = Истина Тогда
Обработки.ТекущиеОповещения.ПолучитьФорму().Открыть();
КонецЕсли;
Если ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "АвтоматическиОбновлятьСписокОповещений") = Истина Тогда
ПодключитьОбработчикОжидания("ПроверкаОповещений", 6000) ;
КонецЕсли;
Использование неглобальных модулей
Внимание!
В Вашей конфигурации часть используемых в моей конфигурации функций и процедур может находиться в неглобальных модулях. Проведите синтаксический контроль кода и добавьте префиксы, если необходимо.
Обработчик ПроверкаОповещений можно разместить в любом глобальном модуле:
#Если Клиент Тогда
Процедура ПроверкаОповещений() Экспорт
Оповестить("ОбновитьСписокОповещений");
КонецПроцедуры
#КонецЕсли
Если в Вашей конфигурации используется ограничение прав доступа (например, по организации), необходимо ограничить оповещения только доступными объектами. Например, в процедуре ЗарегистрироватьОповещение может быть код, похожий на вот этот:
// во-первых, отфильтруем по организации, недоступные отбросим
Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Подписка.ВидДокумента))
И Подписка.ВидДокумента.Метаданные().Реквизиты.Найти("Организация")<>Неопределено Тогда
ДоступныеО=РегистрыСведений.СписокОрганизацийДляПросмотра.Выбрать(Новый Структура("Пользователь",Пользователь.Пользователь)); // это специфический для моей конфигурации регистр
ОрганизацияДоступна=Ложь;
ОрганизацияДокумента=Претендент.Объект["Организация"];
Пока ДоступныеО.Следующий() Цикл
Если ДоступныеО.Организация=ОрганизацияДокумента Тогда
ОрганизацияДоступна=Истина;
КонецЕсли;
КонецЦикла;
Если ОрганизацияДоступна=Ложь Тогда
Продолжить; // не показываем
КонецЕсли;
КонецЕсли;