Тарифы платежных агентов / Форма элемента / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем АктивизированнаяСтрока;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ПредставлениеИнтервалаПоНижнейГранице(Объект.Шкала);
	
	УстановитьДоступностьОграничения(Объект.Шкала);
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// СтандартныеПодсистемы.Свойства
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
	УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	ПредставлениеИнтервалаПоНижнейГранице(Объект.Шкала);
	
	ЗаполнитьСуммуПриПроцентеСПревышения();
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	
	ПредставлениеИнтервалаПоНижнейГранице(Объект.Шкала);
	
	УстановитьДоступностьОграничения(Объект.Шкала);
	
	ЗаполнитьСуммуПриПроцентеСПревышения();
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	// СтандартныеПодсистемы.Свойства
	УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ШкалаПриАктивизацииСтроки(Элемент)
	
	АктивизированнаяСтрока = Элементы.Шкала.ТекущиеДанные;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ШкалаПослеУдаления(Элемент)
	
	ПредставлениеИнтервалаПоНижнейГранице(Объект.Шкала);
	
	Если АктивизированнаяСтрока <> Неопределено Тогда
		ИндексСледующей = Объект.Шкала.Индекс(АктивизированнаяСтрока);
		Объект.Шкала[ИндексСледующей].Сумма = СуммаПоСуммеПриПроцентеСПревышения(Объект.Шкала, Объект.Шкала[ИндексСледующей]);
		Объект.Шкала[ИндексСледующей].СуммаПриПроцентеСПревышения = СуммаПриПроцентеСПревышенияПоСумме(Объект.Шкала, Объект.Шкала[ИндексСледующей]);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ШкалаПорогПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.Шкала.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьПозициюЭлементаВКоллекции(Объект.Шкала, ТекущиеДанные);
	ПредставлениеИнтервалаПоНижнейГранице(Объект.Шкала);
	
	// Пересчитываем сумму при проценте с превышения в следующей строке (если она есть).
	ИндексСледующей = Объект.Шкала.Индекс(АктивизированнаяСтрока) + 1;
	Если ИндексСледующей >= Объект.Шкала.Количество() Тогда
		Возврат;
	КонецЕсли;
	
	Если Объект.СпособВводаСуммы = 1 Тогда
		// Сумма вводится как при проценте с превышения.
		Объект.Шкала[ИндексСледующей].Сумма = СуммаПоСуммеПриПроцентеСПревышения(Объект.Шкала, Объект.Шкала[ИндексСледующей]);
	Иначе
		// сумма вводится как есть
		Объект.Шкала[ИндексСледующей].СуммаПриПроцентеСПревышения = СуммаПриПроцентеСПревышенияПоСумме(Объект.Шкала, Объект.Шкала[ИндексСледующей]);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ШкалаПроцентПриИзменении(Элемент)
	
	Если Объект.СпособВводаСуммы = 1 Тогда
		// Сумма вводится как при проценте с превышения.
		АктивизированнаяСтрока.Сумма = СуммаПоСуммеПриПроцентеСПревышения(Объект.Шкала, АктивизированнаяСтрока);
	Иначе
		// Сумма вводится как есть
		// пересчитываем сумму при проценте с превышения в следующей строке (если она есть).
		ИндексСледующей = Объект.Шкала.Индекс(АктивизированнаяСтрока) + 1;
		Если ИндексСледующей < Объект.Шкала.Количество() Тогда
			Объект.Шкала[ИндексСледующей].СуммаПриПроцентеСПревышения = СуммаПриПроцентеСПревышенияПоСумме(Объект.Шкала, Объект.Шкала[ИндексСледующей]);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ШкалаСуммаПриИзменении(Элемент)
	
	АктивизированнаяСтрока.СуммаПриПроцентеСПревышения = СуммаПриПроцентеСПревышенияПоСумме(Объект.Шкала, АктивизированнаяСтрока);
	
КонецПроцедуры

