Документооборот КОРП, ПРОФ и ДГУ
27.01.2016

Уведомления по объектам и событиям

Общая информация

Чтобы держать пользователей в курсе изменения важных данных и наступления важных событий в "1С:Документообороте" предусмотрены уведомления. Существует два типа уведомлений:

Уведомления о событиях сообщают пользователю о важных для него событиях, при этом программа самостоятельно проверяет важность события для пользователя. Примером такого уведомления служит уведомление о новых задачах: если пользователь подписан на такое уведомление, то он будет получать уведомления обо всех задачах, которые адресованы ему, роли, исполнителем которой он является, или пользователю, который делегировал ему права работы с задачами.

Уведомления по объектам сообщают пользователю о событиях по конкретному объекту, на который он подписался. Например, уведомление о появлении новых файлах в конкретной папке.

Метаданные

Используемые метаданные отнесены к подсистеме Уведомления. Рассмотрим эти метаданные подробнее.

Общие модули

В общих модулях РаботаСУведомлениями и РаботаСУведомлениямиПереопределяемый реализована основная логика работы подсистемы уведомлений. Подробнее данные модули описаны ниже.

Регламентные задания

Функциональные опции

Общие формы

Константы

Перечисления

Перечисление НастройкиУведомлений содержит в себе настройки уведомлений, доступные для настройки:

Перечисление СобытияУведомлений содержит в себе события, о которых можно рассылать уведомления, но которые при этом невозможно классифицировать как бизнес-события (например, факт, что задача просрочена, нельзя отнести к бизнес-событиям).

Перечисление СпособыУведомления содержит в себе различные способы уведомления пользователей. В текущей реализации используется только один способ уведомления - по почте.

Регистры сведений

Внутреннее устройство

Права доступа, роли, делегаты

Уведомления рассылаются с учетом прав доступа. Если у пользователя нет прав на чтение объекта, с которым произошло событие, он не получит уведомление. Проверка прав доступа осуществляется при формировании очереди уведомлений в регламентных заданиях ОбработкаПроизошедшихБизнесСобытий, КонтрольОкончанияСрокаДействия, КонтрольСрокаЗадач, КонтрольСрокаКонтроля. В регистр сведений ОчередьУведомлений попадают только те объекты, по которым уже выполнена проверка прав доступа. Дополнительная проверка прав доступа перед рассылкой не требуется.

Для исполнителей задач используется ролевое уведомление. Если исполнителем задачи является роль, то уведомления получат все исполнители этой роли. Для каждого исполнителя роли проверка прав выполняется независимо. В регистр сведений ОчередьУведомлений попадают записи для рассылки уже по конкретным исполнителям роли, а не по роли в целом.

Делегаты получают уведомления по событиям тех пользователей, права которых они получили. Для пользователя, от которого делегированы права, и для каждого делегата проверка прав выполняется независимо. В регистр сведений ОчередьУведомлений попадают записи для рассылки уже по конкретным пользователям, включая делегатов.

Настройка уведомлений

В модуле РаботаСУведомлениями за настройку уведомлений отвечают следующие процедуры и функции:

В модуле РаботаСУведомлениямиПереопределяемый за настройку уведомление отвечают следующие процедуры и функции:

Обработка бизнес-событий

Обработка бизнес-событий начинается в модуле РаботаСУведомлениями в процедуре ОбработатьБизнесСобытие. При обработке бизнес-события из него обрабатываются следующие важные поля:

Основная логика формирования очереди прописана в процедурах, вызываемых из процедуры ДобавитьУведомлениеПоОбъекту. Пример такой процедуры - ДобавитьУведомленияПоБизнесПроцессу. В ней прописана особая логика обработки бизнес-событий для процессов различных событий. Например, в ветке события ВыполнениеЗадачи прописано логика работы подписки на событие Ход выполнения процесса:

Доступны следующие служебные процедуры, которые используются для формирования очереди уведомлений:

Контроль сроков

Контроль сроков для уведомлений выполняется в модуле РаботаСУведомлениями в процедурах КонтрольСрокаЗадача, КонтрольОкончанияСрокаДействия, КонтрольСрокаКонтроля. Данные процедуры состоят из двух этапов - из этапа контроля срока и этапа контроля просроченных.

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

После формирования данных, по которым могут отправляться уведомления, выполняется формирование подписчиков (исходя из сформированных ранее данных) и чтение настроек подписчиков.

