Отпуск сотрудников / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ДляВсехСтрок( ЗначениеРазрешено(Сотрудники.ФизическоеЛицо, NULL КАК ИСТИНА)
	|	) И ЗначениеРазрешено(Организация)";
КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

#Область ОбработчикиПравилРегистрации

// См. ЗарплатаКадрыРасширенныйСинхронизацияДанных.ШаблонОбработчика
Процедура ПриЗаполненииНастроекОбработчиковПравилРегистрации(Настройки) Экспорт
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОтбораПоОрганизации(Настройки);
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОбъектаСПрисоединеннымиФайлами(Настройки);
КонецПроцедуры

#КонецОбласти

// Возвращает описание состава документа
//
// Возвращаемое значение:
//  Структура - см. ЗарплатаКадрыСоставДокументов.НовоеОписаниеСоставаОбъекта.
Функция ОписаниеСоставаОбъекта() Экспорт
	
	МетаданныеДокумента = Метаданные.Документы.ОтпускаСотрудников;
	Возврат ЗарплатаКадрыСоставДокументов.ОписаниеСоставаОбъектаПоМетаданнымФизическиеЛицаВТабличныхЧастях(МетаданныеДокумента);
	
КонецФункции

Функция ОбъектЗаблокирован(СсылкаНаОбъект) Экспорт
	
	Возврат Истина;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

КонецПроцедуры

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

Функция ДобавитьКомандыСозданияДокументов(КомандыСозданияДокументов, ДополнительныеПараметры) Экспорт
	
	ЗарплатаКадрыРасширенный.ДобавитьВКоллекциюКомандуСозданияДокументаПоМетаданнымДокумента(
		КомандыСозданияДокументов, Метаданные.Документы.ОтпускаСотрудников);
	
КонецФункции

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	КадровыйУчетРасширенный.ДобавитьКомандуПечатиПриказаОПредоставленииОтпускаРаботникам(КомандыПечати, Ложь);
	КадровыйУчетРасширенный.ДобавитьКомандуПечатиПриказаОПредоставленииОтпуска(КомандыПечати);
	
	Если ПравоДоступа("Просмотр", Метаданные.Отчеты.ПечатнаяФормаТ6а) Тогда
		
		КомандаПечати = КомандыПечати.Добавить();
		КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
		КомандаПечати.МенеджерПечати = "Отчет.ПечатнаяФормаТ6а";
		КомандаПечати.Идентификатор = "ПФ_MXL_Т6а";
		КомандаПечати.Представление = НСтр("ru = 'Приказ о предоставлении отпуска работникам (Т-6а) по видам отпусков'");
		КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь;
		КомандаПечати.ДополнительныеПараметры.Вставить("ПутьКПодписантам", "Сотрудники.ФизическоеЛицо");
		КомандаПечати.ДополнительныеПараметры.Вставить("ПоВидамОтпусков", Истина);
		
	КонецЕсли;
	
КонецПроцедуры

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

Процедура ЗаполнитьДатуЗапретаРедактирования(ОбъектДокумента) Экспорт
	
	ЗарплатаКадры.ЗаполнитьДатуЗапретаРедактированияСписочногоДокумента(ОбъектДокумента, "Сотрудники", "ДатаНачала");
	
КонецПроцедуры

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

Функция ПараметрыЗаполненияОтпуска() Экспорт
	
	ПараметрыЗаполнения = Новый Структура("Действие, Организация, Руководитель, ДолжностьРуководителя,
		|ДокументЗаполнения, ДатаДокументаЗаполнения, Сотрудник, ДатаНачала, ДатаОкончания,
		|ПредоставитьМатериальнуюПомощьПриОтпуске, ПредоставитьЕдиновременнуюВыплатуКОтпуску,
		|ОсвобождатьСтавку, ДанныеОтпусков");
	
	ПараметрыЗаполнения.Действие = "ЗаполнитьПоДокументуОтпускаСотрудников";
	ПараметрыЗаполнения.ДанныеОтпусков = Новый Массив;
	
	Возврат ПараметрыЗаполнения;
	
КонецФункции

Функция ДанныеВидаОтпуска() Экспорт 
	
	ДанныеОтпуска = Новый Структура("ВидОтпуска, ДатаНачала, ДатаОкончания, КоличествоДней, КоличествоДнейКомпенсации, 
		|НачалоПериодаЗаКоторыйПредоставляетсяОтпуск, КонецПериодаЗаКоторыйПредоставляетсяОтпуск, Основание");
	
	Возврат ДанныеОтпуска;
	
КонецФункции

Процедура УстановитьСвойствоДокументРассчитан(ДокументСсылка) Экспорт 
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьМногофункциональностьДокументовЗарплатаКадры") Тогда 
		Возврат;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ОтпускаСотрудниковСотрудники.Отпуск КАК Отпуск
		|ИЗ
		|	Документ.ОтпускаСотрудников.Сотрудники КАК ОтпускаСотрудниковСотрудники
		|ГДЕ
		|	ОтпускаСотрудниковСотрудники.Ссылка = &Ссылка";
	
	УстановитьПривилегированныйРежим(Истина);
	
	Сотрудники = Запрос.Выполнить().Выгрузить();
	ДокументРассчитан = ОтпускаСотрудниковРассчитаны(Сотрудники);
	
	Если ДокументРассчитан <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументСсылка, "ДокументРассчитан") Тогда 
		ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
		ДокументОбъект.ДокументРассчитан = ДокументРассчитан;
		ДокументОбъект.Записать();
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Ложь);
	
КонецПроцедуры

Функция ОтпускаСотрудниковРассчитаны(Сотрудники) Экспорт
	
	СписокДокументов = Новый Массив;
	Для Каждого СтрокаСотрудника Из Сотрудники Цикл 
		Если Не ЗначениеЗаполнено(СтрокаСотрудника.Отпуск) Тогда 
			Возврат Ложь;
		КонецЕсли;
		СписокДокументов.Добавить(СтрокаСотрудника.Отпуск);
	КонецЦикла;
	
	Запрос = Новый Запрос;
	
	Запрос.УстановитьПараметр("СписокДокументов", СписокДокументов);
	
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Отпуск.Ссылка КАК Ссылка
		|ИЗ
		|	Документ.Отпуск КАК Отпуск
		|ГДЕ
		|	Отпуск.Ссылка В(&СписокДокументов)
		|	И (НЕ Отпуск.Проведен
		|			ИЛИ НЕ Отпуск.ДокументРассчитан)
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ ПЕРВЫЕ 1
		|	ОтпускБезСохраненияОплаты.Ссылка
		|ИЗ
		|	Документ.ОтпускБезСохраненияОплаты КАК ОтпускБезСохраненияОплаты
		|ГДЕ
		|	ОтпускБезСохраненияОплаты.Ссылка В(&СписокДокументов)
		|	И (НЕ ОтпускБезСохраненияОплаты.Проведен
		|			ИЛИ НЕ ОтпускБезСохраненияОплаты.ПерерасчетВыполнен)";
	
	УстановитьПривилегированныйРежим(Истина);
	РезультатЗапроса = Запрос.Выполнить();
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат РезультатЗапроса.Пустой();
	
КонецФункции

#КонецОбласти

#КонецЕсли

Связанные материалы