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

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	ИсправлениеДокументов.ПриКопировании(ЭтотОбъект, ОбъектКопирования);
	
КонецПроцедуры

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	Перем МассивВсехРеквизитов;
	Перем МассивРеквизитовОперации;
	Перем МассивНеИспользуемыхРеквизитов;
	
	МассивНепроверяемыхРеквизитов = Новый Массив;
	
	Документы.ВыработкаСотрудников.ИменаРеквизитовПоВидуНаряда(
		ЭтотОбъект,
		МассивВсехРеквизитов,
		МассивРеквизитовОперации);
		
	Если УчетТрудозатратВРазрезеСотрудников И МассивРеквизитовОперации.Найти("ВидыРабот.Сотрудник") <> Неопределено
		И МассивРеквизитовОперации.Найти("ВидыРабот.Работник") <> Неопределено Тогда
		// Если производство без заказа с физ. лицом исправляется документом с сотрудником, то отключается проверка заполнения поля Сотрудник
		МассивРеквизитовОперации.Удалить(МассивРеквизитовОперации.Найти("ВидыРабот.Сотрудник"));
	ИначеЕсли УчетТрудозатратВРазрезеСотрудников И МассивРеквизитовОперации.Найти("ВидыРабот.Сотрудник") <> Неопределено Тогда
		МассивРеквизитовОперации.Добавить("ВидыРабот.Работник");
	КонецЕсли;
	
	ИсправлениеДокументов.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	
	МассивНеИспользуемыхРеквизитов = ОбщегоНазначенияКлиентСервер.РазностьМассивов(МассивВсехРеквизитов, МассивРеквизитовОперации);
	
	Для Каждого Реквизит Из МассивНеИспользуемыхРеквизитов Цикл
		МассивНепроверяемыхРеквизитов.Добавить(Реквизит);
	КонецЦикла;
	
	ШаблонСообщения = НСтр("ru='Дата выполнения работ в строке %1 списка ""Выполненные работы"" не соответствует месяцу документа'");
	
	Для Каждого Строка Из ВидыРабот Цикл
		Если Строка.ДатаВыполненияРабот < Месяц ИЛИ Строка.ДатаВыполненияРабот > КонецМесяца(Месяц) Тогда
			
			ТекстСообщения = СтрШаблон(ШаблонСообщения , Строка(Строка.НомерСтроки));
			
			ОбщегоНазначения.СообщитьПользователю(
				ТекстСообщения,
				ЭтотОбъект,
				ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("ВидыРабот", Строка.НомерСтроки, "ДатаВыполненияРабот"),
				"Объект",
				Отказ)
			
		КонецЕсли;
	КонецЦикла;
	
	Если ВидНаряда = Перечисления.ВидыБригадныхНарядов.Бригадный Или Автораспределение Тогда
		Если ВидыРабот.Итог("Сумма") <> Работники.Итог("Сумма") Тогда
			
			ТекстСообщения = НСтр("ru='Сумма работ не распределена по участникам бригады. Требуется распределить сумму на закладке ""Работники""'");
			
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
				ТекстСообщения,
				ЭтотОбъект,
				"Работники",
				,
				Отказ);
			
		КонецЕсли;
	КонецЕсли;
	
	//++ Локализация
	Если УчетТрудозатратВРазрезеСотрудников Тогда
		
		ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоВременнойТаблице();
		ПараметрыПолученияСотрудников.Организация = Организация;
		ПараметрыПолученияСотрудников.ПодработкиРаботниковПоТрудовымДоговорам = Истина;
		ПараметрыПолученияСотрудников.ОтбиратьПоГоловнойОрганизации = Истина;
		ПараметрыПолученияСотрудников.НачалоПериода = Дата;
		ПараметрыПолученияСотрудников.ОкончаниеПериода = Дата;
		
		ПараметрыСообщения = Новый Структура("ИмяОбъекта, ИмяПоляСотрудник");
		ПараметрыСообщения.ИмяПоляСотрудник = "Сотрудник";
		
		ПроверяемыеСотрудники = Новый Массив;
		Если МассивРеквизитовОперации.Найти("Работники.Сотрудник") <> Неопределено Тогда
			ПроверяемыеСотрудники.Добавить(Работники.ВыгрузитьКолонку("Сотрудник"));
			ПараметрыСообщения.ИмяОбъекта = "Объект.Работники";
		ИначеЕсли МассивРеквизитовОперации.Найти("ВидыРабот.Сотрудник") <> Неопределено Тогда
			ПроверяемыеСотрудники.Добавить(ВидыРабот.ВыгрузитьКолонку("Сотрудник"));
			ПараметрыСообщения.ИмяОбъекта = "Объект.ВидыРабот";
		КонецЕсли;
		
		КадровыйУчет.ПроверитьРаботающихСотрудников(ПроверяемыеСотрудники, ПараметрыПолученияСотрудников, Отказ, ПараметрыСообщения);
		
	КонецЕсли;
	//-- Локализация
	
	Если Не ЗначениеЗаполнено(Валюта) Тогда
		ТекстСообщения = НСтр("ru = 'Не задана валюта расценок на виды работ. Валюта задается в разделе ""НСИ и администрирование \ Производство"".'");
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , , Отказ);
	КонецЕсли;
	МассивНепроверяемыхРеквизитов.Добавить("Валюта");
	
	ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
	
КонецПроцедуры

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ОбновитьСвязанныеДанные();
	
КонецПроцедуры

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ОбновитьСвязанныеДанные();
	
КонецПроцедуры

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

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

Процедура ЗаполнитьРеквизитыПоУмолчанию()
	
	Организация = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию();
	Ответственный = Пользователи.ТекущийПользователь();
	Валюта = Константы.ВалютаРасценокВидовРабот.Получить();
	
	Если ПолучитьФункциональнуюОпцию("КомплекснаяАвтоматизация") Тогда
		ВидНаряда = Перечисления.ВидыБригадныхНарядов.БригадныйБезЗаказа21;
	КонецЕсли;
	
КонецПроцедуры

#Область Прочее

Процедура ОбновитьСвязанныеДанные()
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

#КонецЕсли

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