Задача:
Уведомлять руководителей сотрудников об окончании трудового договора.
Решение:
В типовом функционале ЗУП 3.1 (3.1.27.23) нет уведомления об окончании договора, но есть об окончании испытательного срока. Было решено взять его за основу и создать свой вид уведомления.
Виды уведомлений создаются программно. Создание прописано в соответствующих модулях подсистем. А вызов создания/обновления происходит по команде в форме списка справочника Виды уведомлений - Еще - Обновить Виды уведомлений.
Описание вида уведомления Окончание испытательного срока находится в модуле АдаптацияУвольнение в процедуре ПриЗаполненииСпискаВидовУведомлений. С помощью расширения в эту процедуру добавим новое описание для Окончания трудового договора.
&После("ПриЗаполненииСпискаВидовУведомлений")
Процедура Рассылка_ПриЗаполненииСпискаВидовУведомлений(СтруктураДоступныхВидовУведомлений)
//ТФ
// Окончание трудового договора
СтруктураОкончаниеТД = УведомленияСервер.ПустоеОписаниеВидаУведомления();
СтруктураОкончаниеТД.ВидУведомления = НСтр("ru = 'Окончание ТД'");
СтруктураОкончаниеТД.GUID = "b21166e9-7a14-11ec-83fa-bd5234e4af50"; //тут любой ГУИД
СтруктураОкончаниеТД.Описание = НСтр("ru = 'Привязано к дате окончания ТД.'");
СтруктураОкончаниеТД.Инициализация = "АдаптацияУвольнение.ИнициализацияОкончаниеТД";
СтруктураОкончаниеТД.ПолучениеДанных = "АдаптацияУвольнение.ПолучениеДанныхОкончаниеТД";
СтруктураДоступныхВидовУведомлений.Вставить("ОкончаниеТД", СтруктураОкончаниеТД);
КонецПроцедуры
Процедура ИнициализацияОкончаниеТД(ОписаниеДанных) Экспорт
ОписаниеДанных.ТипПредмета = Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица");
УведомленияСервер.ДобавитьПолучателя(ОписаниеДанных, "Предмет", НСтр("ru = 'Сотрудник'"), Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));
УведомленияСервер.ДобавитьПолучателя(ОписаниеДанных, "Руководитель", НСтр("ru = 'Руководитель'"), Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));
УведомленияСервер.ДобавитьПолучателя(ОписаниеДанных, "Ответственный", НСтр("ru = 'Ответственный за кандидата'"), Новый ОписаниеТипов("СправочникСсылка.Пользователи"));
УведомленияСервер.ДобавитьПолучателя(ОписаниеДанных, "Заявитель", НСтр("ru = 'Заявитель вакансии'"), Новый ОписаниеТипов("СправочникСсылка.Пользователи"));
УведомленияСервер.ДобавитьОтбор(ОписаниеДанных, "Организация", НСтр("ru = 'Организация'"), Новый ОписаниеТипов("СправочникСсылка.Организации"));
УведомленияСервер.ДобавитьОтбор(ОписаниеДанных, "ФизическоеЛицо", НСтр("ru = 'Сотрудник'"), Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));
КонецПроцедуры
Процедура ПолучениеДанныхОкончаниеТД(СтруктураПериода, Отборы, ТаблицаРезультата) Экспорт
УстановитьПривилегированныйРежим(Истина);
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.НачалоПериода = СтруктураПериода.НачалоПериода;
ПараметрыПолучения.ОкончаниеПериода = СтруктураПериода.ОкончаниеПериода;
ПараметрыПолучения.КадровыеДанные =
"ФизическоеЛицо, Сотрудник, Организация, Подразделение, Должность, ДолжностьПоШтатномуРасписанию, МестоВСтруктуреПредприятия";
Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
КадровыйУчет.СоздатьВТСотрудникиОрганизации(Запрос.МенеджерВременныхТаблиц, Ложь, ПараметрыПолучения);
Запрос.УстановитьПараметр("НачалоПериода", СтруктураПериода.НачалоПериода);
Запрос.УстановитьПараметр("ОкончаниеПериода", СтруктураПериода.ОкончаниеПериода);
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КадровыеДанныеСотрудников.Организация КАК Организация,
| КадровыеДанныеСотрудников.Сотрудник КАК Сотрудник,
| КадровыеДанныеСотрудников.ФизическоеЛицо КАК ФизическоеЛицо,
| СведенияКонтрактаДоговораСотрудника.ДатаОкончания КАК ДатаЗавершения,
| ЕСТЬNULL(КадровыеДанныеСотрудников.ДолжностьПоШтатномуРасписанию, ЗНАЧЕНИЕ(Справочник.ШтатноеРасписание.ПустаяСсылка)) КАК Позиция,
| ЕСТЬNULL(КадровыеДанныеСотрудников.МестоВСтруктуреПредприятия, ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка)) КАК МестоВСтруктуреПредприятия
|ПОМЕСТИТЬ ВТОкончаниеДоговора
|{ВЫБРАТЬ
| Организация КАК ОрганизацияПриПриеме}
|ИЗ
| РегистрСведений.СведенияКонтрактаДоговораСотрудника.СрезПоследних(
| ,
| (Сотрудник, ФизическоеЛицо, Организация) В
| (ВЫБРАТЬ
| ВТСотрудникиОрганизации.Сотрудник,
| ВТСотрудникиОрганизации.ФизическоеЛицо,
| ВТСотрудникиОрганизации.Организация
| ИЗ
| ВТСотрудникиОрганизации КАК ВТСотрудникиОрганизации)) КАК СведенияКонтрактаДоговораСотрудника
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСотрудникиОрганизации КАК КадровыеДанныеСотрудников
| ПО СведенияКонтрактаДоговораСотрудника.Сотрудник = КадровыеДанныеСотрудников.Сотрудник
| И СведенияКонтрактаДоговораСотрудника.ФизическоеЛицо = КадровыеДанныеСотрудников.ФизическоеЛицо
| И СведенияКонтрактаДоговораСотрудника.Организация = КадровыеДанныеСотрудников.Организация
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТОкончаниеДоговора.Сотрудник КАК Сотрудник,
| ВТОкончаниеДоговора.ФизическоеЛицо КАК ФизическоеЛицо,
| ВТОкончаниеДоговора.ДатаЗавершения КАК ДатаЗавершения,
| ВТОкончаниеДоговора.Организация КАК Организация,
| ВТОкончаниеДоговора.Позиция КАК Позиция,
| ВТОкончаниеДоговора.МестоВСтруктуреПредприятия КАК МестоВСтруктуреПредприятия
|ИЗ
| ВТОкончаниеДоговора КАК ВТОкончаниеДоговора
|ГДЕ
| ВТОкончаниеДоговора.ДатаЗавершения <> ДАТАВРЕМЯ(1, 1, 1)");
Если Отборы.Количество() > 0 Тогда
ОтборЗапроса = СхемаЗапроса.ПакетЗапросов[1].Операторы[0].Отбор;
Для Каждого СтрокаОтбора Из Отборы Цикл
Если СтрокаОтбора.Использование Тогда
ТекстУсловия = УведомленияСервер.ПредставлениеУсловияДляЗапроса(
СтрокаОтбора.ВидСравнения,
СтрокаОтбора.ЛевоеЗначение,
"ВТОкончаниеДоговора." + СтрокаОтбора.ЛевоеЗначение);
ОтборЗапроса.Добавить(ТекстУсловия);
Запрос.УстановитьПараметр(СтрокаОтбора.ЛевоеЗначение, СтрокаОтбора.ПравоеЗначение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
ТаблицаДанных = РезультатЗапроса.Выгрузить();
КандидатыПоСотрудникам = ПодборПерсонала.КандидатыПоСотрудникам(ТаблицаДанных.ВыгрузитьКолонку("Сотрудник"));
Для Каждого СтрокаРезультатаЗапроса Из ТаблицаДанных Цикл
ПараметрыСобытия = Новый Структура();
Для Каждого КолонкаРезультата Из РезультатЗапроса.Колонки Цикл
ПараметрыСобытия.Вставить(КолонкаРезультата.Имя);
КонецЦикла;
ПараметрыСобытия.Вставить("ДатаЗавершенияПредставление");
ПараметрыСобытия.Вставить("Ответственный", Справочники.ФизическиеЛица.ПустаяСсылка());
ПараметрыСобытия.Вставить("Заявитель", Справочники.ФизическиеЛица.ПустаяСсылка());
ПараметрыСобытия.Вставить("Руководитель", Справочники.ФизическиеЛица.ПустаяСсылка());
КандидатСотрудника = КандидатыПоСотрудникам.Найти(СтрокаРезультатаЗапроса.Сотрудник, "Сотрудник");
Если КандидатСотрудника <> Неопределено Тогда
Кандидат = КандидатСотрудника.Кандидат;
ДанныеКандидата = Справочники.Кандидаты.ДанныеКандидата(Кандидат);
Если ЗначениеЗаполнено(ДанныеКандидата.Вакансия) Тогда
ДанныеВакансии = ДанныеКандидата.Вакансия;
ПараметрыСобытия.Вставить("Ответственный", ДанныеВакансии.Ответственный);
ПараметрыСобытия.Вставить("Заявитель", ДанныеВакансии.Заявитель);
КонецЕсли;
КонецЕсли;
ПараметрыСобытия.Вставить("Руководитель",
ФизическоеЛицоРуководитель(СтрокаРезультатаЗапроса.МестоВСтруктуреПредприятия, СтрокаРезультатаЗапроса.Позиция));
СтрокаТаблицы = ТаблицаРезультата.Добавить();
СтрокаТаблицы.Предмет = СтрокаРезультатаЗапроса.ФизическоеЛицо;
СтрокаТаблицы.ДатаСобытия = СтрокаРезультатаЗапроса.ДатаЗавершения;
ЗаполнитьЗначенияСвойств(ПараметрыСобытия, СтрокаРезультатаЗапроса);
ПараметрыСобытия.ДатаЗавершенияПредставление = Формат(СтрокаРезультатаЗапроса.ДатаЗавершения, "ДЛФ=D");
СтрокаТаблицы.ПараметрыСобытия = ПараметрыСобытия;
КонецЦикла;
КонецПроцедуры
&После("ПриПодготовкеШаблонаСообщенияПоУведомлению")
Процедура Рассылка_ПриПодготовкеШаблонаСообщенияПоУведомлению(ВидУведомления, Реквизиты, Вложения, НазначениеШаблона, ДополнительныеПараметры)
Если ВидУведомления = Справочники.ВидыУведомлений.НайтиПоРеквизиту("Имя", "ОкончаниеТД") Тогда
УведомленияСервер.ДобавитьПоле(Реквизиты, "ДанныеУведомления.ДатаЗавершенияПредставление",
НСтр("ru = 'Дата завершения испытательного срока'"), Новый ОписаниеТипов("Дата"), "ДЛФ=D");
УведомленияСервер.ДобавитьПоле(Реквизиты, "ДанныеУведомления.Организация",
НСтр("ru = 'Организация'"), Новый ОписаниеТипов("СправочникСсылка.Организации"));
КонецЕсли;
КонецПроцедуры
В процедуре ПриПодготовкеШаблонаСообщенияПоУведомлению можно задать параметры, которые будут использоваться в шаблоне сообщения.