После этого начинается обработка каждой записи из сформированных ранее данных: проверяются настройки подписчиков, удовлетворяет ли запись конкретной настройке конкретного подписчика; выполняется проверка прав. Если проверка выполнена успешно, формируется запись в очереди уведомлений, а данная запись отмечается как обработанная. Отметка записи как обработанной необходима для контроля частоты рассылки уведомлений в соответствии с настройками - уведомления рассылаются не каждый раз при запуске задания, а только когда подойдет срок в соответствии с указанной частотой и датой последней обработки.

Рассылка уведомлений

Рассылка уведомлений выполняется в модуле РаботаСУведомлениями в процедуре ОбработатьУведомленияВОчередиУведомлений. В рамках данной процедуры выполняется отправка ранее сформированных уведомлений из очереди. Для каждого уведомления из очереди выполняется три попытки отправки. При успешной отправке запись удаляется из очереди. При неуспешной отправке запись остается в регистре. После трех неудачных попыток запись больше не обрабатывается и остается в очереди уведомлений. В журнале регистрации записи о рассылке уведомлений сохраняются по событию Уведомление о новых событиях.

Перед рассылкой выполняется попытка группировки уведомлений по получателю с помощью процедуры СформироватьУведомленияПоВидуБизнесСобытия. Например, уведомление о 10 новых задачах будет сгруппировано в одно письмо именно с помощью данной процедуры.

При включенной настройке выполнения задач по почте уведомление о новых задачах не группируется. Темы, тексты и файлы писем при этом формируются в модуле ВыполнениеЗадачПоПочтеСервер в функциях СформироватьТемуУведомленияПоЗадачеСВозможностьюВыполненияПоПочте, СформироватьТекстУведомленияПоЗадачеСВозможностьюВыполненияПоПочте и СформироватьФайлыУведомленияПоЗадачеСВозможностьюВыполненияПоПочте.

По несгруппированным уведомлениям будет выполнено формирование тем и текстов в СформироватьУведомленияПоСобытиям. Например, при выполнении задач по почте уведомление о новой задаче будет отправлено отдельным письмом с помощью данной процедуры.

В целом формирование текстов уведомлений для всех видов событий одинаково - формируется описание по всем объектам уведомлений. Формирование описания происходит в функциях, вызываемых из СформироватьПредставлениеОбъекта. Для изменения порядка формирования представления для объекта следует внести изменения в функцию СформироватьПредставлениеОбъектаПереопределяемый общего модуля РаботаСУведомлениямиПереопределяемый.

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

Непосредственная рассылка уведомлений производится в ОтправитьУведомлениеПоПочте. Адреса для рассылки формируются из контактной информации пользователя и дополнительных адресов для рассылки уведомлений, указанных в персональных настройках. Данная логика прописана в функции ПолучитьДанныеСпособаУведомления. Рассылка может выполняться по внешней и внутренней маршрутизации. При этом исходящие письма в базе не сохраняются.

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

Как настроить уведомления в первый раз

Настройка уведомлений выполняется следующим образом:

  1. Перейти в раздел Настройка и администрирование - Настройка программы - Общие настройки и установить флажки Использовать бизнес-события и Использовать уведомления.
  2. Перейти по гиперссылке Настроить возле флажка Использовать уведомления.
  1. Перейти в раздел Настройка и администрирование - Учетные записи и выполнить настройку предопределенной системной учетной записи. Учетная запись должна быть настроена для "легкой" почты. После настройки следует проверить работоспособность учетной записи с помощью команды Проверить учетную запись.
  2. Перейти Настройка и администрирование - Поддержка и обслуживание - Регламентные и фоновые задания. Следует включить и настроить расписание для регламентных заданий Обработка произошедших бизнес-событий, Контроль приближения окончания срока действия, Контроль приближения сроков задач, Контроль приближения сроков контроля, Уведомление пользователей о произошедших событиях.

Что делать, если не приходят уведомления

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

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

  1. Создаём задачу для пользователя. Проверяем, что в регистре сведений Произошедшие бизнес-события были созданы соответствующие записи о создании задачи.
  2. Выполняем регламентное задание Обработка произошедших бизнес-событий. Проверяем, что в регистре сведений Произошедшие бизнес-события запись была отмечена как обработанная. Проверяем, что в регистре сведений Очередь уведомлений появилась соответствующая запись для уведомления пользователя. Если записи не появились - ошибка возникает на этапе обработки бизнес-событий. Следует проверить активность подписки пользователей, наличие у пользователя прав доступа, является ли он исполнителем роли или настроено ли корректно делегирование.
  3. Выполняем регламентное задание Уведомление пользователей о произошедших событиях. Проверяем, что в регистре сведений Очередь уведомлений соответствующая запись пропала. Проверяем, что в журнале регистрации появилась запись вида Уведомления успешно отправлены на адрес ***. Проверяем, что пришло письмо с уведомлением на указанную почту (возможно, только по внутренней маршрутизации, если заведена соответствующая учетная запись).

