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