Выбор документов-оснований ведомостей на выплату зарплаты / Модуль

файл

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

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

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

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

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

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

&НаКлиенте
Процедура ПериодРегистрацииАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
	ЗарплатаКадрыКлиент.ВводМесяцаАвтоПодборТекста(Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормы

&НаКлиенте
Процедура СписокДокументовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ОткрытьДокумент(Элемент.ТекущиеДанные.Значение)
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура ЗакрытьВыполнить(Команда)
	
	Закрыть();
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВыполнить(Команда)
	ТекущиеДанные = Элементы.СписокДокументов.ТекущиеДанные;
	Если Элементы.СписокДокументов.ТекущиеДанные <> Неопределено Тогда
		ОткрытьДокумент(ТекущиеДанные.Значение)
	КонецЕсли	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьВыполнить(Команда)
	ЗаполнитьСписокДокументов();
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьЗаголовок()
	
	Заголовок = 
		СтрШаблон(
			НСтр("ru = '%1 для выплаты по ведомости'"),
			Перечисления.ВидыДокументовОснованийВедомостейНаВыплатуЗарплаты.ПредставлениеСпискаДокумента(
				ВидДокумента,
				ПорядокВыплаты <> Перечисления.ХарактерВыплатыЗарплаты.Зарплата));
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОткрытьДокумент(Ссылка)
	ПоказатьЗначение(, Ссылка);
КонецПроцедуры

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

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