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

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

#Область ОбработчикиСобытий

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Для Каждого СтрокаСотрудника Из Сотрудники Цикл
		Отбор = Новый Структура("ИдентификаторСтрокиСотрудника", СтрокаСотрудника.ИдентификаторСтрокиСотрудника);
		СтрокиОтпусков = Отпуска.НайтиСтроки(Отбор);
		Если СтрокиОтпусков.Количество() = 0 Тогда 
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='По сотруднику %1 не введены данные'"), СтрокаСотрудника.Сотрудник);
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , 
				"Сотрудники[" + (СтрокаСотрудника.НомерСтроки - 1) + "].Сотрудник", "Объект", Отказ);
		КонецЕсли; 
	КонецЦикла;
	
	Документы.ОтпускаСотрудников.ПроверитьРаботающих(ЭтотОбъект, Отказ);
	
КонецПроцедуры

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	Если ЗарплатаКадры.ОтключитьБизнесЛогикуПриЗаписи(ЭтотОбъект) Тогда
		Возврат;
	КонецЕсли;
	
	ПериодПринадлежности = Дата;
	Документы.ОтпускаСотрудников.ЗаполнитьДатуЗапретаРедактирования(ЭтотОбъект);
	
	УстановитьСвойствоДокументРассчитан();
	
	СформироватьДанныеДокументов();
	
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
	
	Если ЗарплатаКадры.ОтключитьБизнесЛогикуПриЗаписи(ЭтотОбъект) Тогда
		Возврат;
	КонецЕсли;
	
	ЗаписатьИзмененныеДокументы();
	
КонецПроцедуры

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

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

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

Функция СформироватьДанныеДокументов()
	
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Запрос.Текст = ТекстЗапросаДанныхДокументов();
	Запрос.Выполнить();
	
	ЗарплатаКадры.УничтожитьВТ(Запрос.МенеджерВременныхТаблиц, "ВТДокументы");
	
	ДополнительныеСвойства.Вставить("МенеджерВременныхТаблиц", Запрос.МенеджерВременныхТаблиц);
	
КонецФункции

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

		СтрокаСотрудника = Сотрудники.Найти(Выборка.ИдентификаторСтрокиСотрудника, "ИдентификаторСтрокиСотрудника");
		Если СтрокаСотрудника = Неопределено Тогда 
			Продолжить;
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(ПараметрыЗаполнения, СтрокаСотрудника); 
		
		ПараметрыЗаполнения.Организация = Организация;
		ПараметрыЗаполнения.Руководитель = Руководитель;
		ПараметрыЗаполнения.ДолжностьРуководителя = ДолжностьРуководителя;
		ПараметрыЗаполнения.ДокументЗаполнения = Ссылка;
		ПараметрыЗаполнения.ДатаДокументаЗаполнения = Дата;
		
		Отбор = Новый Структура("ИдентификаторСтрокиСотрудника", Выборка.ИдентификаторСтрокиСотрудника);
		ОтпускаСотрудника = Отпуска.Выгрузить(Отбор);
		ОтпускаСотрудника.Сортировать("ДатаНачала");
		
		Для Каждого ОтпускСотрудника Из ОтпускаСотрудника Цикл 
			ДанныеОтпуска = Документы.ОтпускаСотрудников.ДанныеВидаОтпуска();
		    ЗаполнитьЗначенияСвойств(ДанныеОтпуска, ОтпускСотрудника);
			ПараметрыЗаполнения.ДанныеОтпусков.Добавить(ДанныеОтпуска);
		КонецЦикла;
		
		ДокументОтпуск = СтрокаСотрудника.Отпуск.ПолучитьОбъект();
		ДокументОтпуск.Заполнить(ПараметрыЗаполнения);
		
		Если ПолучитьФункциональнуюОпцию("ИспользоватьМногофункциональностьДокументовЗарплатаКадры") Тогда
			Описание = МногофункциональныеДокументыБЗК.ОписаниеМногофункциональногоДокументаПредыдущийФормат(СтрокаСотрудника.Отпуск);
			ДокументОтпуск[Описание.РеквизитСостояние] = Ложь;
		КонецЕсли;
		
		Попытка
			РежимЗаписи = ?(ДокументОтпуск.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись);
			ДокументОтпуск.Записать(РежимЗаписи);
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ВызватьИсключение СтрШаблон(НСтр("ru='Не удалось записать %1'"), Строка(ДокументОтпуск.Ссылка))
				+ " " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
		КонецПопытки;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

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