Что делать, если приходят уведомления о просроченных задачах, хотя задача уже выполнена

Скорее всего, где-то развернута копия базы, которая рассылает уведомления. Это либо серверная копия базы, на которой не включена блокировка регламентных заданий, либо файловая база. Для исправления ошибки следует либо выявить данную копию базу и заблокировать работу регламентных заданий, либо сменить в рабочей базе пароль на системную учетную запись, с которой выполняется рассылка уведомлений.

Рекомендации по доработке

Как изменить текст уведомления

Изменить тексты уведомлений можно с помощью доработки конфигурации, внося изменения в общий модуль РаботаСУведомлениямиПереопределяемый.

В первую очередь необходимо определиться, что нужно изменить:

Пример

Рассмотрим второй вариант (доработку представления объекта в уведомлении, связанное с событием уведомления) на примере уведомления о новой задаче. Считаем, что исполнение задач по почте не используется.

1. Откажемся от группировки уведомлений о новых задачах. Пусть по каждой задаче приходит отдельное письмо.

Для этого необходимо внести изменения в процедуру ВидыСобытийДляГруппировкиПереопределяемый общего модуля РаботаСУведомлениямиПереопределяемый , удалив из стандартного состава видов событий для группировки, группировка по созданию задачи.

Копировать в буфер обмена
 
Процедура ВидыСобытийДляГруппировкиПереопределяемый(ВидыСобытий, ПолучательУведомления)	
	Индекс = ВидыСобытий.Найти(Справочники.ВидыБизнесСобытий.СозданиеЗадачи);
	Если Индекс <> Неопределено Тогда
		ВидыСобытий.Удалить(Индекс);
	КонецЕсли;	
КонецПроцедуры

2. Изменим тему писем с уведомлениями.

Для этого необходимо внести изменения в функцию СформироватьТемуУведомленияПоСобытиюПереопределяемый общего модуля РаботаСУведомлениямиПереопределяемый – для создания новой задачи будем формировать тему уведомления. При этом для остальных уведомлений важно оставить результат работы функции в значении пустой строки, чтобы обозначить необходимость использования стандартного формирования темы письма.

Копировать в буфер обмена
 
Функция СформироватьТемуУведомленияПоСобытиюПереопределяемый(
	ОбъектПодписки,
	ВидСобытия,
	ОбъектУведомления,
	ПолучательУведомления,
	ДополнительноеОписание)
	ТемаУведомления = "Тема";
	
	Если ВидСобытия = Справочники.ВидыБизнесСобытий.СозданиеЗадачи Тогда
		НаименованиеЗадачи = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектУведомления, "Наименование");
		ТемаУведомления = СтрШаблон(НСтр("ru = 'Вам поступила задача ""%1""'"), НаименованиеЗадачи);
	КонецЕсли;
	
	Возврат ТемаУведомления;
	
КонецФункции

3. Изменим текст писем с уведомлениям.

Для этого необходимо внести изменения в функцию СформироватьТекстУведомленияПоСобытиюПереопределяемый общего модуля РаботаСУведомлениямиПереопределяемый – для создания новой задачи будем формировать текст уведомления. При этом для остальных уведомлений важно оставить результат работы функции в значении пустой строки, чтобы обозначить необходимость использования стандартного формирования текста письма.

