22
IBTM
20.10.11
✎
00:31
|
(18) Тоже самое...
перед открытием:
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Код типовой, добавлена мной последняя строчка.
Процедура ПечатьСправкиПоРегламентированнымОтпускамСотрудника(Сотрудник, ДатаУвольнения = Неопределено, Регистратор = Неопределено) Экспорт
ФорматДаты = "ДФ='d MMM yyyy ""г.""'";
ДлинаСуток = 86400;
КомпонентаСклоненияФИО = глЗначениеПеременной("глКомпонентаСклоненияФИО");
Макет = ПолучитьОбщийМакет("СправкаПоОтпускамСотрудника");
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СправкаПоРегламентированнымОтпускамСотрудника";
Запрос = Новый Запрос;
// Если передан регистратор, необходимо исключить как движения регистратора,
// так и движения всех документов исправлений этого регистратора.
Если Регистратор <> Неопределено Тогда
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(Регистратор);
МетаданныеРегистратора = Регистратор.Метаданные();
Если МетаданныеРегистратора.Реквизиты.Найти("ПерерассчитываемыйДокумент") <> Неопределено Тогда
Запрос.Текст =
"ВЫБРАТЬ
| Док.ПерерассчитываемыйДокумент
|ИЗ
| Документ." + МетаданныеРегистратора.Имя + " КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка";
Ссылка = Регистратор;
Пока Ссылка <> Неопределено Цикл
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ссылка = Выборка.ПерерассчитываемыйДокумент;
МассивДокументов.Добавить(Ссылка);
Иначе
Ссылка = Неопределено;
КонецЕсли;
КонецЦикла;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка
|ИЗ
| Документ." + МетаданныеРегистратора.Имя + " КАК Док
|ГДЕ
| Док.ПерерассчитываемыйДокумент = &Ссылка";
Ссылка = Регистратор;
Пока Ссылка <> Неопределено Цикл
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ссылка = Выборка.Ссылка;
МассивДокументов.Добавить(Ссылка);
Иначе
Ссылка = Неопределено;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Запрос.УстановитьПараметр("МассивДокументов", МассивДокументов);
КонецЕсли;
Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
Запрос.Текст =
"ВЫБРАТЬ
| СотрудникиОрганизаций.Ссылка КАК Сотрудник,
| СотрудникиОрганизаций.ДатаПриемаНаРаботу КАК ДатаПриема,
| СотрудникиОрганизаций.ТекущееПодразделениеОрганизации КАК Подразделение,
| СотрудникиОрганизаций.ТекущаяДолжностьОрганизации КАК Должность,
| СотрудникиОрганизаций.Физлицо.Пол КАК Пол,
| СотрудникиОрганизаций.ТекущееОбособленноеПодразделение КАК ОбособленноеПодразделение,
| ВЫБОР
| КОГДА СотрудникиОрганизаций.ДатаУвольнения > СотрудникиОрганизаций.ДатаПриемаНаРаботу
| ТОГДА СотрудникиОрганизаций.ДатаУвольнения
| ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
| КОНЕЦ КАК ДатаУвольнения
|ИЗ
| Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ГДЕ
| СотрудникиОрганизаций.Ссылка = &Сотрудник";
Выборка = Запрос.Выполнить().Выбрать();
ДатаПриема = Дата(1,1,1);
Если Выборка.Следующий() Тогда
ДатаПриема = Выборка.ДатаПриема;
ОбластьМакета = Макет.ПолучитьОбласть("ОбщиеДанные");
ОбластьМакета.Параметры.Заполнить(Выборка);
ТабДокумент.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.Период = Формат(ДатаПриема, ФорматДаты);
Если Выборка.Пол = Перечисления.ПолФизическихЛиц.Женский Тогда
ОбластьМакета.Параметры.Комментарий = "Принята на работу";
Иначе
ОбластьМакета.Параметры.Комментарий = "Принят на работу";
КонецЕсли;
ТабДокумент.Вывести(ОбластьМакета);
КонецЕсли;
Если ДатаУвольнения = Неопределено Тогда
СотрудникУволен = ЗначениеЗаполнено(Выборка.ДатаУвольнения);
ДатаАктуальности = ?(СотрудникУволен, Выборка.ДатаУвольнения, ОбщегоНазначения.ПолучитьРабочуюДату());
Иначе
СотрудникУволен = Ложь;
ДатаАктуальности = ДатаУвольнения;
КонецЕсли;
// Таблица введенных остатков отпусков
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиСрез.ДатаОкончанияРабочегоГода КАК Период,
| ОстаткиОтпусковОстатки.ВидЕжегодногоОтпуска.Наименование КАК ВидЕжегодногоОтпуска,
| СУММА(ОстаткиОтпусковОстатки.Количество) КАК Количество
|ИЗ
| Справочник.ОстаткиОтпусковОрганизаций.Остатки КАК ОстаткиОтпусковОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ВложенныйЗапрос.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
| МАКСИМУМ(ВложенныйЗапрос.ДатаОкончанияРабочегоГода) КАК ДатаОкончанияРабочегоГода,
| ВложенныйЗапрос.ДатаАктуальности КАК ДатаАктуальности
| ИЗ
| (ВЫБРАТЬ
| ОстаткиОтпусковОрганизацийОстатки.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
| ОстаткиОтпусковОрганизацийОстатки.ДатаОкончанияРабочегоГода КАК ДатаОкончанияРабочегоГода,
| МАКСИМУМ(ОстаткиОтпусковОрганизацийОстатки.Ссылка.ДатаАктуальности) КАК ДатаАктуальности
| ИЗ
| Справочник.ОстаткиОтпусковОрганизаций.Остатки КАК ОстаткиОтпусковОрганизацийОстатки
| ГДЕ
| ОстаткиОтпусковОрганизацийОстатки.Ссылка.Сотрудник = &Сотрудник
|
| СГРУППИРОВАТЬ ПО
| ОстаткиОтпусковОрганизацийОстатки.ВидЕжегодногоОтпуска,
| ОстаткиОтпусковОрганизацийОстатки.ДатаОкончанияРабочегоГода) КАК ВложенныйЗапрос
|
| СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.ВидЕжегодногоОтпуска,
| ВложенныйЗапрос.ДатаАктуальности) КАК ОстаткиСрез
| ПО ОстаткиОтпусковОстатки.ВидЕжегодногоОтпуска = ОстаткиСрез.ВидЕжегодногоОтпуска
| И ОстаткиОтпусковОстатки.Ссылка.ДатаАктуальности = ОстаткиСрез.ДатаАктуальности
| И (ОстаткиОтпусковОстатки.Ссылка.Сотрудник = &Сотрудник)
|
|СГРУППИРОВАТЬ ПО
| ОстаткиСрез.ДатаОкончанияРабочегоГода,
| ОстаткиОтпусковОстатки.ВидЕжегодногоОтпуска.Наименование
|
|УПОРЯДОЧИТЬ ПО
| Период,
| ВидЕжегодногоОтпуска
|ИТОГИ
| СУММА(Количество)
|ПО
| Период";
ТаблицаОстатков = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
// Таблица компенсаций отпусков
Запрос.Текст =
"ВЫБРАТЬ
| ФактическиеОтпускаОрганизаций.Период КАК ДатаКомпенсации,
| ФактическиеОтпускаОрганизаций.Количество КАК ДнейКомпенсации
|ИЗ
| РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпускаОрганизаций
|ГДЕ
| ФактическиеОтпускаОрганизаций.Сотрудник = &Сотрудник
| " + ?(Регистратор = Неопределено, "", "И (НЕ ФактическиеОтпускаОрганизаций.Регистратор В (&МассивДокументов))") + "
| И ФактическиеОтпускаОрганизаций.Компенсация
|
|УПОРЯДОЧИТЬ ПО
| ДатаКомпенсации";
ТаблицаКомпенсаций = Запрос.Выполнить().Выгрузить();
// Таблица отсутствий, которые увеличивают рабочий год
Запрос.УстановитьПараметр("ТекущаяДата", ДатаАктуальности);
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеРаботниковОрганизаций.Период КАК Период,
| СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
| СостояниеРаботниковОрганизаций.ПериодЗавершения КАК ПериодЗавершения,
| СостояниеРаботниковОрганизаций.СостояниеЗавершения
|ПОМЕСТИТЬ ВТСостояние
|ИЗ
| РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
|ГДЕ
| СостояниеРаботниковОрганизаций.Сотрудник = &Сотрудник
| И СостояниеРаботниковОрганизаций.Состояние В (ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускПоУходуЗаРебенком), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Прогулы))
|
|ИНДЕКСИРОВАТЬ ПО
| Период,
| ПериодЗавершения
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СостояниеРаботниковОрганизаций.Период КАК ПериодНачала,
| МИНИМУМ(СостояниеРаботниковОрганизацийЗавершения.Период) КАК ДатаСреза
|ПОМЕСТИТЬ ВТСрезСостояний
|ИЗ
| РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизацийЗавершения
| ПО (СостояниеРаботниковОрганизаций.Сотрудник = &Сотрудник)
| И (СостояниеРаботниковОрганизацийЗавершения.Сотрудник = &Сотрудник)
| И СостояниеРаботниковОрганизаций.Период < СостояниеРаботниковОрганизацийЗавершения.Период
| И (СостояниеРаботниковОрганизаций.Состояние В (ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускПоУходуЗаРебенком), ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Прогулы)))
|
|СГРУППИРОВАТЬ ПО
| СостояниеРаботниковОрганизаций.Период
|
|ИНДЕКСИРОВАТЬ ПО
| ПериодНачала,
| ДатаСреза
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТСрезСостояний.ПериодНачала КАК ПериодНачала,
| СостояниеРаботниковОрганизацийЗавершения.Период КАК Период,
| СостояниеРаботниковОрганизацийЗавершения.Состояние
|ПОМЕСТИТЬ ВТСостояниеЗавершения
|ИЗ
| ВТСрезСостояний КАК ВТСрезСостояний
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизацийЗавершения
| ПО (СостояниеРаботниковОрганизацийЗавершения.Сотрудник = &Сотрудник)
| И ВТСрезСостояний.ДатаСреза = СостояниеРаботниковОрганизацийЗавершения.Период
|
|ИНДЕКСИРОВАТЬ ПО
| ПериодНачала,
| Период
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РАЗНОСТЬДАТ(СостояниеРаботников.ДатаНачалаОтпуска, СостояниеРаботников.ДатаОкончанияОтпуска, ДЕНЬ) КАК КоличествоДнейОтпуска,
| СостояниеРаботников.ДатаНачалаОтпуска КАК ДатаНачалаОтпуска,
| ДОБАВИТЬКДАТЕ(СостояниеРаботников.ДатаОкончанияОтпуска, ДЕНЬ, -1) КАК ДатаОкончанияОтпуска,
| СостояниеРаботников.Состояние,
| РАЗНОСТЬДАТ(СостояниеРаботников.ДатаНачалаОтпуска, СостояниеРаботников.ДатаОкончанияОтпуска, ДЕНЬ) КАК КоличествоДнейПродления,
| СостояниеРаботников.ДатаНачалаОтпуска КАК ДатаНачалаПродления
|ИЗ
| (ВЫБРАТЬ
| СостояниеРаботниковОрганизаций.Период КАК ДатаНачалаОтпуска,
| ВЫБОР
| КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
| И (СостояниеРаботниковОрганизацийЗавершения.Период ЕСТЬ NULL
| ИЛИ СостояниеРаботниковОрганизацийЗавершения.Период > СостояниеРаботниковОрганизаций.ПериодЗавершения)
| ТОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения
| КОГДА ЕСТЬNULL(СостояниеРаботниковОрганизацийЗавершения.Период, ДАТАВРЕМЯ(1, 1, 1)) <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА СостояниеРаботниковОрганизацийЗавершения.Период
| ИНАЧЕ ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, 1)
| КОНЕЦ КАК ДатаОкончанияОтпуска,
| СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
| ВЫБОР
| КОГДА СостояниеРаботниковОрганизаций.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
| И (СостояниеРаботниковОрганизацийЗавершения.Период ЕСТЬ NULL
| ИЛИ СостояниеРаботниковОрганизацийЗавершения.Период > СостояниеРаботниковОрганизаций.ПериодЗавершения)
| ТОГДА СостояниеРаботниковОрганизаций.СостояниеЗавершения
| КОГДА ЕСТЬNULL(СостояниеРаботниковОрганизацийЗавершения.Период, ДАТАВРЕМЯ(1, 1, 1)) <> ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА СостояниеРаботниковОрганизацийЗавершения.Состояние
| ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Работает)
| КОНЕЦ КАК СостояниеЗавершения
| ИЗ
| ВТСостояние КАК СостояниеРаботниковОрганизаций
| ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояниеЗавершения КАК СостояниеРаботниковОрганизацийЗавершения
| ПО СостояниеРаботниковОрганизаций.Период < СостояниеРаботниковОрганизацийЗавершения.Период
| И СостояниеРаботниковОрганизаций.Период = СостояниеРаботниковОрганизацийЗавершения.ПериодНачала) КАК СостояниеРаботников
|
|УПОРЯДОЧИТЬ ПО
| ДатаНачалаОтпуска";
ТаблицаИсключаемыхОтпусков = Запрос.Выполнить().Выгрузить();
// Таблица фактических отпусков
Запрос.Текст =
"ВЫБРАТЬ
| 0 КАК НомерСтроки,
| ФактическиеОтпускаОрганизаций.Сотрудник КАК Сотрудник,
| ФактическиеОтпускаОрганизаций.Период КАК ДатаНачала,
| ФактическиеОтпускаОрганизаций.ДатаОкончания КАК ДатаОкончания,
| ФактическиеОтпускаОрганизаций.ВидЕжегодногоОтпуска,
| ФактическиеОтпускаОрганизаций.Количество,
| ФактическиеОтпускаОрганизаций.ДатаРегистрации КАК ДатаРегистрации,
| ФактическиеОтпускаОрганизаций.Регистратор КАК Регистратор,
| ФактическиеОтпускаОрганизаций.НомерСтроки КАК НомерСтрокиРегистра
|ИЗ
| РегистрНакопления.ФактическиеОтпускаОрганизаций КАК ФактическиеОтпускаОрганизаций
|ГДЕ
| ФактическиеОтпускаОрганизаций.Сотрудник = &Сотрудник
| " + ?(Регистратор = Неопределено, "", "И (НЕ ФактическиеОтпускаОрганизаций.Регистратор В (&МассивДокументов))") + "
| И (НЕ ФактическиеОтпускаОрганизаций.Компенсация)
|
|УПОРЯДОЧИТЬ ПО
| ДатаРегистрации,
| Регистратор,
| НомерСтрокиРегистра";
Выборка = Запрос.Выполнить().Выбрать();
ТаблицаПериодов = Новый ТаблицаЗначений;
ТаблицаПериодов.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
ТаблицаПериодов.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций"));
ТаблицаПериодов.Колонки.Добавить("ВидЕжегодногоОтпуска", Новый ОписаниеТипов("СправочникСсылка.ВидыЕжегодныхОтпусков"));
ТаблицаПериодов.Колонки.Добавить("ДатаНачала", Новый ОписаниеТипов("Дата"));
ТаблицаПериодов.Колонки.Добавить("ДатаОкончания", Новый ОписаниеТипов("Дата"));
ТаблицаПериодов.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаПериодов.Колонки.Добавить("ДатаРегистрации", Новый ОписаниеТипов("Дата"));
Если ДатаУвольнения <> Неопределено Тогда
ТаблицаПериодов.Колонки.Добавить("ДатаРасчетаПриУвольнении", Новый ОписаниеТипов("Дата"));
КонецЕсли;
ТаблицаСторноОтпусков = Новый ТаблицаЗначений;
ТаблицаСторноОтпусков.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
ТаблицаСторноОтпусков.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций"));
ТаблицаСторноОтпусков.Колонки.Добавить("ВидЕжегодногоОтпуска", Новый ОписаниеТипов("СправочникСсылка.ВидыЕжегодныхОтпусков"));
ТаблицаСторноОтпусков.Колонки.Добавить("ДатаНачала", Новый ОписаниеТипов("Дата"));
ТаблицаСторноОтпусков.Колонки.Добавить("ДатаОкончания", Новый ОписаниеТипов("Дата"));
ТаблицаСторноОтпусков.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаСторноОтпусков.Колонки.Добавить("ДатаРегистрации", Новый ОписаниеТипов("Дата"));
НомерСтроки = 1;
Пока Выборка.Следующий() Цикл
Если Выборка.Количество > 0 Тогда
Строка = ТаблицаПериодов.Добавить();
Если ДатаУвольнения <> Неопределено Тогда
Строка.ДатаРасчетаПриУвольнении = ДатаУвольнения;
КонецЕсли;
Иначе
Строка = ТаблицаСторноОтпусков.Добавить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(Строка, Выборка);
Строка.НомерСтроки = НомерСтроки;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// Выборка по видам отпусков
Запрос.Текст =
"ВЫБРАТЬ
| ВидыЕжегодныхОтпусков.Ссылка,
| ВидыЕжегодныхОтпусков.Код КАК Код
|ИЗ
| Справочник.ВидыЕжегодныхОтпусков КАК ВидыЕжегодныхОтпусков
|ГДЕ
| (НЕ ВидыЕжегодныхОтпусков.ПометкаУдаления)
|
|УПОРЯДОЧИТЬ ПО
| Код";
ВыборкаПоВидамОтпусков = Запрос.Выполнить().Выбрать();
// Получим остатки отпуска на следующий день после текущего или после даты увольнения,
// Чтобы отпуска текущего дня тоже попали в отчет
Пока ВыборкаПоВидамОтпусков.Следующий() Цикл
Строка = ТаблицаПериодов.Добавить();
Строка.НомерСтроки = 0;
Строка.ВидЕжегодногоОтпуска = ВыборкаПоВидамОтпусков.Ссылка;
Строка.Сотрудник = Сотрудник;
Строка.ДатаНачала = ДатаАктуальности + ДлинаСуток;
Строка.ДатаОкончания = ДатаАктуальности + ДлинаСуток;
Если ДатаУвольнения <> Неопределено Тогда
Строка.ДатаРасчетаПриУвольнении = ДатаУвольнения;
КонецЕсли;
КонецЦикла;
// Получим остатки на конец каждого рабочего года, если сотрудник принят на работу
Если ЗначениеЗаполнено(ДатаПриема) Тогда
ТаблицаРабочихЛет = Новый ТаблицаЗначений;
ТаблицаРабочихЛет.Колонки.Добавить("ДатаНачала");
ТаблицаРабочихЛет.Колонки.Добавить("ДатаОкончания");
ДатаНачалаРабочегоГода = ДатаПриема;
ДатаОкончанияРабочегоГода = ДобавитьМесяц(ДатаПриема, 12) - 1;
Пока ДатаОкончанияРабочегоГода < ДобавитьМесяц(ДатаАктуальности, 12) Цикл
Строка = ТаблицаРабочихЛет.Добавить();
Строка.ДатаНачала = ДатаНачалаРабочегоГода;
Строка.ДатаОкончания = ДатаОкончанияРабочегоГода;
Если Строка.ДатаОкончания < Дата(2006, 10, 6) Тогда
КоличествоДнейВключаемых = 7;
Иначе
КоличествоДнейВключаемых = 14;
КонецЕсли;
Для Каждого ОтпускДляИсключения Из ТаблицаИсключаемыхОтпусков Цикл
Если Строка.ДатаНачала <= ОтпускДляИсключения.ДатаНачалаПродления
И ОтпускДляИсключения.ДатаНачалаПродления <= Строка.ДатаОкончания Тогда
Если ОтпускДляИсключения.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускБезСохраненияЗарплаты Тогда
КоличествоДнейОтпуска = ОтпускДляИсключения.КоличествоДнейОтпуска;
ОтпускДляИсключения.ДатаНачалаПродления = ОтпускДляИсключения.ДатаНачалаПродления + Мин(ОтпускДляИсключения.КоличествоДнейПродления, КоличествоДнейВключаемых) * ДлинаСуток;
ОтпускДляИсключения.КоличествоДнейПродления = Макс(ОтпускДляИсключения.КоличествоДнейПродления - КоличествоДнейВключаемых, 0);
Если ОтпускДляИсключения.КоличествоДнейПродления > 0 Тогда
Строка.ДатаОкончания = Строка.ДатаОкончания + ОтпускДляИсключения.КоличествоДнейПродления * ДлинаСуток;
КонецЕсли;
КоличествоДнейВключаемых = Макс(КоличествоДнейВключаемых - КоличествоДнейОтпуска, 0);
Иначе
Строка.ДатаОкончания = Строка.ДатаОкончания + ОтпускДляИсключения.КоличествоДнейПродления * ДлинаСуток;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ДатаНачалаРабочегоГода = Строка.ДатаОкончания + 1;
ДатаОкончанияРабочегоГода = ДобавитьМесяц(ДатаНачалаРабочегоГода, 12) - 1;
КонецЦикла;
НомерСтроки = -1;
Для Каждого РабочийГод Из ТаблицаРабочихЛет Цикл
Если РабочийГод.ДатаОкончания > ДатаАктуальности Тогда
Прервать;
КонецЕсли;
ВыборкаПоВидамОтпусков.Сбросить();
Пока ВыборкаПоВидамОтпусков.Следующий() Цикл
Строка = ТаблицаПериодов.Добавить();
Строка.НомерСтроки = НомерСтроки;
Строка.ВидЕжегодногоОтпуска = ВыборкаПоВидамОтпусков.Ссылка;
Строка.Сотрудник = Сотрудник;
Строка.ДатаНачала = РабочийГод.ДатаОкончания;
Строка.ДатаОкончания = РабочийГод.ДатаОкончания;
КонецЦикла;
НомерСтроки = НомерСтроки - 1;
КонецЦикла;
КонецЕсли;
Выборка = ПроцедурыУправленияПерсоналом.ПодготовитьДанныеПоРегламентированнымОтпускам(ТаблицаПериодов, Регистратор);
// таблица с макетами
ТаблицаМакетовЗаПериод = Новый ТаблицаЗначений;
ТаблицаМакетовЗаПериод.Колонки.Добавить("Период");
ТаблицаМакетовЗаПериод.Колонки.Добавить("НомерСтроки");
ТаблицаМакетовЗаПериод.Колонки.Добавить("ПорядокГруппы");
ТаблицаМакетовЗаПериод.Колонки.Добавить("МассивМакетов");
ОкруглятьДниОтпускаПриКомпенсации = Константы.ОкруглятьДниОтпускаПриКомпенсации.Получить();
Пока Выборка.Следующий() Цикл
Если Выборка.НомерСтроки = 0 Тогда // Остаток отпуска на рабочую дату/дату увольнения
МассивМакетов = Новый Массив;
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
Если ДатаУвольнения = Неопределено Тогда
Если СотрудникУволен Тогда
ОбластьМакета.Параметры.Период = "На дату увольнения, " + Формат(ДатаАктуальности, ФорматДаты);
Иначе
ОбластьМакета.Параметры.Период = "На сегодня, " + Формат(ДатаАктуальности, ФорматДаты);
КонецЕсли;
Иначе
ОбластьМакета.Параметры.Период = "На " + Формат(ДатаАктуальности, ФорматДаты);
КонецЕсли;
МассивМакетов.Добавить(ОбластьМакета);
Если СотрудникУволен И Не ОкруглятьДниОтпускаПриКомпенсации Тогда
ОстатокОтпуска = Выборка.Количество;
Иначе
Если Выборка.Количество < 0 Тогда
ОстатокОтпуска = Цел(Выборка.Количество);
Иначе
ОстатокОтпуска = Цел(Выборка.Количество) + ?(Цел(Выборка.Количество) = Выборка.Количество, 0, 1);
КонецЕсли;
КонецЕсли;
Если ОстатокОтпуска >= 0 Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
ОбластьМакета.Параметры.Текст = "Неиспользованный отпуск";
ОбластьМакета.Параметры.КоличествоДней = "" + ОстатокОтпуска + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
Иначе
ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
ОбластьМакета.Параметры.Текст = "Использовано за счет отпусков будущего периода";
ОбластьМакета.Параметры.КоличествоДней = "" + (-ОстатокОтпуска) + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
КонецЕсли;
МассивМакетов.Добавить(ОбластьМакета);
ВыборкаПоВидуОтпуска = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоВидуОтпуска.Следующий() Цикл
Если ОстатокОтпуска >= 0 Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
ОбластьМакета.Параметры.Текст = " " + ВыборкаПоВидуОтпуска.ВидЕжегодногоОтпуска;
ОбластьМакета.Параметры.КоличествоДней = "" + ВыборкаПоВидуОтпуска.Количество + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ВыборкаПоВидуОтпуска.Количество);
МассивМакетов.Добавить(ОбластьМакета);
КонецЕсли;
Если ОстатокОтпуска < 0 И ВыборкаПоВидуОтпуска.Количество < 0 Тогда
ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
ОбластьМакета.Параметры.Текст = " " + ВыборкаПоВидуОтпуска.ВидЕжегодногоОтпуска;
ОбластьМакета.Параметры.КоличествоДней = "" + (-ВыборкаПоВидуОтпуска.Количество) + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ВыборкаПоВидуОтпуска.Количество);
МассивМакетов.Добавить(ОбластьМакета);
КонецЕсли;
КонецЦикла;
Строка = ТаблицаМакетовЗаПериод.Добавить();
Строка.НомерСтроки = Выборка.НомерСтроки;
Строка.Период = КонецДня(ДатаАктуальности);
Строка.ПорядокГруппы = 100;
Строка.МассивМакетов = МассивМакетов;
ИначеЕсли Выборка.НомерСтроки < 0 Тогда // Закончился рабочий год
МассивМакетов = Новый Массив;
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.Комментарий = "Закончился рабочий год";
ОбластьМакета.Параметры.Период = Формат(Выборка.МаксимальнаяДатаНачалаРабочегоГода, ФорматДаты) + " - " + Формат(Выборка.ДатаОкончанияРабочегоГода, ФорматДаты);
МассивМакетов.Добавить(ОбластьМакета);
Если Выборка.Количество < 0 Тогда
ОстатокОтпуска = Цел(Выборка.Количество);
Иначе
ОстатокОтпуска = Цел(Выборка.Количество) + ?(Цел(Выборка.Количество) = Выборка.Количество, 0, 1);
КонецЕсли;
Если ОстатокОтпуска >= 0 Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
ОбластьМакета.Параметры.Текст = "Неиспользованный отпуск";
ОбластьМакета.Параметры.КоличествоДней = "" + ОстатокОтпуска + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
Иначе
ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
ОбластьМакета.Параметры.Текст = "Использовано за счет отпусков будущего периода";
ОбластьМакета.Параметры.КоличествоДней = "" + (-ОстатокОтпуска) + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ОстатокОтпуска);
КонецЕсли;
МассивМакетов.Добавить(ОбластьМакета);
ВыборкаПоВидуОтпуска = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоВидуОтпуска.Следующий() Цикл
Если ОстатокОтпуска >= 0 Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
ОбластьМакета.Параметры.Текст = " " + ВыборкаПоВидуОтпуска.ВидЕжегодногоОтпуска;
ОбластьМакета.Параметры.КоличествоДней = "" + ВыборкаПоВидуОтпуска.Количество + " " + ОбщегоНазначения.ФормаМножественногоЧисла("день","дня","дней",ВыборкаПоВидуОтпуска.Количество);
МассивМакетов.Добавить(ОбластьМакета);
КонецЕсли;
Если ОстатокОтпуска < 0 И ВыборкаПоВидуОтпуска.Количество < 0 Тогда
ОбластьМакета = Макет.ПолучитьОбласть("ВажнаяСтрока");
ОбластьМакета.Параметры.Текст &n
|
|