Создадим собственную роль в расширении, которая будет отвечать за просмотр общей формы расширения по взаимодействию списка неоформленных сотрудников. Затем в модуле приложения пишем код на запуск проверки наличия этой роли у пользователя и запуск подключения обработчика ожидания. (Чтобы не нагружать систему и не всем пользователям "мозолить" глаза своим уведомлением).
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
Если Расш1_ОбращениеКБазе.ПроверитьДоступностьРолиПользователю() Тогда
ОжиданиеОбработчикаУведомлениеОбОтпусках();
КонецЕсли;
КонецПроцедуры
Для того чтобы подключить обработчик ожидания необходим глобальный клиентский общий модуль.
Вот его содержимое:
Процедура ОжиданиеОбработчикаУведомлениеОбОтпусках() Экспорт
//Подключим свой обработчик ожидания, который будет ждать статус завершения фонового задания
ПодключитьОбработчикОжидания("ОбработчикПоискаБлижайшихНеоформленныхОтпусков", 600, Ложь);
КонецПроцедуры
Процедура ОбработчикПоискаБлижайшихНеоформленныхОтпусков() Экспорт
НеоформленныеСотрудники = Расш1_ОбращениеКБазе.ПолучитьСписокБлижайшихНеоформленныхСотрудников();
Если НеоформленныеСотрудники.Количество()> 0 Тогда
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияУведомления", Расш1_КлиентскиеФункции, НеоформленныеСотрудники);
ПоказатьОповещениеПользователя("Внимание! Имеются сотрудники с неоформленными отпусками "+ НеоформленныеСотрудники.Количество(), Оповещение, "Для оформления отпусков нажмите на это сообщение!", БиблиотекаКартинок.Bytex1_Отпуск, СтатусОповещенияПользователя.Важное,"КлючНикальности");
Иначе
ОтключитьОбработчикОжидания("ОбработчикПоискаБлижайшихНеоформленныхОтпусков");
КонецЕсли;
КонецПроцедуры
Содержимое общего модуля Расш1_ОбращениеКБазе:
Функция ПолучитьСписокБлижайшихНеоформленныхСотрудников() Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПлановыеЕжегодныеОтпуска.Организация КАК Организация,
| ПлановыеЕжегодныеОтпуска.Сотрудник КАК Сотрудник,
| РАЗНОСТЬДАТ(&ТекущийДень, ПлановыеЕжегодныеОтпуска.ДатаНачала, ДЕНЬ) КАК ЧислоДнейДоНачалаОтпуска,
| ПлановыеЕжегодныеОтпуска.ДатаНачала КАК ДатаНачала,
| ПлановыеЕжегодныеОтпуска.КоличествоДней КАК КоличествоДнейПлан
|ПОМЕСТИТЬ ПредстоящиеОтпуска
|ИЗ
| РегистрСведений.ПлановыеЕжегодныеОтпуска КАК ПлановыеЕжегодныеОтпуска
|ГДЕ
| ПлановыеЕжегодныеОтпуска.ВидОтпуска = ЗНАЧЕНИЕ(Справочник.ВидыОтпусков.Основной)
| И ПлановыеЕжегодныеОтпуска.Запланирован = ИСТИНА
| И ПлановыеЕжегодныеОтпуска.ДатаНачала >= &ТекущийДень
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПредстоящиеОтпуска.Организация КАК Организация,
| ПредстоящиеОтпуска.ЧислоДнейДоНачалаОтпуска КАК ЧислоДнейДоНачалаОтпуска,
| ПредстоящиеОтпуска.ДатаНачала КАК ДатаНачала,
| ПредстоящиеОтпуска.КоличествоДнейПлан КАК КоличествоДнейПлан,
| ПредстоящиеОтпуска.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ОтпускаПлан
|ИЗ
| ПредстоящиеОтпуска КАК ПредстоящиеОтпуска
|ГДЕ
| ПредстоящиеОтпуска.ЧислоДнейДоНачалаОтпуска <= 14
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ФактическиеОтпускаОбороты.Сотрудник КАК Сотрудник,
| ФактическиеОтпускаОбороты.КоличествоОборот КАК КоличествоДнейФакт,
| ФактическиеОтпускаОбороты.Период КАК ДатаНачалаФакт
|ПОМЕСТИТЬ ФактическиеОтпуска
|ИЗ
| РегистрНакопления.ФактическиеОтпуска.Обороты(, , Секунда, ВидЕжегодногоОтпуска = ЗНАЧЕНИЕ(Справочник.ВидыОтпусков.Основной)) КАК ФактическиеОтпускаОбороты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОтпускаПлан.Организация КАК Организация,
| ОтпускаПлан.Сотрудник КАК Сотрудник,
| ОтпускаПлан.ЧислоДнейДоНачалаОтпуска КАК ЧислоДнейДоНачалаОтпуска,
| ФактическиеОтпуска.КоличествоДнейФакт КАК КоличествоДнейФакт,
| ОтпускаПлан.КоличествоДнейПлан КАК КоличествоДнейПлан,
| ОтпускаПлан.ДатаНачала КАК ДатаНачала
|ПОМЕСТИТЬ Итог
|ИЗ
| ОтпускаПлан КАК ОтпускаПлан
| ЛЕВОЕ СОЕДИНЕНИЕ ФактическиеОтпуска КАК ФактическиеОтпуска
| ПО ОтпускаПлан.Сотрудник = ФактическиеОтпуска.Сотрудник
| И ОтпускаПлан.ДатаНачала = ФактическиеОтпуска.ДатаНачалаФакт
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Итог.Организация КАК Организация,
| Итог.Сотрудник КАК Сотрудник,
| Итог.ЧислоДнейДоНачалаОтпуска КАК ЧислоДнейДоНачалаОтпуска,
| Итог.КоличествоДнейФакт КАК КоличествоДнейФакт,
| Итог.ДатаНачала КАК ДатаНачала,
| Итог.КоличествоДнейПлан КАК КоличествоДнейПлан,
| КадроваяИсторияСотрудниковСрезПоследних.Должность КАК Должность,
| ФизическиеЛица.ФИО КАК ФИО
|ИЗ
| Итог КАК Итог
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(, ) КАК КадроваяИсторияСотрудниковСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
| ПО КадроваяИсторияСотрудниковСрезПоследних.ФизическоеЛицо = ФизическиеЛица.Ссылка
| ПО Итог.Сотрудник = КадроваяИсторияСотрудниковСрезПоследних.Сотрудник
|ГДЕ
| Итог.КоличествоДнейФакт ЕСТЬ NULL
| И НЕ КадроваяИсторияСотрудниковСрезПоследних.ВидСобытия = ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
|
|УПОРЯДОЧИТЬ ПО
| ФИО";
Запрос.УстановитьПараметр("ТекущийДень", ТекущаяДатаСеанса());
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
НеоформленныеСотрудники = Новый Массив;
Пока Выборка.Следующий() Цикл
СтруктураСотрудников = Новый Структура;
СтруктураСотрудников.Вставить("Организация", Выборка.Организация);
СтруктураСотрудников.Вставить("Сотрудник", Выборка.Сотрудник);
СтруктураСотрудников.Вставить("ЧислоДнейДоНачалаОтпуска", Выборка.ЧислоДнейДоНачалаОтпуска);
СтруктураСотрудников.Вставить("КоличествоДнейПлан", Выборка.КоличествоДнейПлан);
СтруктураСотрудников.Вставить("ДатаНачала", Выборка.ДатаНачала);
СтруктураСотрудников.Вставить("Должность", Выборка.Должность);
СтруктураСотрудников.Вставить("ФИО", Выборка.ФИО);
НеоформленныеСотрудники.Добавить(СтруктураСотрудников);
КонецЦикла;
УстановитьПривилегированныйРежим(Ложь);
Возврат НеоформленныеСотрудники;
КонецФункции
Функция ПроверитьДоступностьРолиПользователю() Экспорт
Возврат РольДоступна("Расш1_ПросмотрОбщейФормы");
КонецФункции
После того, как пользователь нажмет на уведомление, необходимо на клиенте открыть нашу общую форму для взаимодействия. Для этого создадим клиентский общий модуль.
Его содержимое:
Процедура ПослеЗакрытияУведомления(Параметры) Экспорт
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НеоформленныеСотрудники", Параметры);
ОткрытьФорму("ОбщаяФорма.Расш1_ФормаНеоформленныхСотрудников", ПараметрыФормы);
КонецПроцедуры