Копировать в буфер обмена
 Функция 
 СформироватьТекстУведомленияПоСобытиюПереопределяемый(
	ОбъектПодписки,
	ВидСобытия,
	ОбъектУведомления,
	ПолучательУведомления,
	ДополнительноеОписание)
	
	ТекстУведомления = "";
	
	Если ВидСобытия = Справочники.ВидыБизнесСобытий.СозданиеЗадачи Тогда
		РеквизитыЗадачи = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ОбъектУведомления, "СрокИсполнения, Наименование");
		НеУказанПредставление = НСтр("ru = 'Не указан'");
		ФорматнаяСтрока = СтрШаблон("ДФ='dd.MM.yyyy HH:mm'; ДП='%1'", НеУказанПредставление);
		ПредставлениеСрока = Формат(РеквизитыЗадачи.СрокИсполнения, ФорматнаяСтрока);
		ТекстУведомления = СтрШаблон(НСтр("ru = 'Уважаемый (ая) %1!
				|
				|Вам поступила задача "%2".
				|Крайний срок исполнения задачи: %3.
				|Вы можете перейти к задаче, нажав на ссылку: <a href="/db/content/metod8dev/src/developers/doc8dev/%254">Перейти к выполнению задачи</a>				|
				|С уважением,
				|Сервис уведомлений 1С:Документооборота"),
			ПолучательУведомления,
			РеквизитыЗадачи.Наименование,
			ПредставлениеСрока,
			РаботаСУведомлениями.ПолучитьНавигационнуюСсылкуУведомления(
ОбъектУведомления));
	КонецЕсли;
	
	Возврат ТекстУведомления;
	
КонецФункции

В результате пользователь будет получать уведомление о новых задачах следующего вида:

Как изменить логику формирования очереди уведомлений

Для изменения логики формирования очереди уведомлений необходима доработка конфигурации.

Рассмотрим пример изменения логики работы для папки файлов. В первую очередь необходимо определить, для какого объекта необходимо внести изменения. Допустим, мы хотим, чтобы при подписке на папку файлов уведомления приходили не только при добавлении в данную папку, но и при добавлении во все вложенные папки.

Основная логика добавления уведомлений прописана в модуле РаботаСУведомлениями в процедуре ДобавитьУведомлениеПоОбъекту. Находим ветку для нужного объекта - в нашем случае это ДобавитьУведомленияПоПапкеФайлов. Чтобы обработать произошедшие событие и для подписок на родительскую папку, необходимо сделать вызов ДобавитьУведомлениеПоОбъекту, передав в него папку родителя.

Чтобы логика работы поменялась только для одного вида события, создадим ветку, соответствующую данному виду бизнес-события. Старый код вынесем в отдельную ветку, чтобы сохранить прежнее поведение для всех остальных бизнес-событий.

Копировать в буфер обмена
 Процедура ДобавитьУведомленияПоПапкеФайлов(ПроизошедшееСобытие, Папка, ВидСобытия, ОбъектУведомления) 
	
	Если ВидСобытия = Справочники.ВидыБизнесСобытий.СозданиеФайла Тогда
		
		Если ЗначениеЗаполнено(Папка.Родитель) Тогда
			ДобавитьУведомлениеПоОбъекту(
				ПроизошедшееСобытие,
				Папка.Родитель,
				ВидСобытия,
				ОбъектУведомления);
		КонецЕсли;
		
		ДобавитьУведомленияПодписчиковПоОбъекту(Папка, ВидСобытия, ОбъектУведомления);
		
	Иначе
		
		ДобавитьУведомленияПодписчиковПоОбъекту(Папка, ВидСобытия, ОбъектУведомления);
		
	КонецЕсли;
	
	
КонецПроцедуры

Другие рекомендации

При добавлении нового объекта, по которому возможна подписка (например, вид документа, если необходимо добавить возможность подписаться на событие по конкретному виду документа):

При добавлении нового объекта, по которому возможна рассылка уведомлений (например, вид документа, если необходимо уведомлять об изменении в настройках вида документа):

При добавлении нового события, по которому возможно уведомление (например, событие изменении настроек вида документа, если необходимо уведомлять об изменении в настройках вида документа):

Как включать в уведомление внешние ссылки, открывающие тонкий клиент

Помимо открытия веб-клиента из внешних почтовых ссылок при рассылке уведомлений есть возможность открытия тонкого клиента. Возможность не является типовой и сложна в поддержке, но может оказаться полезной.

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

Копировать в буфер обмена
REGEDIT4

[HKEY_CLASSES_ROOT\e1c]
@="URL:e1c Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\e1c\DefaultIcon]
@="\"C:\\Program Files (x86)\\1cv82\\common\\1cestart.exe\""

[HKEY_CLASSES_ROOT\e1c\shell]

[HKEY_CLASSES_ROOT\e1c\shell\open]

[HKEY_CLASSES_ROOT\e1c\shell\open\command]
@="\"C:\\Program Files (x86)\\1cv82\\common\\1cestart.exe\" /url \"%1\""