#Область ОписаниеПеременных
&НаКлиенте
Перем АктивизированнаяСтрока;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПредставлениеИнтервалаПоНижнейГранице(Объект.Шкала);
УстановитьДоступностьОграничения(Объект.Шкала);
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ПредставлениеИнтервалаПоНижнейГранице(Объект.Шкала);
ЗаполнитьСуммуПриПроцентеСПревышения();
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Для каждого СтрокаШкалы Из Объект.Шкала Цикл
Если СтрокаШкалы.ОграничениеМинимальнойСуммы И СтрокаШкалы.МинимальнаяСумма = 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;
КонецФункции
#КонецОбласти