&НаКлиенте
Процедура ШкалаСуммаПриПроцентеСПревышенияПриИзменении(Элемент)
	
	АктивизированнаяСтрока.Сумма = СуммаПоСуммеПриПроцентеСПревышения(Объект.Шкала, АктивизированнаяСтрока);
	
КонецПроцедуры

&НаКлиенте
Процедура ШкалаОграничениеМинимальнойСуммыПриИзменении(Элемент)
	
	Если Не АктивизированнаяСтрока.ОграничениеМинимальнойСуммы Тогда
		АктивизированнаяСтрока.МинимальнаяСумма = 0;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ШкалаОграничениеМаксимальнойСуммыПриИзменении(Элемент)
	
	Если Не АктивизированнаяСтрока.ОграничениеМаксимальнойСуммы Тогда
		АктивизированнаяСтрока.МаксимальнаяСумма = 0;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

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

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

// СтандартныеПодсистемы.Свойства 
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства

&НаСервере
Процедура ЗаполнитьСуммуПриПроцентеСПревышения()
	
	// Если процент взимается не с полной суммы перевода, а с суммы превышения, 
	// то вводимая величина должна включать в себя процент от величины предыдущего порога.
	// Для такого ввода добавлена колонка в данных формы, вводимое значение конвертируется в хранимую величину.
	
	Индекс = 0;
	Пока Индекс < Объект.Шкала.Количество() Цикл
		Объект.Шкала[Индекс].СуммаПриПроцентеСПревышения = СуммаПриПроцентеСПревышенияПоСумме(Объект.Шкала, Объект.Шкала[Индекс]);
		Индекс = Индекс + 1;
	КонецЦикла;
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПозициюЭлементаВКоллекции(Коллекция, Элемент)
	
	ТекущаяПозиция = Элемент.НомерСтроки;
	НоваяПозиция = 0;
	КоличествоЭлементов = Коллекция.Количество();
	
	Если КоличествоЭлементов = 1 Тогда
		Возврат;
	КонецЕсли;
	
	Если Элемент.Порог = 0 Тогда
		НоваяПозиция = КоличествоЭлементов;
	Иначе
		Для каждого ЭлементКоллекции Из Коллекция Цикл
			Если ЭлементКоллекции.Порог = 0 ИЛИ ЭлементКоллекции.Порог > Элемент.Порог Тогда
				Прервать;
			КонецЕсли;
			НоваяПозиция = ЭлементКоллекции.НомерСтроки;
		КонецЦикла;
	КонецЕсли;
	Сдвиг = ?(НоваяПозиция >= ТекущаяПозиция, НоваяПозиция - ТекущаяПозиция, НоваяПозиция - ТекущаяПозиция + 1);
	Коллекция.Сдвинуть(Коллекция.Индекс(Элемент), Сдвиг);
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Функция СуммаПриПроцентеСПревышенияПоСумме(Шкала, ТекущаяСтрока)
	
	ИндексТекущей = Шкала.Индекс(ТекущаяСтрока);
	Если ИндексТекущей = 0 Тогда
		Возврат ТекущаяСтрока.Сумма;
	КонецЕсли;
	
	ПредыдущаяСтрока = Шкала[ИндексТекущей - 1];
	
	Возврат ПредыдущаяСтрока.Порог * ПредыдущаяСтрока.Процент / 100 + ПредыдущаяСтрока.Сумма;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СуммаПоСуммеПриПроцентеСПревышения(Шкала, ТекущаяСтрока)
	
	ИндексТекущей = Шкала.Индекс(ТекущаяСтрока);
	Если ИндексТекущей = 0 Тогда
		Возврат ТекущаяСтрока.СуммаПриПроцентеСПревышения;
	КонецЕсли;
	
	ПредыдущаяСтрока = Шкала[ИндексТекущей - 1];
	
	Возврат ТекущаяСтрока.СуммаПриПроцентеСПревышения - ПредыдущаяСтрока.Порог * ТекущаяСтрока.Процент / 100;
	
КонецФункции

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

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