Способы округления (для расчета зарплаты) / Модуль менеджера

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

#Область СлужебныйПрограммныйИнтерфейс

// Для методов служебного API использование не контролируем          
// АПК:581-выкл 
// АПК:299-выкл

Функция ПоУмолчанию() Экспорт
	
	ОписаниеСпособаДоКопейки = ОписаниеСпособаДоКопейки();
	
	Возврат СпособОкругленияПоОписанию(ОписаниеСпособаДоКопейки, Истина);
	
КонецФункции	

Функция СпособОкругленияДоРубляВБольшуюСторону() Экспорт
	
	ОписаниеСпособаДоРубляВБольшуюСторону = ОписаниеСпособаДоРубляВБольшуюСторону();
	
	Возврат СпособОкругленияПоОписанию(ОписаниеСпособаДоРубляВБольшуюСторону);
	
КонецФункции	

Функция ОписаниеСпособаОкругления(СпособОкругления) Экспорт
	СпособыОкругления = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СпособОкругления);
	ОписаниеСпособовОкругления = ОписаниеСпособовОкругления(СпособыОкругления);
	Возврат ОписаниеСпособовОкругления.Получить(СпособОкругления);
КонецФункции

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

// АПК:299-вкл
// АПК:581-вкл

//////////////////////////////////////////////////////////////////
/// Первоначальное заполнение и обновление информационной базы.

Процедура НачальноеЗаполнение() Экспорт

	СоздаватьНесуществующийЭлемент = Истина;
	
	СпособОкругленияПоОписанию(ОписаниеСпособаБезОкругления(),          СоздаватьНесуществующийЭлемент);
	СпособОкругленияПоОписанию(ОписаниеСпособаДоКопейки(),              СоздаватьНесуществующийЭлемент);
	СпособОкругленияПоОписанию(ОписаниеСпособаДоРубляВБольшуюСторону(), СоздаватьНесуществующийЭлемент);
	СпособОкругленияПоОписанию(ОписаниеСпособаДоРубля(),                СоздаватьНесуществующийЭлемент);	
	СпособОкругленияПоОписанию(ОписаниеСпособаДоДесятиРублей(),         СоздаватьНесуществующийЭлемент);
	СпособОкругленияПоОписанию(ОписаниеСпособаДоСтаРублей(),            СоздаватьНесуществующийЭлемент);
	
КонецПроцедуры

Процедура ПереименоватьСуществующийСпособОкругленияБезОкругления(ПараметрыОбновления = Неопределено) Экспорт

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

Процедура СоздатьНовыйСпособОкругленияБезОкругления(ПараметрыОбновления = Неопределено) Экспорт

	СпособОкругления = СпособОкругленияПоОписанию(ОписаниеСпособаБезОкругления(), Истина);
	ОбновлениеИнформационнойБазыЗарплатаКадрыБазовый.УстановитьПараметрОбновления(ПараметрыОбновления, "ОбработкаЗавершена", Истина);
	
КонецПроцедуры

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

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

Функция ПустоеОписаниеСпособаОкругления()
	
	ПоляСтруктуры = ПоляСтруктурыОписанияСпособаОкругления();
	
	ПустоеОписание = Новый Структура(ПоляСтруктуры);
	
	ПустоеОписание.Наименование 		= "";
	ПустоеОписание.Точность 			= 0;
	ПустоеОписание.ПравилоОкругления 	= Перечисления.ПравилаОкругленияПриРасчетеЗарплаты.Авто;
	
	Возврат ПустоеОписание;
	
КонецФункции

Функция ПоляСтруктурыОписанияСпособаОкругления()
	Возврат "Наименование, Точность, ПравилоОкругления";
КонецФункции

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

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

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

Функция НаименованиеНовогоСпособаОкругления(ОписаниеСпособаОкругления)
	
	НаименованиеНового = ОписаниеСпособаОкругления.Наименование;
	
	Если НЕ ЗначениеЗаполнено(НаименованиеНового) Тогда
	    НаименованиеНового = СтрШаблон(
			"%1 (%2)", 
			ОписаниеСпособаОкругления.ПравилоОкругления, 
			ОписаниеСпособаОкругления.Точность); 
	КонецЕсли;
	
	Возврат НаименованиеНового;	
	
КонецФункции 


#Область ОписанияСпособовОкругления

Функция ОписаниеСпособаБезОкругления()
	
	ОписаниеСпособа = ПустоеОписаниеСпособаОкругления();
	
	ОписаниеСпособа.Наименование = НСтр("ru = 'Без округления'");
	
	Возврат ОписаниеСпособа;
	
КонецФункции

Функция ОписаниеСпособаДоКопейки()
	
	ОписаниеСпособа = ПустоеОписаниеСпособаОкругления();
	
	ОписаниеСпособа.Наименование 		= НСтр("ru = 'Округление до копейки'");
	ОписаниеСпособа.Точность 			= 0.01;
	
	Возврат ОписаниеСпособа;
	
КонецФункции

Функция ОписаниеСпособаДоРубляВБольшуюСторону()
	
	ОписаниеСпособа = ПустоеОписаниеСпособаОкругления();
	
	ОписаниеСпособа.Наименование 		= НСтр("ru = 'Округление до рубля в большую сторону'");
	ОписаниеСпособа.Точность 			= 1;
	ОписаниеСпособа.ПравилоОкругления 	= Перечисления.ПравилаОкругленияПриРасчетеЗарплаты.ВБольшуюСторону;
	
	Возврат ОписаниеСпособа;
	
КонецФункции

Функция ОписаниеСпособаДоРубля()
	
	ОписаниеСпособа = ПустоеОписаниеСпособаОкругления();
	
	ОписаниеСпособа.Наименование 		= НСтр("ru = 'Округление до рубля'");
	ОписаниеСпособа.Точность 			= 1;
	
	Возврат ОписаниеСпособа;
	
КонецФункции

Функция ОписаниеСпособаДоДесятиРублей()
	
	ОписаниеСпособа = ПустоеОписаниеСпособаОкругления();
	
	ОписаниеСпособа.Наименование 		= НСтр("ru = 'Округление до десяти рублей'");
	ОписаниеСпособа.Точность 			= 10;
	
	Возврат ОписаниеСпособа;
	
КонецФункции

Функция ОписаниеСпособаДоСтаРублей()
	
	ОписаниеСпособа = ПустоеОписаниеСпособаОкругления();
	
	ОписаниеСпособа.Наименование 		= НСтр("ru = 'Округление до ста рублей'");
	ОписаниеСпособа.Точность 			= 100;
	
	Возврат ОписаниеСпособа;
	
КонецФункции
	
#КонецОбласти 

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

#КонецЕсли

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