Виды цен (Колонки прайс-листа) / Конструктор психологического округления / Модуль формы

файл

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

	Если Параметры.Свойство("ТочностьОкругления") Тогда
		ТочностьОкругления = Параметры.ТочностьОкругления;
	КонецЕсли;
	
	Если Параметры.Свойство("ВариантОкругления") Тогда
		ВариантОкругления = Параметры.ВариантОкругления;
	КонецЕсли;
	
	Если Параметры.Свойство("ГраницаДиапазонаЦен") Тогда
		ГраницаДиапазонаЦен = Параметры.ГраницаДиапазонаЦен;
	Иначе 
		ГраницаДиапазонаЦен = -1;
	КонецЕсли;
	
	Если Параметры.Свойство("ПсихологическоеОкругление") Тогда
		ПсихологическоеОкругление = Параметры.ПсихологическоеОкругление;
		ИспользоватьПсихологическоеОкругление = Истина;
	КонецЕсли;
	
	Если Параметры.Свойство("ПримерЧисло") Тогда
		ПримерЧисло = Параметры.ПримерЧисло;
	Иначе
		ПримерЧисло = 1111.11;
	КонецЕсли;
	
	ПримерРезультат = РассчитатьПримерРезультат(ПримерЧисло, ТочностьОкругления, ВариантОкругления, ПсихологическоеОкругление);

	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

	НастроитьФорму();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОК(Команда)
	
	ВозвращаемоеЗначение = Новый Структура;
	ВозвращаемоеЗначение.Вставить("ПсихологическоеОкругление", ПсихологическоеОкругление);
	ВозвращаемоеЗначение.Вставить("ТочностьОкругления", ТочностьОкругления);
	ВозвращаемоеЗначение.Вставить("ВариантОкругления", ВариантОкругления);
	Закрыть(ВозвращаемоеЗначение);
	
КонецПроцедуры

&НаКлиенте
Процедура СформироватьПример(Команда)
	
	ПримерРезультат = РассчитатьПримерРезультат(ПримерЧисло, ТочностьОкругления, ВариантОкругления, ПсихологическоеОкругление);
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПримерЧислоПриИзменении(Элемент)
	
	ПримерРезультат = РассчитатьПримерРезультат(ПримерЧисло, ТочностьОкругления, ВариантОкругления, ПсихологическоеОкругление);
	
КонецПроцедуры

&НаКлиенте
Процедура ТочностьОкругленияПриИзменении(Элемент)
	ОбновитьОкругление();
	Если ПсихологическоеОкругление > ТочностьОкругления Тогда
		ПсихологическоеОкругление = ТочностьОкругления - 0.01;
	КонецЕсли;
	Элементы.ПсихологическоеОкругление.МаксимальноеЗначение = ТочностьОкругления - 0.01;
КонецПроцедуры

&НаКлиенте
Процедура ВариантОкругленияПриИзменении(Элемент)
	ОбновитьОкругление();
КонецПроцедуры

&НаКлиенте
Процедура ПсихологическоеОкруглениеПриИзменении(Элемент)
	ОбновитьОкругление();
КонецПроцедуры

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

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

// Формирует пример округления
//
//
// Параметры:
//	ПримерЧисло               - Число - число, используемое в качестве примера
//	ТочностьОкругления        - Число - точность округления числа
//	ВариантОкругления         - ПеречислениеСсылка.ВариантыОкругления
//	ПсихологическоеОкругление - Число  - число, определяющее применение антиокругления.
//
// Возвращаемое значение:
//	СправочникСсылка.ВидыЦен - Найденный вид цен.
//
&НаКлиентеНаСервереБезКонтекста
Функция РассчитатьПримерРезультат(Знач ПримерЧисло,
	                              Знач ТочностьОкругления,
	                              Знач ВариантОкругления,
	                              Знач ПсихологическоеОкругление)
	
	Если ЗначениеЗаполнено(ТочностьОкругления) Тогда
		ПримерЧисло = ЦенообразованиеКлиентСервер.ОкруглитьЦену(ПримерЧисло, ТочностьОкругления, ВариантОкругления);
	КонецЕсли;
	
	Возврат ЦенообразованиеКлиентСервер.ПрименитьПсихологическоеОкругление(ПримерЧисло, ПсихологическоеОкругление);
	
КонецФункции

// Обновляет значение психологического округления и вычисляет пример
//
&НаКлиенте
Процедура ОбновитьОкругление()
	
	ПримерРезультат = РассчитатьПримерРезультат(ПримерЧисло, ТочностьОкругления, ВариантОкругления, ПсихологическоеОкругление);
	
КонецПроцедуры

&НаСервере
Процедура НастроитьФорму()
	
	НастроитьДоступностьЭлементовФормы(ЭтаФорма);
	
	// Формирование списка выбора для поля ПравилаОкругленияЦеныТочностьОкругления
	Элементы.ТочностьОкругления.СписокВыбора.Очистить();
	ЗначениеОкругления             = 0.01;
	ЧетноеПриращение               = Ложь;
	МаксимальноеЗначениеОкругления = 1000;
	ГраницаДиапазонаЦен            = -1;
	
	Пока ЗначениеОкругления <= МаксимальноеЗначениеОкругления 
		И (ЗначениеОкругления <= ГраницаДиапазонаЦен Или ГраницаДиапазонаЦен < 0) Цикл
		
		Элементы.ТочностьОкругления.СписокВыбора.Добавить(ЗначениеОкругления);
		ЗначениеОкругления = ЗначениеОкругления * ?(ЧетноеПриращение, 2, 5);
		ЧетноеПриращение   = Не ЧетноеПриращение;
		
	КонецЦикла;
	
КонецПроцедуры


&НаКлиентеНаСервереБезКонтекста
Процедура НастроитьДоступностьЭлементовФормы(Форма)
	
	Форма.Элементы.ПсихологическоеОкругление.Видимость = Форма.ИспользоватьПсихологическоеОкругление;

КонецПроцедуры

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

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