Данные для расчета зарплаты / Модуль объекта

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

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	НастройкиВида = Справочники.ВидыДокументовВводДанныхДляРасчетаЗарплаты.НастройкиВидаДокумента(ВидДокумента);
	
	Если НастройкиВида.ВыполненныеРаботыВводятсяСводно Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "ВыполненныеРаботы.Период");
	КонецЕсли;
	
	Если НастройкиВида.ВыполненныеРаботыРаспределяютсяПоСотрудникам Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "ВыполненныеРаботы.Сотрудник");
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "ВыполненныеРаботы.Период");
		Если ВыполненныеРаботы.Итог("Сумма") <> ЗначенияПоказателей.Итог("Значение") Тогда
			ТекстСообщения = НСтр("ru = 'Сумма оплаты отличается от стоимости выполненных работ.'");
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, , , , Отказ);
		КонецЕсли;
	КонецЕсли;
	
	Если Не (НастройкиВида.РежимВводаСтатьиФинансирования = Перечисления.РежимыВводаБухучетаВДанныхДляРасчетаЗарплаты.ВводитьВШапке) Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "СтатьяФинансирования");
	КонецЕсли;
	Если Не (НастройкиВида.РежимВводаСтатьиФинансирования = Перечисления.РежимыВводаБухучетаВДанныхДляРасчетаЗарплаты.ВводитьВТабличнойЧасти) Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "ВыполненныеРаботы.СтатьяФинансирования");
	КонецЕсли;
	
	Если Не (НастройкиВида.РежимВводаСпособаОтраженияЗарплатыВБухучете = Перечисления.РежимыВводаБухучетаВДанныхДляРасчетаЗарплаты.ВводитьВШапке) Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "СпособОтраженияЗарплатыВБухучете");
	КонецЕсли;
	Если Не (НастройкиВида.РежимВводаСпособаОтраженияЗарплатыВБухучете = Перечисления.РежимыВводаБухучетаВДанныхДляРасчетаЗарплаты.ВводитьВТабличнойЧасти) Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "ВыполненныеРаботы.СпособОтраженияЗарплатыВБухучете");
	КонецЕсли;
	
	Если Не (НастройкиВида.РежимВводаОтношенияКЕНВД = Перечисления.РежимыВводаБухучетаВДанныхДляРасчетаЗарплаты.ВводитьВШапке) Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "ОтношениеКЕНВД");
	КонецЕсли;
	Если Не (НастройкиВида.РежимВводаОтношенияКЕНВД = Перечисления.РежимыВводаБухучетаВДанныхДляРасчетаЗарплаты.ВводитьВТабличнойЧасти) Тогда
		ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "ВыполненныеРаботы.ОтношениеКЕНВД");
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

Функция ДанныеОВремени()
	ТаблицаДанных = УчетРабочегоВремениРасширенный.ПустаяТаблицаДляРегистрацииВремени();
	
	Для Каждого СтрокаТабличнойЧасти Из ДанныеОВремениСводно Цикл
		Если СтрокаТабличнойЧасти.Дней = 0 И СтрокаТабличнойЧасти.Часов = 0 Тогда
			Продолжить;
		КонецЕсли;
		СтрокаТаблицы = ТаблицаДанных.Добавить();
		СтрокаТаблицы.Дата = Период;
		СтрокаТаблицы.Сотрудник = СтрокаТабличнойЧасти.Сотрудник;
		СтрокаТаблицы.ВидВремени = СтрокаТабличнойЧасти.ВидВремени;
		СтрокаТаблицы.Дней = СтрокаТабличнойЧасти.Дней;
		СтрокаТаблицы.Часов = СтрокаТабличнойЧасти.Часов;
		СтрокаТаблицы.План = Ложь;
		СтрокаТаблицы.Внутрисменное = Ложь;
		СтрокаТаблицы.ВЦеломЗаПериод = Истина;
		СтрокаТаблицы.Организация = Организация;
	КонецЦикла;	
	
	Для Каждого СтрокаТабличнойЧасти Из ДанныеОВремениДетально Цикл
		Для НомерДня = 1 По ЗарплатаКадрыКлиентСервер.КоличествоДнейМесяца(Период) Цикл
			Если СтрокаТабличнойЧасти["Часов" + НомерДня] > 0 Тогда
				СтрокаТаблицы = ТаблицаДанных.Добавить();
				СтрокаТаблицы.Дата = Дата(Год(Период), Месяц(Период), НомерДня);
				СтрокаТаблицы.Сотрудник = СтрокаТабличнойЧасти.Сотрудник;
				СтрокаТаблицы.ВидВремени = СтрокаТабличнойЧасти.ВидВремени;
				СтрокаТаблицы.Дней = 1;
				СтрокаТаблицы.Часов = СтрокаТабличнойЧасти["Часов" + НомерДня];
				СтрокаТаблицы.План = Ложь;
				СтрокаТаблицы.Внутрисменное = Ложь;
				СтрокаТаблицы.ВЦеломЗаПериод = Ложь;
				СтрокаТаблицы.Организация = Организация;
			КонецЕсли;		
		КонецЦикла;	
	КонецЦикла;
	
	ВремяВводитсяЗаМесяц = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидДокумента, "ВремяВводитсяЗаМесяц");
	Если ВремяВводитсяЗаМесяц = Истина И ДанныеОВремениДетально.Количество() > 0 Тогда
		// Если определены детальные данные, то относимся к ним как к данным за весь месяц в целом, 
		// поэтому те даты, на которые не введено сведений добавляем выходные.
		// 1. Отбираем сотрудников.
		Сотрудники = ОбщегоНазначения.ВыгрузитьКолонку(ТаблицаДанных, "Сотрудник", Истина);
		Для Каждого Сотрудник Из Сотрудники Цикл
			// 2. Отбираем строки по сотруднику.
			СтрокиПоСотруднику = ТаблицаДанных.НайтиСтроки(Новый Структура("Сотрудник", Сотрудник));
			// 3. Выбираем даты, на которые по сотруднику определены данные.
			РазличныеДаты = ОбщегоНазначения.ВыгрузитьКолонку(СтрокиПоСотруднику, "Дата", Истина);
			// 4. Последовательно обходим все дни месяца и, в том случае, если на конкретную дату нет записи, добавляем выходной.
			Для НомерДня = 1 По ЗарплатаКадрыКлиентСервер.КоличествоДнейМесяца(Период) Цикл
				ДатаДня = Дата(Год(Период), Месяц(Период), НомерДня);
				Если РазличныеДаты.Найти(ДатаДня) <> Неопределено Тогда
					// Данные на эту дату определены.
					Продолжить;
				КонецЕсли;
				СтрокаТаблицы = ТаблицаДанных.Добавить();
				СтрокаТаблицы.Дата = ДатаДня;
				СтрокаТаблицы.Сотрудник = Сотрудник;
				СтрокаТаблицы.ВидВремени = ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.ВыходныеДни");
				СтрокаТаблицы.Дней = 1;
				СтрокаТаблицы.Часов = 0;
				СтрокаТаблицы.План = Ложь;
				СтрокаТаблицы.Внутрисменное = Ложь;
				СтрокаТаблицы.ВЦеломЗаПериод = Ложь;
				СтрокаТаблицы.Организация = Организация;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	
	Возврат ТаблицаДанных;
	
КонецФункции	

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

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

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

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

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