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