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

файл

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	УстановитьВидимостьКолонокТаблицыВедомости()
КонецПроцедуры

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

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

&НаКлиенте
Процедура РасчетныйДокументПриИзменении(Элемент)
	Если ЗначениеЗаполнено(РасчетныйДокумент) Тогда
		РасчетныйДокументПриИзмененииНаСервере()	
	КонецЕсли	
КонецПроцедуры

&НаКлиенте
Процедура СпособВыплатыПриИзменении(Элемент)
	СоздатьВедомости()
КонецПроцедуры

&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	СоздатьВедомости();
КонецПроцедуры

&НаКлиенте
Процедура ВРазрезеПодразделенийПриИзменении(Элемент)
	СоздатьВедомости()
КонецПроцедуры

&НаКлиенте
Процедура ВРазрезеИсточниковПриИзменении(Элемент)
	СоздатьВедомости()
КонецПроцедуры

&НаКлиенте
Процедура ВРазрезеСпособовРасчетовПриИзменении(Элемент)
	СоздатьВедомости()
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВедомостиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ОткрытьТекущуюВедомость();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОбновитьВедомости(Команда)
	СоздатьВедомости(Истина)
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВедомость(Команда)
	ОткрытьТекущуюВедомость();
КонецПроцедуры

&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
	
	ОчиститьСообщения();
	
	Если ПровестиИЗакрытьНаСервере() Тогда
		Закрыть();
	КонецЕсли;	
	
КонецПроцедуры

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

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

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

&НаСервере
Функция КлючОбъектаХранилища()
	Возврат "СозданиеВедомостейНаВыплатуЗарплаты"
КонецФункции

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

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

&НаСервере
Процедура РасчетныйДокументПриИзмененииНаСервере()
	
	Если НастроитьПоРасчетномуДокументу() Тогда
		СоздатьВедомостиНаСервере();
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьВедомости(СообщитьПользователю = Ложь)
	ОчиститьСообщения();
	СоздатьВедомостиНаСервере(СообщитьПользователю);
	УстановитьВидимостьКолонокТаблицыВедомости()
КонецПроцедуры

&НаСервере
Процедура СоздатьВедомостиНаСервере(СообщитьПользователю = Ложь)
	
	ПравилаПроверки = Новый СписокЗначений;
	ПравилаПроверки.Добавить("РасчетныйДокумент", НСтр("ru='Не выбран документ'"));
	ПравилаПроверки.Добавить("СпособВыплаты",     НСтр("ru='Не указан способ выплаты'"));
	ПравилаПроверки.Добавить("ДатаВыплаты",       НСтр("ru='Не задана дата выплаты'"));

	МожноСоздатьВедомости = ЗарплатаКадры.СвойстваФормыЗаполнены(ЭтотОбъект, ПравилаПроверки, СообщитьПользователю);

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

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

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

&НаКлиенте
Процедура ОткрытьТекущуюВедомость()
	
	ТекущиеДанные = Элементы.Ведомости.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено Тогда
		ПараметрыФормы = Новый Структура("АдресВоВременномХранилище", ТекущиеДанные.Адрес);
		ОткрытьФорму("Обработка.СозданиеВедомостейНаВыплатуЗарплаты.Форма.Ведомость", ПараметрыФормы, ЭтаФорма);
	КонецЕсли	
	
КонецПроцедуры

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

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

&НаСервере
Процедура ОбработатьСообщенияПользователю()
	
	Сообщения = ПолучитьСообщенияПользователю(Ложь);
	
	Для Каждого Сообщение Из Сообщения Цикл
		СтрокиВедомости = Ведомости.НайтиСтроки(Новый Структура("Ссылка", Сообщение.КлючДанных));
		Если СтрокиВедомости.Количество() > 0 Тогда
			Строка = СтрокиВедомости[0];
			Сообщение.КлючДанных = Неопределено;
			Сообщение.Поле = СтрШаблон("Ведомости[%1].Тип", Ведомости.Индекс(Строка));
		КонецЕсли	
	КонецЦикла;
	
КонецПроцедуры

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

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